From c49655b2a48eca2ab751b853a9a4692f322cafa2 Mon Sep 17 00:00:00 2001 From: Bowgo Tsai Date: Fri, 17 May 2019 15:40:18 +0800 Subject: [PATCH 001/388] Moving /odm/build.prop to /odm/etc/buid.prop In device root directory, we have the following symlinks: - /odm/app -> /vendor/odm/app - /odm/bin -> /vendor/odm/bin - /odm/etc -> /vendor/odm/etc ... This allows the Generic System Image (GSI) to be used on both devices: 1) Has a physical odm partition, where those symlink will be hidden when /odm is used as the mount point 2) Has no physical odm partition and fallback to /vendor/odm/. We can't just have the symlink /odm -> /vendor/odm, because the former devices won't have /vendor/odm directory, which leads to mount failure when the mount point /odm is resolved to /vendor/odm. The existing /vendor/odm/build.prop won't be loaded in the latter devices, because there is no symlink - /odm/build.prop -> /vendor/odm/build.prop. Note that init blocks reading through direct symlinks (O_NOFOLLOW) so the above symlink won't work either. This CL moves the odm build.prop to /odm/etc/build.prop for init to load it (symlinks in earlier components of the path will still be followed by O_NOFOLLOW). Bug: 132128501 Test: boot a device and checks /odm/etc/build.prop is loaded Change-Id: I0733c277baa67c549bb45599abb70aba13fbdbcf --- init/property_service.cpp | 8 ++++++-- libcutils/fs_config.cpp | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/init/property_service.cpp b/init/property_service.cpp index a1e955129..14e83f2b7 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -885,8 +885,12 @@ void property_load_boot_defaults(bool load_debug_prop) { load_properties_from_file("/system/build.prop", nullptr, &properties); load_properties_from_file("/vendor/default.prop", nullptr, &properties); load_properties_from_file("/vendor/build.prop", nullptr, &properties); - load_properties_from_file("/odm/default.prop", nullptr, &properties); - load_properties_from_file("/odm/build.prop", nullptr, &properties); + if (SelinuxGetVendorAndroidVersion() >= __ANDROID_API_Q__) { + load_properties_from_file("/odm/etc/build.prop", nullptr, &properties); + } else { + load_properties_from_file("/odm/default.prop", nullptr, &properties); + load_properties_from_file("/odm/build.prop", nullptr, &properties); + } load_properties_from_file("/product/build.prop", nullptr, &properties); load_properties_from_file("/product_services/build.prop", nullptr, &properties); load_properties_from_file("/factory/factory.prop", "ro.*", &properties); diff --git a/libcutils/fs_config.cpp b/libcutils/fs_config.cpp index 494a06f53..660603062 100644 --- a/libcutils/fs_config.cpp +++ b/libcutils/fs_config.cpp @@ -158,8 +158,9 @@ static const struct fs_path_config android_files[] = { { 00750, AID_ROOT, AID_SHELL, 0, "data/nativetest64/*" }, { 00600, AID_ROOT, AID_ROOT, 0, "default.prop" }, // legacy { 00600, AID_ROOT, AID_ROOT, 0, "system/etc/prop.default" }, - { 00600, AID_ROOT, AID_ROOT, 0, "odm/build.prop" }, - { 00600, AID_ROOT, AID_ROOT, 0, "odm/default.prop" }, + { 00600, AID_ROOT, AID_ROOT, 0, "odm/build.prop" }, // legacy; only for P release + { 00600, AID_ROOT, AID_ROOT, 0, "odm/default.prop" }, // legacy; only for P release + { 00600, AID_ROOT, AID_ROOT, 0, "odm/etc/build.prop" }, { 00444, AID_ROOT, AID_ROOT, 0, odm_conf_dir + 1 }, { 00444, AID_ROOT, AID_ROOT, 0, odm_conf_file + 1 }, { 00444, AID_ROOT, AID_ROOT, 0, oem_conf_dir + 1 }, From f93088ba2bcc77ebbc01924721467455db7a0496 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Fri, 10 May 2019 21:12:15 +0900 Subject: [PATCH 002/388] Don't use apexd when TARGET_FLATTEN_APEX == true When TARGET_FLATTEN_APEX is true (= ro.apex.updatable is unset or set to false), apexd is not used to activate the built-in flattened APEXes. Init simply bind-mounts /system/apex to /apex. However, there is a special case here. The runtime APEX is installed as either /system/apex/com.android.runtime.debug or /system/apex/com.android.runtime.release, whereas it should be activated on /apex/com.android.runtime - without the .debug or .release suffix. To handle that case, the build system creates an empty directory /system/apex/com.android.runtime and the .debug or .release directory is bind-mounted to the empty directory by init at runtime. This change also fixes a minor bug that native watchdog is triggered for all post-apexd processes regardless of whether ro.apex.updatable is true or not. Since apexd is expected to shutdown itself when ro.apex .updatable is false, we don't trigger the watchdog in that case. Bug: 132413565 Bug: 133305381 Test: marlin and sdk_gphone are bootable Change-Id: I219465b8b81decb960e2c5f46bab6e0768b31317 --- init/mount_namespace.cpp | 34 ++++++++++++++++++++++++++++++++++ init/service.cpp | 10 +++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/init/mount_namespace.cpp b/init/mount_namespace.cpp index 5305dc7ef..12144c120 100644 --- a/init/mount_namespace.cpp +++ b/init/mount_namespace.cpp @@ -79,6 +79,38 @@ static bool IsApexUpdatable() { return updatable; } +static bool ActivateFlattenedApexesIfPossible() { + if (IsRecoveryMode() || IsApexUpdatable()) { + return true; + } + + constexpr const char kSystemApex[] = "/system/apex"; + constexpr const char kApexTop[] = "/apex"; + if (mount(kSystemApex, kApexTop, nullptr, MS_BIND, nullptr) != 0) { + PLOG(ERROR) << "Could not bind mount " << kSystemApex << " to " << kApexTop; + return false; + } + + // Special casing for the runtime APEX + constexpr const char kRuntimeApexMountPath[] = "/system/apex/com.android.runtime"; + static const std::vector kRuntimeApexDirNames = {"com.android.runtime.release", + "com.android.runtime.debug"}; + bool success = false; + for (const auto& name : kRuntimeApexDirNames) { + std::string path = std::string(kSystemApex) + "/" + name; + if (access(path.c_str(), F_OK) == 0) { + if (mount(path.c_str(), kRuntimeApexMountPath, nullptr, MS_BIND, nullptr) == 0) { + success = true; + break; + } + } + } + if (!success) { + PLOG(ERROR) << "Failed to bind mount the runtime APEX to " << kRuntimeApexMountPath; + } + return success; +} + static android::base::unique_fd bootstrap_ns_fd; static android::base::unique_fd default_ns_fd; @@ -129,6 +161,8 @@ bool SetupMountNamespaces() { default_ns_id = GetMountNamespaceId(); } + success &= ActivateFlattenedApexesIfPossible(); + LOG(INFO) << "SetupMountNamespaces done"; return success; } diff --git a/init/service.cpp b/init/service.cpp index 6887d7b2f..3e865a7bd 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -46,6 +46,7 @@ #include "util.h" #if defined(__ANDROID__) +#include #include #include @@ -372,10 +373,17 @@ void Service::Reap(const siginfo_t& siginfo) { return; } +#if defined(__ANDROID__) + static bool is_apex_updatable = android::sysprop::ApexProperties::updatable().value_or(false); +#else + static bool is_apex_updatable = false; +#endif + const bool is_process_updatable = !pre_apexd_ && is_apex_updatable; + // If we crash > 4 times in 4 minutes or before boot_completed, // reboot into bootloader or set crashing property boot_clock::time_point now = boot_clock::now(); - if (((flags_ & SVC_CRITICAL) || !pre_apexd_) && !(flags_ & SVC_RESTART)) { + if (((flags_ & SVC_CRITICAL) || is_process_updatable) && !(flags_ & SVC_RESTART)) { bool boot_completed = android::base::GetBoolProperty("sys.boot_completed", false); if (now < time_crashed_ + 4min || !boot_completed) { if (++crash_count_ > 4) { From e75fc185ecf3d0e3c72368c5fb7071b6728f7700 Mon Sep 17 00:00:00 2001 From: Janis Danisevskis Date: Wed, 5 Jun 2019 16:42:12 -0700 Subject: [PATCH 003/388] Fix a memory leak in gatekeeper. In violation to the documentation of GateKeeper::GetAuthTokenKey and GateKeeper::GetPasswordKey, the implementations in SoftGateKeeper allocate and return buffers and relinquish ownership causing a memory leak, because the caller expects the implementation to retain ownership. Bug: 129768470 Bug: 134557251 Test: gatekeeper-unit-tests Change-Id: I0af9539d3dcd47dfd1e7d80cdee700ea0c2d6d0f --- gatekeeperd/SoftGateKeeper.h | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/gatekeeperd/SoftGateKeeper.h b/gatekeeperd/SoftGateKeeper.h index 2f4f4d7e6..5c03dcf1b 100644 --- a/gatekeeperd/SoftGateKeeper.h +++ b/gatekeeperd/SoftGateKeeper.h @@ -58,23 +58,16 @@ public: virtual ~SoftGateKeeper() { } - virtual bool GetAuthTokenKey(const uint8_t **auth_token_key, - uint32_t *length) const { + virtual bool GetAuthTokenKey(const uint8_t** auth_token_key, uint32_t* length) const { if (auth_token_key == NULL || length == NULL) return false; - uint8_t *auth_token_key_copy = new uint8_t[SIGNATURE_LENGTH_BYTES]; - memcpy(auth_token_key_copy, key_.get(), SIGNATURE_LENGTH_BYTES); - - *auth_token_key = auth_token_key_copy; + *auth_token_key = key_.get(); *length = SIGNATURE_LENGTH_BYTES; return true; } - virtual void GetPasswordKey(const uint8_t **password_key, uint32_t *length) { + virtual void GetPasswordKey(const uint8_t** password_key, uint32_t* length) { if (password_key == NULL || length == NULL) return; - uint8_t *password_key_copy = new uint8_t[SIGNATURE_LENGTH_BYTES]; - memcpy(password_key_copy, key_.get(), SIGNATURE_LENGTH_BYTES); - - *password_key = password_key_copy; + *password_key = key_.get(); *length = SIGNATURE_LENGTH_BYTES; } From 9e282fec8073ca9a7e30bbcbe94ba3b9b01f28da Mon Sep 17 00:00:00 2001 From: Matthew Maurer Date: Wed, 12 Jun 2019 14:32:43 -0700 Subject: [PATCH 004/388] Add mmaurer@ to OWNERS (trusty-team member) Change-Id: Ibb441b69a5f4dcbe315fa824a548772051bbc3c4 --- trusty/OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/trusty/OWNERS b/trusty/OWNERS index e807d711f..6363865ee 100644 --- a/trusty/OWNERS +++ b/trusty/OWNERS @@ -2,6 +2,7 @@ arve@google.com dkrahn@google.com drewry@google.com gmar@google.com +mmaurer@google.com ncbray@google.com rpere@google.com swillden@google.com From 6022d59c03cf126209c125529fc9ff4a9f99067b Mon Sep 17 00:00:00 2001 From: Janis Danisevskis Date: Fri, 29 Mar 2019 11:14:31 -0700 Subject: [PATCH 005/388] Gatekeeperd maintenance * Move gatekeeper aidl definition to system/core/gatekeeperd * Retire hand written IGateKeeperService and use generated instead * Adjust gatekeeperd to use the generated aidl stubs. * Annotated enroll parameters with @nullable to match the documentation and the way it was used. (The hand written code was tolerant to null parameters, but it was undefined behavior.) * Removed Software implementation from gatekeeperd. * Also removed the upgrade path. * Software implementation including test moved to hardware/interfaces/gatekeeper/1.0/software Change-Id: I72b734db6f67b79b29c2629764490d75d179908a Test: Manually tested setting pin and login. --- gatekeeperd/Android.bp | 37 +- gatekeeperd/GateKeeperResponse.cpp | 83 +++++ gatekeeperd/IGateKeeperService.cpp | 173 ---------- gatekeeperd/IGateKeeperService.h | 118 ------- gatekeeperd/SoftGateKeeper.h | 175 ---------- gatekeeperd/SoftGateKeeperDevice.cpp | 110 ------ gatekeeperd/SoftGateKeeperDevice.h | 76 ----- .../gatekeeper/GateKeeperResponse.aidl | 24 ++ .../gatekeeper/IGateKeeperService.aidl | 87 +++++ gatekeeperd/gatekeeperd.cpp | 315 ++++++++---------- .../include/gatekeeper/GateKeeperResponse.h | 85 +++++ gatekeeperd/tests/Android.bp | 34 -- gatekeeperd/tests/gatekeeper_test.cpp | 204 ------------ 13 files changed, 454 insertions(+), 1067 deletions(-) create mode 100644 gatekeeperd/GateKeeperResponse.cpp delete mode 100644 gatekeeperd/IGateKeeperService.cpp delete mode 100644 gatekeeperd/IGateKeeperService.h delete mode 100644 gatekeeperd/SoftGateKeeper.h delete mode 100644 gatekeeperd/SoftGateKeeperDevice.cpp delete mode 100644 gatekeeperd/SoftGateKeeperDevice.h create mode 100644 gatekeeperd/binder/android/service/gatekeeper/GateKeeperResponse.aidl create mode 100644 gatekeeperd/binder/android/service/gatekeeper/IGateKeeperService.aidl create mode 100644 gatekeeperd/include/gatekeeper/GateKeeperResponse.h delete mode 100644 gatekeeperd/tests/Android.bp delete mode 100644 gatekeeperd/tests/gatekeeper_test.cpp diff --git a/gatekeeperd/Android.bp b/gatekeeperd/Android.bp index 2b7db79c3..778e08c99 100644 --- a/gatekeeperd/Android.bp +++ b/gatekeeperd/Android.bp @@ -23,8 +23,6 @@ cc_binary { "-Wunused", ], srcs: [ - "SoftGateKeeperDevice.cpp", - "IGateKeeperService.cpp", "gatekeeperd.cpp", ], @@ -43,9 +41,44 @@ cc_binary { "libhidltransport", "libhwbinder", "android.hardware.gatekeeper@1.0", + "libgatekeeper_aidl", ], static_libs: ["libscrypt_static"], include_dirs: ["external/scrypt/lib/crypto"], init_rc: ["gatekeeperd.rc"], } + +filegroup { + name: "gatekeeper_aidl", + srcs: [ + "binder/android/service/gatekeeper/IGateKeeperService.aidl", + ], + path: "binder", +} + +cc_library_shared { + name: "libgatekeeper_aidl", + srcs: [ + ":gatekeeper_aidl", + "GateKeeperResponse.cpp", + ], + aidl: { + export_aidl_headers: true, + include_dirs: [ + "system/core/gatekeeperd/binder", + "frameworks/base/core/java/", + ], + }, + export_include_dirs: ["include"], + shared_libs: [ + "libbase", + "libbinder", + "libcutils", + "liblog", + "libutils", + ], + export_shared_lib_headers: [ + "libbinder", + ], +} diff --git a/gatekeeperd/GateKeeperResponse.cpp b/gatekeeperd/GateKeeperResponse.cpp new file mode 100644 index 000000000..ca0c98fe5 --- /dev/null +++ b/gatekeeperd/GateKeeperResponse.cpp @@ -0,0 +1,83 @@ +/* +** +** Copyright 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 "gatekeeperd" + +#include + +#include + +#include + +namespace android { +namespace service { +namespace gatekeeper { + +status_t GateKeeperResponse::readFromParcel(const Parcel* in) { + if (in == nullptr) { + LOG(ERROR) << "readFromParcel got null in parameter"; + return BAD_VALUE; + } + timeout_ = 0; + should_reenroll_ = false; + payload_ = {}; + response_code_ = ResponseCode(in->readInt32()); + if (response_code_ == ResponseCode::OK) { + should_reenroll_ = in->readInt32(); + ssize_t length = in->readInt32(); + if (length > 0) { + length = in->readInt32(); + const uint8_t* buf = reinterpret_cast(in->readInplace(length)); + if (buf == nullptr) { + LOG(ERROR) << "readInplace returned null buffer for length " << length; + return BAD_VALUE; + } + payload_.resize(length); + std::copy(buf, buf + length, payload_.data()); + } + } else if (response_code_ == ResponseCode::RETRY) { + timeout_ = in->readInt32(); + } + return NO_ERROR; +} +status_t GateKeeperResponse::writeToParcel(Parcel* out) const { + if (out == nullptr) { + LOG(ERROR) << "writeToParcel got null out parameter"; + return BAD_VALUE; + } + out->writeInt32(int32_t(response_code_)); + if (response_code_ == ResponseCode::OK) { + out->writeInt32(should_reenroll_); + out->writeInt32(payload_.size()); + if (payload_.size() != 0) { + out->writeInt32(payload_.size()); + uint8_t* buf = reinterpret_cast(out->writeInplace(payload_.size())); + if (buf == nullptr) { + LOG(ERROR) << "writeInplace returned null buffer for length " << payload_.size(); + return BAD_VALUE; + } + std::copy(payload_.begin(), payload_.end(), buf); + } + } else if (response_code_ == ResponseCode::RETRY) { + out->writeInt32(timeout_); + } + return NO_ERROR; +} + +} // namespace gatekeeper +} // namespace service +} // namespace android diff --git a/gatekeeperd/IGateKeeperService.cpp b/gatekeeperd/IGateKeeperService.cpp deleted file mode 100644 index 43d57088d..000000000 --- a/gatekeeperd/IGateKeeperService.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2015, 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 "GateKeeperService" -#include - -#include "IGateKeeperService.h" - -namespace android { - -const android::String16 IGateKeeperService::descriptor("android.service.gatekeeper.IGateKeeperService"); -const android::String16& IGateKeeperService::getInterfaceDescriptor() const { - return IGateKeeperService::descriptor; -} - -status_t BnGateKeeperService::onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { - switch(code) { - case ENROLL: { - CHECK_INTERFACE(IGateKeeperService, data, reply); - uint32_t uid = data.readInt32(); - - ssize_t currentPasswordHandleSize = data.readInt32(); - const uint8_t *currentPasswordHandle = - static_cast(data.readInplace(currentPasswordHandleSize)); - if (!currentPasswordHandle) currentPasswordHandleSize = 0; - - ssize_t currentPasswordSize = data.readInt32(); - const uint8_t *currentPassword = - static_cast(data.readInplace(currentPasswordSize)); - if (!currentPassword) currentPasswordSize = 0; - - ssize_t desiredPasswordSize = data.readInt32(); - const uint8_t *desiredPassword = - static_cast(data.readInplace(desiredPasswordSize)); - if (!desiredPassword) desiredPasswordSize = 0; - - uint8_t *out = NULL; - uint32_t outSize = 0; - int ret = enroll(uid, currentPasswordHandle, currentPasswordHandleSize, - currentPassword, currentPasswordSize, desiredPassword, - desiredPasswordSize, &out, &outSize); - - reply->writeNoException(); - reply->writeInt32(1); - if (ret == 0 && outSize > 0 && out != NULL) { - reply->writeInt32(GATEKEEPER_RESPONSE_OK); - reply->writeInt32(0); - reply->writeInt32(outSize); - reply->writeInt32(outSize); - void *buf = reply->writeInplace(outSize); - memcpy(buf, out, outSize); - delete[] out; - } else if (ret > 0) { - reply->writeInt32(GATEKEEPER_RESPONSE_RETRY); - reply->writeInt32(ret); - } else { - reply->writeInt32(GATEKEEPER_RESPONSE_ERROR); - } - return OK; - } - case VERIFY: { - CHECK_INTERFACE(IGateKeeperService, data, reply); - uint32_t uid = data.readInt32(); - ssize_t currentPasswordHandleSize = data.readInt32(); - const uint8_t *currentPasswordHandle = - static_cast(data.readInplace(currentPasswordHandleSize)); - if (!currentPasswordHandle) currentPasswordHandleSize = 0; - - ssize_t currentPasswordSize = data.readInt32(); - const uint8_t *currentPassword = - static_cast(data.readInplace(currentPasswordSize)); - if (!currentPassword) currentPasswordSize = 0; - - bool request_reenroll = false; - int ret = verify(uid, (uint8_t *) currentPasswordHandle, - currentPasswordHandleSize, (uint8_t *) currentPassword, currentPasswordSize, - &request_reenroll); - - reply->writeNoException(); - reply->writeInt32(1); - if (ret == 0) { - reply->writeInt32(GATEKEEPER_RESPONSE_OK); - reply->writeInt32(request_reenroll ? 1 : 0); - reply->writeInt32(0); // no payload returned from this call - } else if (ret > 0) { - reply->writeInt32(GATEKEEPER_RESPONSE_RETRY); - reply->writeInt32(ret); - } else { - reply->writeInt32(GATEKEEPER_RESPONSE_ERROR); - } - return OK; - } - case VERIFY_CHALLENGE: { - CHECK_INTERFACE(IGateKeeperService, data, reply); - uint32_t uid = data.readInt32(); - uint64_t challenge = data.readInt64(); - ssize_t currentPasswordHandleSize = data.readInt32(); - const uint8_t *currentPasswordHandle = - static_cast(data.readInplace(currentPasswordHandleSize)); - if (!currentPasswordHandle) currentPasswordHandleSize = 0; - - ssize_t currentPasswordSize = data.readInt32(); - const uint8_t *currentPassword = - static_cast(data.readInplace(currentPasswordSize)); - if (!currentPassword) currentPasswordSize = 0; - - - uint8_t *out = NULL; - uint32_t outSize = 0; - bool request_reenroll = false; - int ret = verifyChallenge(uid, challenge, (uint8_t *) currentPasswordHandle, - currentPasswordHandleSize, (uint8_t *) currentPassword, currentPasswordSize, - &out, &outSize, &request_reenroll); - reply->writeNoException(); - reply->writeInt32(1); - if (ret == 0 && outSize > 0 && out != NULL) { - reply->writeInt32(GATEKEEPER_RESPONSE_OK); - reply->writeInt32(request_reenroll ? 1 : 0); - reply->writeInt32(outSize); - reply->writeInt32(outSize); - void *buf = reply->writeInplace(outSize); - memcpy(buf, out, outSize); - delete[] out; - } else if (ret > 0) { - reply->writeInt32(GATEKEEPER_RESPONSE_RETRY); - reply->writeInt32(ret); - } else { - reply->writeInt32(GATEKEEPER_RESPONSE_ERROR); - } - return OK; - } - case GET_SECURE_USER_ID: { - CHECK_INTERFACE(IGateKeeperService, data, reply); - uint32_t uid = data.readInt32(); - uint64_t sid = getSecureUserId(uid); - reply->writeNoException(); - reply->writeInt64(sid); - return OK; - } - case CLEAR_SECURE_USER_ID: { - CHECK_INTERFACE(IGateKeeperService, data, reply); - uint32_t uid = data.readInt32(); - clearSecureUserId(uid); - reply->writeNoException(); - return OK; - } - case REPORT_DEVICE_SETUP_COMPLETE: { - CHECK_INTERFACE(IGateKeeperService, data, reply); - reportDeviceSetupComplete(); - reply->writeNoException(); - return OK; - } - default: - return BBinder::onTransact(code, data, reply, flags); - } -}; - - -}; // namespace android diff --git a/gatekeeperd/IGateKeeperService.h b/gatekeeperd/IGateKeeperService.h deleted file mode 100644 index 2816efc6a..000000000 --- a/gatekeeperd/IGateKeeperService.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2015 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 IGATEKEEPER_SERVICE_H_ -#define IGATEKEEPER_SERVICE_H_ - -#include -#include - -namespace android { - -/* - * This must be kept manually in sync with frameworks/base's IGateKeeperService.aidl - */ -class IGateKeeperService : public IInterface { -public: - enum { - ENROLL = IBinder::FIRST_CALL_TRANSACTION + 0, - VERIFY = IBinder::FIRST_CALL_TRANSACTION + 1, - VERIFY_CHALLENGE = IBinder::FIRST_CALL_TRANSACTION + 2, - GET_SECURE_USER_ID = IBinder::FIRST_CALL_TRANSACTION + 3, - CLEAR_SECURE_USER_ID = IBinder::FIRST_CALL_TRANSACTION + 4, - REPORT_DEVICE_SETUP_COMPLETE = IBinder::FIRST_CALL_TRANSACTION + 5, - }; - - enum { - GATEKEEPER_RESPONSE_OK = 0, - GATEKEEPER_RESPONSE_RETRY = 1, - GATEKEEPER_RESPONSE_ERROR = -1, - }; - - // DECLARE_META_INTERFACE - C++ client interface not needed - static const android::String16 descriptor; - virtual const android::String16& getInterfaceDescriptor() const; - IGateKeeperService() {} - virtual ~IGateKeeperService() {} - - /** - * Enrolls a password with the GateKeeper. Returns 0 on success, negative on failure. - * Returns: - * - 0 on success - * - A timestamp T > 0 if the call has failed due to throttling and should not - * be reattempted until T milliseconds have elapsed - * - -1 on failure - */ - virtual int enroll(uint32_t uid, - const uint8_t *current_password_handle, uint32_t current_password_handle_length, - const uint8_t *current_password, uint32_t current_password_length, - const uint8_t *desired_password, uint32_t desired_password_length, - uint8_t **enrolled_password_handle, uint32_t *enrolled_password_handle_length) = 0; - - /** - * Verifies a password previously enrolled with the GateKeeper. - * Returns: - * - 0 on success - * - A timestamp T > 0 if the call has failed due to throttling and should not - * be reattempted until T milliseconds have elapsed - * - -1 on failure - */ - virtual int verify(uint32_t uid, const uint8_t *enrolled_password_handle, - uint32_t enrolled_password_handle_length, - const uint8_t *provided_password, uint32_t provided_password_length, - bool *request_reenroll) = 0; - - /** - * Verifies a password previously enrolled with the GateKeeper. - * Returns: - * - 0 on success - * - A timestamp T > 0 if the call has failed due to throttling and should not - * be reattempted until T milliseconds have elapsed - * - -1 on failure - */ - virtual int verifyChallenge(uint32_t uid, uint64_t challenge, - const uint8_t *enrolled_password_handle, uint32_t enrolled_password_handle_length, - const uint8_t *provided_password, uint32_t provided_password_length, - uint8_t **auth_token, uint32_t *auth_token_length, bool *request_reenroll) = 0; - /** - * Returns the secure user ID for the provided android user - */ - virtual uint64_t getSecureUserId(uint32_t uid) = 0; - - /** - * Clears the secure user ID associated with the user. - */ - virtual void clearSecureUserId(uint32_t uid) = 0; - - /** - * Notifies gatekeeper that device setup has been completed and any potentially still existing - * state from before a factory reset can be cleaned up (if it has not been already). - */ - virtual void reportDeviceSetupComplete() = 0; -}; - -// ---------------------------------------------------------------------------- - -class BnGateKeeperService: public BnInterface { -public: - virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, - uint32_t flags = 0); -}; - -} // namespace android - -#endif - diff --git a/gatekeeperd/SoftGateKeeper.h b/gatekeeperd/SoftGateKeeper.h deleted file mode 100644 index 5c03dcf1b..000000000 --- a/gatekeeperd/SoftGateKeeper.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2015 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 SOFT_GATEKEEPER_H_ -#define SOFT_GATEKEEPER_H_ - -extern "C" { -#include -#include - -#include -} - -#include -#include - -#include -#include -#include - -namespace gatekeeper { - -struct fast_hash_t { - uint64_t salt; - uint8_t digest[SHA256_DIGEST_LENGTH]; -}; - -class SoftGateKeeper : public GateKeeper { -public: - static const uint32_t SIGNATURE_LENGTH_BYTES = 32; - - // scrypt params - static const uint64_t N = 16384; - static const uint32_t r = 8; - static const uint32_t p = 1; - - static const int MAX_UINT_32_CHARS = 11; - - SoftGateKeeper() { - key_.reset(new uint8_t[SIGNATURE_LENGTH_BYTES]); - memset(key_.get(), 0, SIGNATURE_LENGTH_BYTES); - } - - virtual ~SoftGateKeeper() { - } - - virtual bool GetAuthTokenKey(const uint8_t** auth_token_key, uint32_t* length) const { - if (auth_token_key == NULL || length == NULL) return false; - *auth_token_key = key_.get(); - *length = SIGNATURE_LENGTH_BYTES; - return true; - } - - virtual void GetPasswordKey(const uint8_t** password_key, uint32_t* length) { - if (password_key == NULL || length == NULL) return; - *password_key = key_.get(); - *length = SIGNATURE_LENGTH_BYTES; - } - - virtual void ComputePasswordSignature(uint8_t *signature, uint32_t signature_length, - const uint8_t *, uint32_t, const uint8_t *password, - uint32_t password_length, salt_t salt) const { - if (signature == NULL) return; - crypto_scrypt(password, password_length, reinterpret_cast(&salt), - sizeof(salt), N, r, p, signature, signature_length); - } - - virtual void GetRandom(void *random, uint32_t requested_length) const { - if (random == NULL) return; - RAND_pseudo_bytes((uint8_t *) random, requested_length); - } - - virtual void ComputeSignature(uint8_t *signature, uint32_t signature_length, - const uint8_t *, uint32_t, const uint8_t *, const uint32_t) const { - if (signature == NULL) return; - memset(signature, 0, signature_length); - } - - virtual uint64_t GetMillisecondsSinceBoot() const { - struct timespec time; - int res = clock_gettime(CLOCK_BOOTTIME, &time); - if (res < 0) return 0; - return (time.tv_sec * 1000) + (time.tv_nsec / 1000 / 1000); - } - - virtual bool IsHardwareBacked() const { - return false; - } - - virtual bool GetFailureRecord(uint32_t uid, secure_id_t user_id, failure_record_t *record, - bool /* secure */) { - failure_record_t *stored = &failure_map_[uid]; - if (user_id != stored->secure_user_id) { - stored->secure_user_id = user_id; - stored->last_checked_timestamp = 0; - stored->failure_counter = 0; - } - memcpy(record, stored, sizeof(*record)); - return true; - } - - virtual bool ClearFailureRecord(uint32_t uid, secure_id_t user_id, bool /* secure */) { - failure_record_t *stored = &failure_map_[uid]; - stored->secure_user_id = user_id; - stored->last_checked_timestamp = 0; - stored->failure_counter = 0; - return true; - } - - virtual bool WriteFailureRecord(uint32_t uid, failure_record_t *record, bool /* secure */) { - failure_map_[uid] = *record; - return true; - } - - fast_hash_t ComputeFastHash(const SizedBuffer &password, uint64_t salt) { - fast_hash_t fast_hash; - size_t digest_size = password.length + sizeof(salt); - std::unique_ptr digest(new uint8_t[digest_size]); - memcpy(digest.get(), &salt, sizeof(salt)); - memcpy(digest.get() + sizeof(salt), password.buffer.get(), password.length); - - SHA256(digest.get(), digest_size, (uint8_t *) &fast_hash.digest); - - fast_hash.salt = salt; - return fast_hash; - } - - bool VerifyFast(const fast_hash_t &fast_hash, const SizedBuffer &password) { - fast_hash_t computed = ComputeFastHash(password, fast_hash.salt); - return memcmp(computed.digest, fast_hash.digest, SHA256_DIGEST_LENGTH) == 0; - } - - bool DoVerify(const password_handle_t *expected_handle, const SizedBuffer &password) { - uint64_t user_id = android::base::get_unaligned(&expected_handle->user_id); - FastHashMap::const_iterator it = fast_hash_map_.find(user_id); - if (it != fast_hash_map_.end() && VerifyFast(it->second, password)) { - return true; - } else { - if (GateKeeper::DoVerify(expected_handle, password)) { - uint64_t salt; - GetRandom(&salt, sizeof(salt)); - fast_hash_map_[user_id] = ComputeFastHash(password, salt); - return true; - } - } - - return false; - } - -private: - - typedef std::unordered_map FailureRecordMap; - typedef std::unordered_map FastHashMap; - - std::unique_ptr key_; - FailureRecordMap failure_map_; - FastHashMap fast_hash_map_; -}; -} - -#endif // SOFT_GATEKEEPER_H_ diff --git a/gatekeeperd/SoftGateKeeperDevice.cpp b/gatekeeperd/SoftGateKeeperDevice.cpp deleted file mode 100644 index f5e2ce631..000000000 --- a/gatekeeperd/SoftGateKeeperDevice.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2015 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 "SoftGateKeeper.h" -#include "SoftGateKeeperDevice.h" - -namespace android { - -int SoftGateKeeperDevice::enroll(uint32_t uid, - const uint8_t *current_password_handle, uint32_t current_password_handle_length, - const uint8_t *current_password, uint32_t current_password_length, - const uint8_t *desired_password, uint32_t desired_password_length, - uint8_t **enrolled_password_handle, uint32_t *enrolled_password_handle_length) { - - if (enrolled_password_handle == NULL || enrolled_password_handle_length == NULL || - desired_password == NULL || desired_password_length == 0) - return -EINVAL; - - // Current password and current password handle go together - if (current_password_handle == NULL || current_password_handle_length == 0 || - current_password == NULL || current_password_length == 0) { - current_password_handle = NULL; - current_password_handle_length = 0; - current_password = NULL; - current_password_length = 0; - } - - SizedBuffer desired_password_buffer(desired_password_length); - memcpy(desired_password_buffer.buffer.get(), desired_password, desired_password_length); - - SizedBuffer current_password_handle_buffer(current_password_handle_length); - if (current_password_handle) { - memcpy(current_password_handle_buffer.buffer.get(), current_password_handle, - current_password_handle_length); - } - - SizedBuffer current_password_buffer(current_password_length); - if (current_password) { - memcpy(current_password_buffer.buffer.get(), current_password, current_password_length); - } - - EnrollRequest request(uid, ¤t_password_handle_buffer, &desired_password_buffer, - ¤t_password_buffer); - EnrollResponse response; - - impl_->Enroll(request, &response); - - if (response.error == ERROR_RETRY) { - return response.retry_timeout; - } else if (response.error != ERROR_NONE) { - return -EINVAL; - } - - *enrolled_password_handle = response.enrolled_password_handle.buffer.release(); - *enrolled_password_handle_length = response.enrolled_password_handle.length; - return 0; -} - -int SoftGateKeeperDevice::verify(uint32_t uid, - uint64_t challenge, const uint8_t *enrolled_password_handle, - uint32_t enrolled_password_handle_length, const uint8_t *provided_password, - uint32_t provided_password_length, uint8_t **auth_token, uint32_t *auth_token_length, - bool *request_reenroll) { - - if (enrolled_password_handle == NULL || - provided_password == NULL) { - return -EINVAL; - } - - SizedBuffer password_handle_buffer(enrolled_password_handle_length); - memcpy(password_handle_buffer.buffer.get(), enrolled_password_handle, - enrolled_password_handle_length); - SizedBuffer provided_password_buffer(provided_password_length); - memcpy(provided_password_buffer.buffer.get(), provided_password, provided_password_length); - - VerifyRequest request(uid, challenge, &password_handle_buffer, &provided_password_buffer); - VerifyResponse response; - - impl_->Verify(request, &response); - - if (response.error == ERROR_RETRY) { - return response.retry_timeout; - } else if (response.error != ERROR_NONE) { - return -EINVAL; - } - - if (auth_token != NULL && auth_token_length != NULL) { - *auth_token = response.auth_token.buffer.release(); - *auth_token_length = response.auth_token.length; - } - - if (request_reenroll != NULL) { - *request_reenroll = response.request_reenroll; - } - - return 0; -} -} // namespace android diff --git a/gatekeeperd/SoftGateKeeperDevice.h b/gatekeeperd/SoftGateKeeperDevice.h deleted file mode 100644 index e3dc068fb..000000000 --- a/gatekeeperd/SoftGateKeeperDevice.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2015 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 SOFT_GATEKEEPER_DEVICE_H_ -#define SOFT_GATEKEEPER_DEVICE_H_ - -#include "SoftGateKeeper.h" - -#include - -using namespace gatekeeper; - -namespace android { - -/** - * Software based GateKeeper implementation - */ -class SoftGateKeeperDevice { -public: - SoftGateKeeperDevice() { - impl_.reset(new SoftGateKeeper()); - } - - // Wrappers to translate the gatekeeper HAL API to the Kegyuard Messages API. - - /** - * Enrolls password_payload, which should be derived from a user selected pin or password, - * with the authentication factor private key used only for enrolling authentication - * factor data. - * - * Returns: 0 on success or an error code less than 0 on error. - * On error, enrolled_password_handle will not be allocated. - */ - int enroll(uint32_t uid, - const uint8_t *current_password_handle, uint32_t current_password_handle_length, - const uint8_t *current_password, uint32_t current_password_length, - const uint8_t *desired_password, uint32_t desired_password_length, - uint8_t **enrolled_password_handle, uint32_t *enrolled_password_handle_length); - - /** - * Verifies provided_password matches enrolled_password_handle. - * - * Implementations of this module may retain the result of this call - * to attest to the recency of authentication. - * - * On success, writes the address of a verification token to auth_token, - * usable to attest password verification to other trusted services. Clients - * may pass NULL for this value. - * - * Returns: 0 on success or an error code less than 0 on error - * On error, verification token will not be allocated - */ - int verify(uint32_t uid, uint64_t challenge, - const uint8_t *enrolled_password_handle, uint32_t enrolled_password_handle_length, - const uint8_t *provided_password, uint32_t provided_password_length, - uint8_t **auth_token, uint32_t *auth_token_length, bool *request_reenroll); -private: - std::unique_ptr impl_; -}; - -} // namespace gatekeeper - -#endif //SOFT_GATEKEEPER_DEVICE_H_ diff --git a/gatekeeperd/binder/android/service/gatekeeper/GateKeeperResponse.aidl b/gatekeeperd/binder/android/service/gatekeeper/GateKeeperResponse.aidl new file mode 100644 index 000000000..097bb548c --- /dev/null +++ b/gatekeeperd/binder/android/service/gatekeeper/GateKeeperResponse.aidl @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2015 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.service.gatekeeper; + +/** + * Response object for a GateKeeper verification request. + * @hide + */ +parcelable GateKeeperResponse cpp_header "gatekeeper/GateKeeperResponse.h"; + diff --git a/gatekeeperd/binder/android/service/gatekeeper/IGateKeeperService.aidl b/gatekeeperd/binder/android/service/gatekeeper/IGateKeeperService.aidl new file mode 100644 index 000000000..57adaba07 --- /dev/null +++ b/gatekeeperd/binder/android/service/gatekeeper/IGateKeeperService.aidl @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2015 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.service.gatekeeper; + +import android.service.gatekeeper.GateKeeperResponse; + +/** + * Interface for communication with GateKeeper, the + * secure password storage daemon. + * + * This must be kept manually in sync with system/core/gatekeeperd + * until AIDL can generate both C++ and Java bindings. + * + * @hide + */ +interface IGateKeeperService { + /** + * Enrolls a password, returning the handle to the enrollment to be stored locally. + * @param uid The Android user ID associated to this enrollment + * @param currentPasswordHandle The previously enrolled handle, or null if none + * @param currentPassword The previously enrolled plaintext password, or null if none. + * If provided, must verify against the currentPasswordHandle. + * @param desiredPassword The new desired password, for which a handle will be returned + * upon success. + * @return an EnrollResponse or null on failure + */ + GateKeeperResponse enroll(int uid, in @nullable byte[] currentPasswordHandle, + in @nullable byte[] currentPassword, in byte[] desiredPassword); + + /** + * Verifies an enrolled handle against a provided, plaintext blob. + * @param uid The Android user ID associated to this enrollment + * @param enrolledPasswordHandle The handle against which the provided password will be + * verified. + * @param The plaintext blob to verify against enrolledPassword. + * @return a VerifyResponse, or null on failure. + */ + GateKeeperResponse verify(int uid, in byte[] enrolledPasswordHandle, in byte[] providedPassword); + + /** + * Verifies an enrolled handle against a provided, plaintext blob. + * @param uid The Android user ID associated to this enrollment + * @param challenge a challenge to authenticate agaisnt the device credential. If successful + * authentication occurs, this value will be written to the returned + * authentication attestation. + * @param enrolledPasswordHandle The handle against which the provided password will be + * verified. + * @param The plaintext blob to verify against enrolledPassword. + * @return a VerifyResponse with an attestation, or null on failure. + */ + GateKeeperResponse verifyChallenge(int uid, long challenge, in byte[] enrolledPasswordHandle, + in byte[] providedPassword); + + /** + * Retrieves the secure identifier for the user with the provided Android ID, + * or 0 if none is found. + * @param uid the Android user id + */ + long getSecureUserId(int uid); + + /** + * Clears secure user id associated with the provided Android ID. + * Must be called when password is set to NONE. + * @param uid the Android user id. + */ + void clearSecureUserId(int uid); + + /** + * Notifies gatekeeper that device setup has been completed and any potentially still existing + * state from before a factory reset can be cleaned up (if it has not been already). + */ + void reportDeviceSetupComplete(); +} diff --git a/gatekeeperd/gatekeeperd.cpp b/gatekeeperd/gatekeeperd.cpp index 54518193d..1d65b1ced 100644 --- a/gatekeeperd/gatekeeperd.cpp +++ b/gatekeeperd/gatekeeperd.cpp @@ -16,7 +16,8 @@ #define LOG_TAG "gatekeeperd" -#include "IGateKeeperService.h" +#include +#include #include #include @@ -41,8 +42,6 @@ #include #include -#include "SoftGateKeeperDevice.h" - #include #include @@ -52,6 +51,11 @@ using android::hardware::gatekeeper::V1_0::GatekeeperStatusCode; using android::hardware::gatekeeper::V1_0::GatekeeperResponse; using android::hardware::Return; +using ::android::binder::Status; +using ::android::service::gatekeeper::BnGateKeeperService; +using GKResponse = ::android::service::gatekeeper::GateKeeperResponse; +using GKResponseCode = ::android::service::gatekeeper::ResponseCode; + namespace android { static const String16 KEYGUARD_PERMISSION("android.permission.ACCESS_KEYGUARD_SECURE_STORAGE"); @@ -64,9 +68,8 @@ public: hw_device = IGatekeeper::getService(); is_running_gsi = android::base::GetBoolProperty(android::gsi::kGsiBootedProp, false); - if (hw_device == nullptr) { - ALOGW("falling back to software GateKeeper"); - soft_device.reset(new SoftGateKeeperDevice()); + if (!hw_device) { + LOG(ERROR) << "Could not find Gatekeeper device, which makes me very sad."; } } @@ -92,7 +95,7 @@ public: if (mark_cold_boot() && !is_running_gsi) { ALOGI("cold boot: clearing state"); - if (hw_device != nullptr) { + if (hw_device) { hw_device->deleteAllUsers([](const GatekeeperResponse &){}); } } @@ -154,16 +157,16 @@ public: return uid; } - virtual int enroll(uint32_t uid, - const uint8_t *current_password_handle, uint32_t current_password_handle_length, - const uint8_t *current_password, uint32_t current_password_length, - const uint8_t *desired_password, uint32_t desired_password_length, - uint8_t **enrolled_password_handle, uint32_t *enrolled_password_handle_length) { +#define GK_ERROR *gkResponse = GKResponse::error(), Status::ok() + + Status enroll(int32_t uid, const std::unique_ptr>& currentPasswordHandle, + const std::unique_ptr>& currentPassword, + const std::vector& desiredPassword, GKResponse* gkResponse) override { IPCThreadState* ipc = IPCThreadState::self(); const int calling_pid = ipc->getCallingPid(); const int calling_uid = ipc->getCallingUid(); if (!PermissionCache::checkPermission(KEYGUARD_PERMISSION, calling_pid, calling_uid)) { - return PERMISSION_DENIED; + return GK_ERROR; } // Make sure to clear any state from before factory reset as soon as a credential is @@ -171,226 +174,189 @@ public: clear_state_if_needed(); // need a desired password to enroll - if (desired_password_length == 0) return -EINVAL; + if (desiredPassword.size() == 0) return GK_ERROR; - int ret; - if (hw_device != nullptr) { - const gatekeeper::password_handle_t *handle = - reinterpret_cast(current_password_handle); + if (!hw_device) { + LOG(ERROR) << "has no HAL to talk to"; + return GK_ERROR; + } - if (handle != NULL && handle->version != 0 && !handle->hardware_backed) { - // handle is being re-enrolled from a software version. HAL probably won't accept - // the handle as valid, so we nullify it and enroll from scratch - current_password_handle = NULL; - current_password_handle_length = 0; - current_password = NULL; - current_password_length = 0; + android::hardware::hidl_vec curPwdHandle; + android::hardware::hidl_vec curPwd; + + if (currentPasswordHandle && currentPassword) { + if (currentPasswordHandle->size() != sizeof(gatekeeper::password_handle_t)) { + LOG(INFO) << "Password handle has wrong length"; + return GK_ERROR; } + curPwdHandle.setToExternal(const_cast(currentPasswordHandle->data()), + currentPasswordHandle->size()); + curPwd.setToExternal(const_cast(currentPassword->data()), + currentPassword->size()); + } - android::hardware::hidl_vec curPwdHandle; - curPwdHandle.setToExternal(const_cast(current_password_handle), - current_password_handle_length); - android::hardware::hidl_vec curPwd; - curPwd.setToExternal(const_cast(current_password), - current_password_length); - android::hardware::hidl_vec newPwd; - newPwd.setToExternal(const_cast(desired_password), - desired_password_length); + android::hardware::hidl_vec newPwd; + newPwd.setToExternal(const_cast(desiredPassword.data()), desiredPassword.size()); - uint32_t hw_uid = adjust_uid(uid); - Return hwRes = hw_device->enroll(hw_uid, curPwdHandle, curPwd, newPwd, - [&ret, enrolled_password_handle, enrolled_password_handle_length] - (const GatekeeperResponse &rsp) { - ret = static_cast(rsp.code); // propagate errors - if (rsp.code >= GatekeeperStatusCode::STATUS_OK) { - if (enrolled_password_handle != nullptr && - enrolled_password_handle_length != nullptr) { - *enrolled_password_handle = new uint8_t[rsp.data.size()]; - *enrolled_password_handle_length = rsp.data.size(); - memcpy(*enrolled_password_handle, rsp.data.data(), - *enrolled_password_handle_length); + uint32_t hw_uid = adjust_uid(uid); + Return hwRes = hw_device->enroll( + hw_uid, curPwdHandle, curPwd, newPwd, [&gkResponse](const GatekeeperResponse& rsp) { + if (rsp.code >= GatekeeperStatusCode::STATUS_OK) { + *gkResponse = GKResponse::ok({rsp.data.begin(), rsp.data.end()}); + } else if (rsp.code == GatekeeperStatusCode::ERROR_RETRY_TIMEOUT && + rsp.timeout > 0) { + *gkResponse = GKResponse::retry(rsp.timeout); + } else { + *gkResponse = GKResponse::error(); } - ret = 0; // all success states are reported as 0 - } else if (rsp.code == GatekeeperStatusCode::ERROR_RETRY_TIMEOUT && rsp.timeout > 0) { - ret = rsp.timeout; - } - }); - if (!hwRes.isOk()) { - ALOGE("enroll transaction failed\n"); - ret = -1; + }); + if (!hwRes.isOk()) { + LOG(ERROR) << "enroll transaction failed"; + return GK_ERROR; + } + + if (gkResponse->response_code() == GKResponseCode::OK && !gkResponse->should_reenroll()) { + if (gkResponse->payload().size() != sizeof(gatekeeper::password_handle_t)) { + LOG(ERROR) << "HAL returned password handle of invalid length " + << gkResponse->payload().size(); + return GK_ERROR; } - } else { - ret = soft_device->enroll(uid, - current_password_handle, current_password_handle_length, - current_password, current_password_length, - desired_password, desired_password_length, - enrolled_password_handle, enrolled_password_handle_length); - } - if (ret == GATEKEEPER_RESPONSE_OK && (*enrolled_password_handle == nullptr || - *enrolled_password_handle_length != sizeof(password_handle_t))) { - ret = GATEKEEPER_RESPONSE_ERROR; - ALOGE("HAL: password_handle=%p size_of_handle=%" PRIu32 "\n", - *enrolled_password_handle, *enrolled_password_handle_length); - } - - if (ret == GATEKEEPER_RESPONSE_OK) { - gatekeeper::password_handle_t *handle = - reinterpret_cast(*enrolled_password_handle); + const gatekeeper::password_handle_t* handle = + reinterpret_cast( + gkResponse->payload().data()); store_sid(uid, handle->user_id); - bool rr; + GKResponse verifyResponse; // immediately verify this password so we don't ask the user to enter it again // if they just created it. - verify(uid, *enrolled_password_handle, sizeof(password_handle_t), desired_password, - desired_password_length, &rr); + auto status = verify(uid, gkResponse->payload(), desiredPassword, &verifyResponse); + if (!status.isOk() || verifyResponse.response_code() != GKResponseCode::OK) { + LOG(ERROR) << "Failed to verify password after enrolling"; + } } - return ret; + return Status::ok(); } - virtual int verify(uint32_t uid, - const uint8_t *enrolled_password_handle, uint32_t enrolled_password_handle_length, - const uint8_t *provided_password, uint32_t provided_password_length, bool *request_reenroll) { - uint8_t *auth_token = nullptr; - uint32_t auth_token_length; - int ret = verifyChallenge(uid, 0, enrolled_password_handle, enrolled_password_handle_length, - provided_password, provided_password_length, - &auth_token, &auth_token_length, request_reenroll); - delete [] auth_token; - return ret; + Status verify(int32_t uid, const ::std::vector& enrolledPasswordHandle, + const ::std::vector& providedPassword, GKResponse* gkResponse) override { + return verifyChallenge(uid, 0 /* challenge */, enrolledPasswordHandle, providedPassword, + gkResponse); } - virtual int verifyChallenge(uint32_t uid, uint64_t challenge, - const uint8_t *enrolled_password_handle, uint32_t enrolled_password_handle_length, - const uint8_t *provided_password, uint32_t provided_password_length, - uint8_t **auth_token, uint32_t *auth_token_length, bool *request_reenroll) { + Status verifyChallenge(int32_t uid, int64_t challenge, + const std::vector& enrolledPasswordHandle, + const std::vector& providedPassword, + GKResponse* gkResponse) override { IPCThreadState* ipc = IPCThreadState::self(); const int calling_pid = ipc->getCallingPid(); const int calling_uid = ipc->getCallingUid(); if (!PermissionCache::checkPermission(KEYGUARD_PERMISSION, calling_pid, calling_uid)) { - return PERMISSION_DENIED; + return GK_ERROR; } // can't verify if we're missing either param - if (enrolled_password_handle == nullptr || provided_password == nullptr || - enrolled_password_handle_length == 0 || provided_password_length == 0) - return -EINVAL; + if (enrolledPasswordHandle.size() == 0 || providedPassword.size() == 0) return GK_ERROR; - int ret; - if (hw_device != nullptr) { - const gatekeeper::password_handle_t *handle = - reinterpret_cast(enrolled_password_handle); - // handle version 0 does not have hardware backed flag, and thus cannot be upgraded to - // a HAL if there was none before - if (handle->version == 0 || handle->hardware_backed) { - uint32_t hw_uid = adjust_uid(uid); - android::hardware::hidl_vec curPwdHandle; - curPwdHandle.setToExternal(const_cast(enrolled_password_handle), - enrolled_password_handle_length); - android::hardware::hidl_vec enteredPwd; - enteredPwd.setToExternal(const_cast(provided_password), - provided_password_length); - Return hwRes = hw_device->verify(hw_uid, challenge, curPwdHandle, enteredPwd, - [&ret, request_reenroll, auth_token, auth_token_length] - (const GatekeeperResponse &rsp) { - ret = static_cast(rsp.code); // propagate errors - if (auth_token != nullptr && auth_token_length != nullptr && - rsp.code >= GatekeeperStatusCode::STATUS_OK) { - *auth_token = new uint8_t[rsp.data.size()]; - *auth_token_length = rsp.data.size(); - memcpy(*auth_token, rsp.data.data(), *auth_token_length); - if (request_reenroll != nullptr) { - *request_reenroll = (rsp.code == GatekeeperStatusCode::STATUS_REENROLL); - } - ret = 0; // all success states are reported as 0 - } else if (rsp.code == GatekeeperStatusCode::ERROR_RETRY_TIMEOUT && - rsp.timeout > 0) { - ret = rsp.timeout; + if (!hw_device) return GK_ERROR; + + if (enrolledPasswordHandle.size() != sizeof(gatekeeper::password_handle_t)) { + LOG(INFO) << "Password handle has wrong length"; + return GK_ERROR; + } + const gatekeeper::password_handle_t* handle = + reinterpret_cast( + enrolledPasswordHandle.data()); + + uint32_t hw_uid = adjust_uid(uid); + android::hardware::hidl_vec curPwdHandle; + curPwdHandle.setToExternal(const_cast(enrolledPasswordHandle.data()), + enrolledPasswordHandle.size()); + android::hardware::hidl_vec enteredPwd; + enteredPwd.setToExternal(const_cast(providedPassword.data()), + providedPassword.size()); + + Return hwRes = hw_device->verify( + hw_uid, challenge, curPwdHandle, enteredPwd, + [&gkResponse](const GatekeeperResponse& rsp) { + if (rsp.code >= GatekeeperStatusCode::STATUS_OK) { + *gkResponse = GKResponse::ok( + {rsp.data.begin(), rsp.data.end()}, + rsp.code == GatekeeperStatusCode::STATUS_REENROLL /* reenroll */); + } else if (rsp.code == GatekeeperStatusCode::ERROR_RETRY_TIMEOUT) { + *gkResponse = GKResponse::retry(rsp.timeout); + } else { + *gkResponse = GKResponse::error(); } }); - if (!hwRes.isOk()) { - ALOGE("verify transaction failed\n"); - ret = -1; - } - } else { - // upgrade scenario, a HAL has been added to this device where there was none before - SoftGateKeeperDevice soft_dev; - ret = soft_dev.verify(uid, challenge, - enrolled_password_handle, enrolled_password_handle_length, - provided_password, provided_password_length, auth_token, auth_token_length, - request_reenroll); - if (ret == 0) { - // success! re-enroll with HAL - if (request_reenroll != nullptr) *request_reenroll = true; + if (!hwRes.isOk()) { + LOG(ERROR) << "verify transaction failed"; + return GK_ERROR; + } + + if (gkResponse->response_code() == GKResponseCode::OK) { + if (gkResponse->payload().size() != 0) { + sp sm = defaultServiceManager(); + sp binder = sm->getService(String16("android.security.keystore")); + sp service = + interface_cast(binder); + + if (service) { + int result = 0; + auto binder_result = service->addAuthToken(gkResponse->payload(), &result); + if (!binder_result.isOk() || + !keystore::KeyStoreServiceReturnCode(result).isOk()) { + LOG(ERROR) << "Failure sending auth token to KeyStore: " << result; + } + } else { + LOG(ERROR) << "Cannot deliver auth token. Unable to communicate with Keystore."; } } - } else { - ret = soft_device->verify(uid, challenge, - enrolled_password_handle, enrolled_password_handle_length, - provided_password, provided_password_length, auth_token, auth_token_length, - request_reenroll); + + maybe_store_sid(uid, handle->user_id); } - if (ret == 0 && *auth_token != NULL && *auth_token_length > 0) { - // TODO: cache service? - sp sm = defaultServiceManager(); - sp binder = sm->getService(String16("android.security.keystore")); - sp service = - interface_cast(binder); - if (service != NULL) { - std::vector auth_token_vector(*auth_token, - (*auth_token) + *auth_token_length); - int result = 0; - auto binder_result = service->addAuthToken(auth_token_vector, &result); - if (!binder_result.isOk() || !keystore::KeyStoreServiceReturnCode(result).isOk()) { - ALOGE("Failure sending auth token to KeyStore: %" PRId32, result); - } - } else { - ALOGE("Unable to communicate with KeyStore"); - } - } - - if (ret == 0) { - maybe_store_sid(uid, reinterpret_cast( - enrolled_password_handle)->user_id); - } - - return ret; + return Status::ok(); } - virtual uint64_t getSecureUserId(uint32_t uid) { return read_sid(uid); } + Status getSecureUserId(int32_t uid, int64_t* sid) override { + *sid = read_sid(uid); + return Status::ok(); + } - virtual void clearSecureUserId(uint32_t uid) { + Status clearSecureUserId(int32_t uid) override { IPCThreadState* ipc = IPCThreadState::self(); const int calling_pid = ipc->getCallingPid(); const int calling_uid = ipc->getCallingUid(); if (!PermissionCache::checkPermission(KEYGUARD_PERMISSION, calling_pid, calling_uid)) { ALOGE("%s: permission denied for [%d:%d]", __func__, calling_pid, calling_uid); - return; + return Status::ok(); } clear_sid(uid); - if (hw_device != nullptr) { + if (hw_device) { uint32_t hw_uid = adjust_uid(uid); hw_device->deleteUser(hw_uid, [] (const GatekeeperResponse &){}); } + return Status::ok(); } - virtual void reportDeviceSetupComplete() { + Status reportDeviceSetupComplete() override { IPCThreadState* ipc = IPCThreadState::self(); const int calling_pid = ipc->getCallingPid(); const int calling_uid = ipc->getCallingUid(); if (!PermissionCache::checkPermission(KEYGUARD_PERMISSION, calling_pid, calling_uid)) { ALOGE("%s: permission denied for [%d:%d]", __func__, calling_pid, calling_uid); - return; + return Status::ok(); } clear_state_if_needed(); + return Status::ok(); } - virtual status_t dump(int fd, const Vector &) { + status_t dump(int fd, const Vector&) override { IPCThreadState* ipc = IPCThreadState::self(); const int pid = ipc->getCallingPid(); const int uid = ipc->getCallingUid(); @@ -411,7 +377,6 @@ public: private: sp hw_device; - std::unique_ptr soft_device; bool clear_state_if_needed_done; bool is_running_gsi; diff --git a/gatekeeperd/include/gatekeeper/GateKeeperResponse.h b/gatekeeperd/include/gatekeeper/GateKeeperResponse.h new file mode 100644 index 000000000..99fff024d --- /dev/null +++ b/gatekeeperd/include/gatekeeper/GateKeeperResponse.h @@ -0,0 +1,85 @@ +/* +** +** Copyright 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. +*/ + +#ifndef GATEKEEPERD_INCLUDE_GATEKEEPER_GATEKEEPERRESPONSE_H_ +#define GATEKEEPERD_INCLUDE_GATEKEEPER_GATEKEEPERRESPONSE_H_ + +#include + +namespace android { +namespace service { +namespace gatekeeper { + +enum class ResponseCode : int32_t { + ERROR = -1, + OK = 0, + RETRY = 1, +}; + +class GateKeeperResponse : public ::android::Parcelable { + GateKeeperResponse(ResponseCode response_code, int32_t timeout = 0, + std::vector payload = {}, bool should_reenroll = false) + : response_code_(response_code), + timeout_(timeout), + payload_(std::move(payload)), + should_reenroll_(should_reenroll) {} + + public: + GateKeeperResponse() = default; + GateKeeperResponse(GateKeeperResponse&&) = default; + GateKeeperResponse(const GateKeeperResponse&) = default; + GateKeeperResponse& operator=(GateKeeperResponse&&) = default; + + static GateKeeperResponse error() { return GateKeeperResponse(ResponseCode::ERROR); } + static GateKeeperResponse retry(int32_t timeout) { + return GateKeeperResponse(ResponseCode::RETRY, timeout); + } + static GateKeeperResponse ok(std::vector payload, bool reenroll = false) { + return GateKeeperResponse(ResponseCode::OK, 0, std::move(payload), reenroll); + } + + status_t readFromParcel(const Parcel* in) override; + status_t writeToParcel(Parcel* out) const override; + + const std::vector& payload() const { return payload_; } + + void payload(std::vector payload) { payload_ = payload; } + + ResponseCode response_code() const { return response_code_; } + + void response_code(ResponseCode response_code) { response_code_ = response_code; } + + bool should_reenroll() const { return should_reenroll_; } + + void should_reenroll(bool should_reenroll) { should_reenroll_ = should_reenroll; } + + int32_t timeout() const { return timeout_; } + + void timeout(int32_t timeout) { timeout_ = timeout; } + + private: + ResponseCode response_code_; + int32_t timeout_; + std::vector payload_; + bool should_reenroll_; +}; + +} // namespace gatekeeper +} // namespace service +} // namespace android + +#endif // GATEKEEPERD_INCLUDE_GATEKEEPER_GATEKEEPERRESPONSE_H_ diff --git a/gatekeeperd/tests/Android.bp b/gatekeeperd/tests/Android.bp deleted file mode 100644 index d4cf93b60..000000000 --- a/gatekeeperd/tests/Android.bp +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright (C) 2015 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: "gatekeeperd-unit-tests", - - cflags: [ - "-g", - "-Wall", - "-Werror", - "-Wno-missing-field-initializers", - ], - shared_libs: [ - "libgatekeeper", - "libcrypto", - "libbase", - ], - static_libs: ["libscrypt_static"], - include_dirs: ["external/scrypt/lib/crypto"], - srcs: ["gatekeeper_test.cpp"], -} diff --git a/gatekeeperd/tests/gatekeeper_test.cpp b/gatekeeperd/tests/gatekeeper_test.cpp deleted file mode 100644 index 100375fb8..000000000 --- a/gatekeeperd/tests/gatekeeper_test.cpp +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright 2015 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 - -#include "../SoftGateKeeper.h" - -using ::gatekeeper::SizedBuffer; -using ::testing::Test; -using ::gatekeeper::EnrollRequest; -using ::gatekeeper::EnrollResponse; -using ::gatekeeper::VerifyRequest; -using ::gatekeeper::VerifyResponse; -using ::gatekeeper::SoftGateKeeper; -using ::gatekeeper::secure_id_t; - -static void do_enroll(SoftGateKeeper &gatekeeper, EnrollResponse *response) { - SizedBuffer password; - - password.buffer.reset(new uint8_t[16]); - password.length = 16; - memset(password.buffer.get(), 0, 16); - EnrollRequest request(0, NULL, &password, NULL); - - gatekeeper.Enroll(request, response); -} - -TEST(GateKeeperTest, EnrollSuccess) { - SoftGateKeeper gatekeeper; - EnrollResponse response; - do_enroll(gatekeeper, &response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, response.error); -} - -TEST(GateKeeperTest, EnrollBogusData) { - SoftGateKeeper gatekeeper; - SizedBuffer password; - EnrollResponse response; - - EnrollRequest request(0, NULL, &password, NULL); - - gatekeeper.Enroll(request, &response); - - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_INVALID, response.error); -} - -TEST(GateKeeperTest, VerifySuccess) { - SoftGateKeeper gatekeeper; - SizedBuffer provided_password; - EnrollResponse enroll_response; - - provided_password.buffer.reset(new uint8_t[16]); - provided_password.length = 16; - memset(provided_password.buffer.get(), 0, 16); - - do_enroll(gatekeeper, &enroll_response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, enroll_response.error); - VerifyRequest request(0, 1, &enroll_response.enrolled_password_handle, - &provided_password); - VerifyResponse response; - - gatekeeper.Verify(request, &response); - - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, response.error); - - hw_auth_token_t *auth_token = - reinterpret_cast(response.auth_token.buffer.get()); - - ASSERT_EQ((uint32_t) HW_AUTH_PASSWORD, ntohl(auth_token->authenticator_type)); - ASSERT_EQ((uint64_t) 1, auth_token->challenge); - ASSERT_NE(~((uint32_t) 0), auth_token->timestamp); - ASSERT_NE((uint64_t) 0, auth_token->user_id); - ASSERT_NE((uint64_t) 0, auth_token->authenticator_id); -} - -TEST(GateKeeperTest, TrustedReEnroll) { - SoftGateKeeper gatekeeper; - SizedBuffer provided_password; - EnrollResponse enroll_response; - SizedBuffer password_handle; - - // do_enroll enrolls an all 0 password - provided_password.buffer.reset(new uint8_t[16]); - provided_password.length = 16; - memset(provided_password.buffer.get(), 0, 16); - do_enroll(gatekeeper, &enroll_response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, enroll_response.error); - - // keep a copy of the handle - password_handle.buffer.reset(new uint8_t[enroll_response.enrolled_password_handle.length]); - password_handle.length = enroll_response.enrolled_password_handle.length; - memcpy(password_handle.buffer.get(), enroll_response.enrolled_password_handle.buffer.get(), - password_handle.length); - - // verify first password - VerifyRequest request(0, 0, &enroll_response.enrolled_password_handle, - &provided_password); - VerifyResponse response; - gatekeeper.Verify(request, &response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, response.error); - hw_auth_token_t *auth_token = - reinterpret_cast(response.auth_token.buffer.get()); - - secure_id_t secure_id = auth_token->user_id; - - // enroll new password - provided_password.buffer.reset(new uint8_t[16]); - provided_password.length = 16; - memset(provided_password.buffer.get(), 0, 16); - SizedBuffer password; - password.buffer.reset(new uint8_t[16]); - memset(password.buffer.get(), 1, 16); - password.length = 16; - EnrollRequest enroll_request(0, &password_handle, &password, &provided_password); - gatekeeper.Enroll(enroll_request, &enroll_response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, enroll_response.error); - - // verify new password - password.buffer.reset(new uint8_t[16]); - memset(password.buffer.get(), 1, 16); - password.length = 16; - VerifyRequest new_request(0, 0, &enroll_response.enrolled_password_handle, - &password); - gatekeeper.Verify(new_request, &response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, response.error); - ASSERT_EQ(secure_id, - reinterpret_cast(response.auth_token.buffer.get())->user_id); -} - - -TEST(GateKeeperTest, UntrustedReEnroll) { - SoftGateKeeper gatekeeper; - SizedBuffer provided_password; - EnrollResponse enroll_response; - - // do_enroll enrolls an all 0 password - provided_password.buffer.reset(new uint8_t[16]); - provided_password.length = 16; - memset(provided_password.buffer.get(), 0, 16); - do_enroll(gatekeeper, &enroll_response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, enroll_response.error); - - // verify first password - VerifyRequest request(0, 0, &enroll_response.enrolled_password_handle, - &provided_password); - VerifyResponse response; - gatekeeper.Verify(request, &response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, response.error); - hw_auth_token_t *auth_token = - reinterpret_cast(response.auth_token.buffer.get()); - - secure_id_t secure_id = auth_token->user_id; - - // enroll new password - SizedBuffer password; - password.buffer.reset(new uint8_t[16]); - memset(password.buffer.get(), 1, 16); - password.length = 16; - EnrollRequest enroll_request(0, NULL, &password, NULL); - gatekeeper.Enroll(enroll_request, &enroll_response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, enroll_response.error); - - // verify new password - password.buffer.reset(new uint8_t[16]); - memset(password.buffer.get(), 1, 16); - password.length = 16; - VerifyRequest new_request(0, 0, &enroll_response.enrolled_password_handle, - &password); - gatekeeper.Verify(new_request, &response); - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_NONE, response.error); - ASSERT_NE(secure_id, - reinterpret_cast(response.auth_token.buffer.get())->user_id); -} - - -TEST(GateKeeperTest, VerifyBogusData) { - SoftGateKeeper gatekeeper; - SizedBuffer provided_password; - SizedBuffer password_handle; - VerifyResponse response; - - VerifyRequest request(0, 0, &provided_password, &password_handle); - - gatekeeper.Verify(request, &response); - - ASSERT_EQ(::gatekeeper::gatekeeper_error_t::ERROR_INVALID, response.error); -} From ae2da7b9e6c5ac57f9a0f7180003c1086d911c7c Mon Sep 17 00:00:00 2001 From: Janis Danisevskis Date: Thu, 6 Jun 2019 22:05:41 -0700 Subject: [PATCH 006/388] Replace legacy trusty gatekeeper HAL with HIDLized version This patch replaces the legacy libhardware based gatekeeper HAL with a true HIDL based implementation. Test: Not yet Change-Id: I072b0c3fc74523400132aacd34e2f2cac9cf261b --- trusty/gatekeeper/Android.bp | 18 +- ....hardware.gatekeeper@1.0-service.trusty.rc | 4 + ...hardware.gatekeeper@1.0-service.trusty.xml | 11 + trusty/gatekeeper/module.cpp | 57 ---- trusty/gatekeeper/service.cpp | 39 +++ trusty/gatekeeper/trusty_gatekeeper.cpp | 253 +++++++----------- trusty/gatekeeper/trusty_gatekeeper.h | 106 +++----- trusty/trusty-base.mk | 4 +- 8 files changed, 197 insertions(+), 295 deletions(-) create mode 100644 trusty/gatekeeper/android.hardware.gatekeeper@1.0-service.trusty.rc create mode 100644 trusty/gatekeeper/android.hardware.gatekeeper@1.0-service.trusty.xml delete mode 100644 trusty/gatekeeper/module.cpp create mode 100644 trusty/gatekeeper/service.cpp diff --git a/trusty/gatekeeper/Android.bp b/trusty/gatekeeper/Android.bp index 65b271a79..1666cfba8 100644 --- a/trusty/gatekeeper/Android.bp +++ b/trusty/gatekeeper/Android.bp @@ -1,4 +1,3 @@ -// // Copyright (C) 2015 The Android Open-Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,14 +19,15 @@ // to only building on ARM if they include assembly. Individual makefiles // are responsible for having their own logic, for fine-grained control. -cc_library_shared { - name: "gatekeeper.trusty", +cc_binary { + name: "android.hardware.gatekeeper@1.0-service.trusty", + defaults: ["hidl_defaults"], vendor: true, - relative_install_path: "hw", + init_rc: ["android.hardware.gatekeeper@1.0-service.trusty.rc"], srcs: [ - "module.cpp", + "service.cpp", "trusty_gatekeeper_ipc.c", "trusty_gatekeeper.cpp", ], @@ -39,10 +39,16 @@ cc_library_shared { ], shared_libs: [ + "android.hardware.gatekeeper@1.0", + "libbase", + "libhidlbase", + "libhidltransport", "libgatekeeper", + "libutils", "liblog", "libcutils", "libtrusty", ], - header_libs: ["libhardware_headers"], + + vintf_fragments: ["android.hardware.gatekeeper@1.0-service.trusty.xml"], } diff --git a/trusty/gatekeeper/android.hardware.gatekeeper@1.0-service.trusty.rc b/trusty/gatekeeper/android.hardware.gatekeeper@1.0-service.trusty.rc new file mode 100644 index 000000000..5413a6c9f --- /dev/null +++ b/trusty/gatekeeper/android.hardware.gatekeeper@1.0-service.trusty.rc @@ -0,0 +1,4 @@ +service vendor.gatekeeper-1-0 /vendor/bin/hw/android.hardware.gatekeeper@1.0-service.trusty + class hal + user system + group system diff --git a/trusty/gatekeeper/android.hardware.gatekeeper@1.0-service.trusty.xml b/trusty/gatekeeper/android.hardware.gatekeeper@1.0-service.trusty.xml new file mode 100644 index 000000000..19714a83b --- /dev/null +++ b/trusty/gatekeeper/android.hardware.gatekeeper@1.0-service.trusty.xml @@ -0,0 +1,11 @@ + + + android.hardware.gatekeeper + hwbinder + 1.0 + + IGatekeeper + default + + + diff --git a/trusty/gatekeeper/module.cpp b/trusty/gatekeeper/module.cpp deleted file mode 100644 index 0ee3c2f28..000000000 --- a/trusty/gatekeeper/module.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2015 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 - -#include "trusty_gatekeeper.h" - -using gatekeeper::TrustyGateKeeperDevice; - -static int trusty_gatekeeper_open(const hw_module_t *module, const char *name, - hw_device_t **device) { - - if (strcmp(name, HARDWARE_GATEKEEPER) != 0) { - return -EINVAL; - } - - TrustyGateKeeperDevice *gatekeeper = new TrustyGateKeeperDevice(module); - if (gatekeeper == NULL) return -ENOMEM; - *device = gatekeeper->hw_device(); - - return 0; -} - -static struct hw_module_methods_t gatekeeper_module_methods = { - .open = trusty_gatekeeper_open, -}; - -struct gatekeeper_module HAL_MODULE_INFO_SYM __attribute__((visibility("default"))) = { - .common = { - .tag = HARDWARE_MODULE_TAG, - .module_api_version = GATEKEEPER_MODULE_API_VERSION_0_1, - .hal_api_version = HARDWARE_HAL_API_VERSION, - .id = GATEKEEPER_HARDWARE_MODULE_ID, - .name = "Trusty GateKeeper HAL", - .author = "The Android Open Source Project", - .methods = &gatekeeper_module_methods, - .dso = 0, - .reserved = {} - }, -}; diff --git a/trusty/gatekeeper/service.cpp b/trusty/gatekeeper/service.cpp new file mode 100644 index 000000000..c5ee4883f --- /dev/null +++ b/trusty/gatekeeper/service.cpp @@ -0,0 +1,39 @@ +/* + * 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.gatekeeper@1.0-service.trusty" + +#include +#include + +#include + +#include "trusty_gatekeeper.h" + +// Generated HIDL files +using android::hardware::gatekeeper::V1_0::IGatekeeper; +using gatekeeper::TrustyGateKeeperDevice; + +int main() { + ::android::hardware::configureRpcThreadpool(1, true /* willJoinThreadpool */); + android::sp gatekeeper(new TrustyGateKeeperDevice()); + auto status = gatekeeper->registerAsService(); + if (status != android::OK) { + LOG(FATAL) << "Could not register service for Gatekeeper 1.0 (trusty) (" << status << ")"; + } + + android::hardware::joinRpcThreadpool(); + return -1; // Should never get here. +} diff --git a/trusty/gatekeeper/trusty_gatekeeper.cpp b/trusty/gatekeeper/trusty_gatekeeper.cpp index b3fbfa940..d14966460 100644 --- a/trusty/gatekeeper/trusty_gatekeeper.cpp +++ b/trusty/gatekeeper/trusty_gatekeeper.cpp @@ -16,147 +16,131 @@ #define LOG_TAG "TrustyGateKeeper" -#include -#include -#include - -#include - -#include +#include +#include #include "trusty_gatekeeper.h" #include "trusty_gatekeeper_ipc.h" #include "gatekeeper_ipc.h" +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::gatekeeper::V1_0::GatekeeperStatusCode; +using ::gatekeeper::EnrollRequest; +using ::gatekeeper::EnrollResponse; +using ::gatekeeper::ERROR_INVALID; +using ::gatekeeper::ERROR_MEMORY_ALLOCATION_FAILED; +using ::gatekeeper::ERROR_NONE; +using ::gatekeeper::ERROR_RETRY; +using ::gatekeeper::SizedBuffer; +using ::gatekeeper::VerifyRequest; +using ::gatekeeper::VerifyResponse; + namespace gatekeeper { -const uint32_t SEND_BUF_SIZE = 8192; -const uint32_t RECV_BUF_SIZE = 8192; - -TrustyGateKeeperDevice::TrustyGateKeeperDevice(const hw_module_t *module) { -#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) - static_assert(std::is_standard_layout::value, - "TrustyGateKeeperDevice must be standard layout"); - static_assert(offsetof(TrustyGateKeeperDevice, device_) == 0, - "device_ must be the first member of TrustyGateKeeperDevice"); - static_assert(offsetof(TrustyGateKeeperDevice, device_.common) == 0, - "common must be the first member of gatekeeper_device"); -#else - assert(reinterpret_cast(this) == &device_); - assert(reinterpret_cast(this) == &(device_.common)); -#endif - - memset(&device_, 0, sizeof(device_)); - device_.common.tag = HARDWARE_DEVICE_TAG; - device_.common.version = 1; - device_.common.module = const_cast(module); - device_.common.close = close_device; - - device_.enroll = enroll; - device_.verify = verify; - device_.delete_user = nullptr; - device_.delete_all_users = nullptr; +constexpr const uint32_t SEND_BUF_SIZE = 8192; +constexpr const uint32_t RECV_BUF_SIZE = 8192; +TrustyGateKeeperDevice::TrustyGateKeeperDevice() { int rc = trusty_gatekeeper_connect(); if (rc < 0) { - ALOGE("Error initializing trusty session: %d", rc); + LOG(ERROR) << "Error initializing trusty session: " << rc; } error_ = rc; - -} - -hw_device_t* TrustyGateKeeperDevice::hw_device() { - return &device_.common; -} - -int TrustyGateKeeperDevice::close_device(hw_device_t* dev) { - delete reinterpret_cast(dev); - return 0; } TrustyGateKeeperDevice::~TrustyGateKeeperDevice() { trusty_gatekeeper_disconnect(); } -int TrustyGateKeeperDevice::Enroll(uint32_t uid, const uint8_t *current_password_handle, - uint32_t current_password_handle_length, const uint8_t *current_password, - uint32_t current_password_length, const uint8_t *desired_password, - uint32_t desired_password_length, uint8_t **enrolled_password_handle, - uint32_t *enrolled_password_handle_length) { - - if (error_ != 0) { - return error_; - } - - SizedBuffer desired_password_buffer(desired_password_length); - memcpy(desired_password_buffer.buffer.get(), desired_password, desired_password_length); - - SizedBuffer current_password_handle_buffer(current_password_handle_length); - if (current_password_handle) { - memcpy(current_password_handle_buffer.buffer.get(), current_password_handle, - current_password_handle_length); - } - - SizedBuffer current_password_buffer(current_password_length); - if (current_password) { - memcpy(current_password_buffer.buffer.get(), current_password, current_password_length); - } - - EnrollRequest request(uid, ¤t_password_handle_buffer, &desired_password_buffer, - ¤t_password_buffer); - EnrollResponse response; - - gatekeeper_error_t error = Send(request, &response); - - if (error == ERROR_RETRY) { - return response.retry_timeout; - } else if (error != ERROR_NONE) { - return -EINVAL; - } - - *enrolled_password_handle = response.enrolled_password_handle.buffer.release(); - *enrolled_password_handle_length = response.enrolled_password_handle.length; - - - return 0; +SizedBuffer hidl_vec2sized_buffer(const hidl_vec& vec) { + if (vec.size() == 0 || vec.size() > std::numeric_limits::max()) return {}; + auto dummy = new uint8_t[vec.size()]; + std::copy(vec.begin(), vec.end(), dummy); + return {dummy, static_cast(vec.size())}; } -int TrustyGateKeeperDevice::Verify(uint32_t uid, uint64_t challenge, - const uint8_t *enrolled_password_handle, uint32_t enrolled_password_handle_length, - const uint8_t *provided_password, uint32_t provided_password_length, - uint8_t **auth_token, uint32_t *auth_token_length, bool *request_reenroll) { +Return TrustyGateKeeperDevice::enroll(uint32_t uid, + const hidl_vec& currentPasswordHandle, + const hidl_vec& currentPassword, + const hidl_vec& desiredPassword, + enroll_cb _hidl_cb) { if (error_ != 0) { - return error_; + _hidl_cb({GatekeeperStatusCode::ERROR_GENERAL_FAILURE, 0, {}}); + return {}; } - SizedBuffer password_handle_buffer(enrolled_password_handle_length); - memcpy(password_handle_buffer.buffer.get(), enrolled_password_handle, - enrolled_password_handle_length); - SizedBuffer provided_password_buffer(provided_password_length); - memcpy(provided_password_buffer.buffer.get(), provided_password, provided_password_length); + if (desiredPassword.size() == 0) { + _hidl_cb({GatekeeperStatusCode::ERROR_GENERAL_FAILURE, 0, {}}); + return {}; + } - VerifyRequest request(uid, challenge, &password_handle_buffer, &provided_password_buffer); + EnrollRequest request(uid, hidl_vec2sized_buffer(currentPasswordHandle), + hidl_vec2sized_buffer(desiredPassword), + hidl_vec2sized_buffer(currentPassword)); + EnrollResponse response; + auto error = Send(request, &response); + if (error != ERROR_NONE) { + _hidl_cb({GatekeeperStatusCode::ERROR_GENERAL_FAILURE, 0, {}}); + } else if (response.error == ERROR_RETRY) { + _hidl_cb({GatekeeperStatusCode::ERROR_RETRY_TIMEOUT, response.retry_timeout, {}}); + } else if (response.error != ERROR_NONE) { + _hidl_cb({GatekeeperStatusCode::ERROR_GENERAL_FAILURE, 0, {}}); + } else { + hidl_vec new_handle(response.enrolled_password_handle.Data(), + response.enrolled_password_handle.Data() + + response.enrolled_password_handle.size()); + _hidl_cb({GatekeeperStatusCode::STATUS_OK, response.retry_timeout, new_handle}); + } + return {}; +} + +Return TrustyGateKeeperDevice::verify( + uint32_t uid, uint64_t challenge, + const ::android::hardware::hidl_vec& enrolledPasswordHandle, + const ::android::hardware::hidl_vec& providedPassword, verify_cb _hidl_cb) { + if (error_ != 0) { + _hidl_cb({GatekeeperStatusCode::ERROR_GENERAL_FAILURE, 0, {}}); + return {}; + } + + if (enrolledPasswordHandle.size() == 0) { + _hidl_cb({GatekeeperStatusCode::ERROR_GENERAL_FAILURE, 0, {}}); + return {}; + } + + VerifyRequest request(uid, challenge, hidl_vec2sized_buffer(enrolledPasswordHandle), + hidl_vec2sized_buffer(providedPassword)); VerifyResponse response; - gatekeeper_error_t error = Send(request, &response); + auto error = Send(request, &response); + if (error != ERROR_NONE) { + _hidl_cb({GatekeeperStatusCode::ERROR_GENERAL_FAILURE, 0, {}}); + } else if (response.error == ERROR_RETRY) { + _hidl_cb({GatekeeperStatusCode::ERROR_RETRY_TIMEOUT, response.retry_timeout, {}}); + } else if (response.error != ERROR_NONE) { + _hidl_cb({GatekeeperStatusCode::ERROR_GENERAL_FAILURE, 0, {}}); + } else { + hidl_vec auth_token( + response.auth_token.Data(), + response.auth_token.Data() + response.auth_token.size()); - if (error == ERROR_RETRY) { - return response.retry_timeout; - } else if (error != ERROR_NONE) { - return -EINVAL; + _hidl_cb({response.request_reenroll ? GatekeeperStatusCode::STATUS_REENROLL + : GatekeeperStatusCode::STATUS_OK, + response.retry_timeout, auth_token}); } + return {}; +} - if (auth_token != NULL && auth_token_length != NULL) { - *auth_token = response.auth_token.buffer.release(); - *auth_token_length = response.auth_token.length; - } +Return TrustyGateKeeperDevice::deleteUser(uint32_t /*uid*/, deleteUser_cb _hidl_cb) { + _hidl_cb({GatekeeperStatusCode::ERROR_NOT_IMPLEMENTED, 0, {}}); + return {}; +} - if (request_reenroll != NULL) { - *request_reenroll = response.request_reenroll; - } - - return 0; +Return TrustyGateKeeperDevice::deleteAllUsers(deleteAllUsers_cb _hidl_cb) { + _hidl_cb({GatekeeperStatusCode::ERROR_NOT_IMPLEMENTED, 0, {}}); + return {}; } gatekeeper_error_t TrustyGateKeeperDevice::Send(uint32_t command, const GateKeeperMessage& request, @@ -172,7 +156,7 @@ gatekeeper_error_t TrustyGateKeeperDevice::Send(uint32_t command, const GateKeep uint32_t response_size = RECV_BUF_SIZE; int rc = trusty_gatekeeper_call(command, send_buf, request_size, recv_buf, &response_size); if (rc < 0) { - ALOGE("error (%d) calling gatekeeper TA", rc); + LOG(ERROR) << "error (" << rc << ") calling gatekeeper TA"; return ERROR_INVALID; } @@ -182,51 +166,4 @@ gatekeeper_error_t TrustyGateKeeperDevice::Send(uint32_t command, const GateKeep return response->Deserialize(payload, payload + response_size); } -static inline TrustyGateKeeperDevice *convert_device(const gatekeeper_device *dev) { - return reinterpret_cast(const_cast(dev)); -} - -/* static */ -int TrustyGateKeeperDevice::enroll(const struct gatekeeper_device *dev, uint32_t uid, - const uint8_t *current_password_handle, uint32_t current_password_handle_length, - const uint8_t *current_password, uint32_t current_password_length, - const uint8_t *desired_password, uint32_t desired_password_length, - uint8_t **enrolled_password_handle, uint32_t *enrolled_password_handle_length) { - - if (dev == NULL || - enrolled_password_handle == NULL || enrolled_password_handle_length == NULL || - desired_password == NULL || desired_password_length == 0) - return -EINVAL; - - // Current password and current password handle go together - if (current_password_handle == NULL || current_password_handle_length == 0 || - current_password == NULL || current_password_length == 0) { - current_password_handle = NULL; - current_password_handle_length = 0; - current_password = NULL; - current_password_length = 0; - } - - return convert_device(dev)->Enroll(uid, current_password_handle, current_password_handle_length, - current_password, current_password_length, desired_password, desired_password_length, - enrolled_password_handle, enrolled_password_handle_length); - -} - -/* static */ -int TrustyGateKeeperDevice::verify(const struct gatekeeper_device *dev, uint32_t uid, - uint64_t challenge, const uint8_t *enrolled_password_handle, - uint32_t enrolled_password_handle_length, const uint8_t *provided_password, - uint32_t provided_password_length, uint8_t **auth_token, uint32_t *auth_token_length, - bool *request_reenroll) { - - if (dev == NULL || enrolled_password_handle == NULL || - provided_password == NULL) { - return -EINVAL; - } - - return convert_device(dev)->Verify(uid, challenge, enrolled_password_handle, - enrolled_password_handle_length, provided_password, provided_password_length, - auth_token, auth_token_length, request_reenroll); -} }; diff --git a/trusty/gatekeeper/trusty_gatekeeper.h b/trusty/gatekeeper/trusty_gatekeeper.h index 2becc49a1..c0713f4b9 100644 --- a/trusty/gatekeeper/trusty_gatekeeper.h +++ b/trusty/gatekeeper/trusty_gatekeeper.h @@ -17,84 +17,34 @@ #ifndef TRUSTY_GATEKEEPER_H #define TRUSTY_GATEKEEPER_H -#include +#include +#include + +#include + #include #include "gatekeeper_ipc.h" namespace gatekeeper { -class TrustyGateKeeperDevice { - public: - - explicit TrustyGateKeeperDevice(const hw_module_t* module); +class TrustyGateKeeperDevice : public ::android::hardware::gatekeeper::V1_0::IGatekeeper { + public: + explicit TrustyGateKeeperDevice(); ~TrustyGateKeeperDevice(); - - hw_device_t* hw_device(); - /** * Enrolls password_payload, which should be derived from a user selected pin or password, * with the authentication factor private key used only for enrolling authentication * factor data. * * Returns: 0 on success or an error code less than 0 on error. - * On error, enrolled_password will not be allocated. - */ - int Enroll(uint32_t uid, const uint8_t *current_password_handle, - uint32_t current_password_handle_length, const uint8_t *current_password, - uint32_t current_password_length, const uint8_t *desired_password, - uint32_t desired_password_length, uint8_t **enrolled_password_handle, - uint32_t *enrolled_password_handle_length); - - /** - * Verifies provided_password matches expected_password after enrolling - * with the authentication factor private key. - * - * Implementations of this module may retain the result of this call - * to attest to the recency of authentication. - * - * On success, writes the address of a verification token to verification_token, - * - * Returns: 0 on success or an error code less than 0 on error - * On error, verification token will not be allocated - */ - int Verify(uint32_t uid, uint64_t challenge, const uint8_t *enrolled_password_handle, - uint32_t enrolled_password_handle_length, const uint8_t *provided_password, - uint32_t provided_password_length, uint8_t **auth_token, uint32_t *auth_token_length, - bool *request_reenroll); - - private: - - gatekeeper_error_t Send(uint32_t command, const GateKeeperMessage& request, - GateKeeperMessage* response); - - gatekeeper_error_t Send(const EnrollRequest& request, EnrollResponse *response) { - return Send(GK_ENROLL, request, response); - } - - gatekeeper_error_t Send(const VerifyRequest& request, VerifyResponse *response) { - return Send(GK_VERIFY, request, response); - } - - // Static methods interfacing the HAL API with the TrustyGateKeeper device - - /** - * Enrolls desired_password, which should be derived from a user selected pin or password, - * with the authentication factor private key used only for enrolling authentication - * factor data. - * - * If there was already a password enrolled, it should be provided in - * current_password_handle, along with the current password in current_password - * that should validate against current_password_handle. - * - * Returns: 0 on success or an error code less than 0 on error. * On error, enrolled_password_handle will not be allocated. */ - static int enroll(const struct gatekeeper_device *dev, uint32_t uid, - const uint8_t *current_password_handle, uint32_t current_password_handle_length, - const uint8_t *current_password, uint32_t current_password_length, - const uint8_t *desired_password, uint32_t desired_password_length, - uint8_t **enrolled_password_handle, uint32_t *enrolled_password_handle_length); + ::android::hardware::Return enroll( + uint32_t uid, const ::android::hardware::hidl_vec& currentPasswordHandle, + const ::android::hardware::hidl_vec& currentPassword, + const ::android::hardware::hidl_vec& desiredPassword, + enroll_cb _hidl_cb) override; /** * Verifies provided_password matches enrolled_password_handle. @@ -109,18 +59,32 @@ class TrustyGateKeeperDevice { * Returns: 0 on success or an error code less than 0 on error * On error, verification token will not be allocated */ - static int verify(const struct gatekeeper_device *dev, uint32_t uid, uint64_t challenge, - const uint8_t *enrolled_password_handle, uint32_t enrolled_password_handle_length, - const uint8_t *provided_password, uint32_t provided_password_length, - uint8_t **auth_token, uint32_t *auth_token_length, bool *request_reenroll); + ::android::hardware::Return verify( + uint32_t uid, uint64_t challenge, + const ::android::hardware::hidl_vec& enrolledPasswordHandle, + const ::android::hardware::hidl_vec& providedPassword, + verify_cb _hidl_cb) override; - static int close_device(hw_device_t* dev); + ::android::hardware::Return deleteUser(uint32_t uid, deleteUser_cb _hidl_cb) override; + + ::android::hardware::Return deleteAllUsers(deleteAllUsers_cb _hidl_cb) override; + + private: + gatekeeper_error_t Send(uint32_t command, const GateKeeperMessage& request, + GateKeeperMessage* response); + + gatekeeper_error_t Send(const EnrollRequest& request, EnrollResponse *response) { + return Send(GK_ENROLL, request, response); + } + + gatekeeper_error_t Send(const VerifyRequest& request, VerifyResponse *response) { + return Send(GK_VERIFY, request, response); + } - gatekeeper_device device_; int error_; - }; -} + +} // namespace gatekeeper #endif diff --git a/trusty/trusty-base.mk b/trusty/trusty-base.mk index 445d3ced1..fd8daa84a 100644 --- a/trusty/trusty-base.mk +++ b/trusty/trusty-base.mk @@ -24,9 +24,7 @@ PRODUCT_PACKAGES += \ android.hardware.keymaster@4.0-service.trusty \ - android.hardware.gatekeeper@1.0-service \ - android.hardware.gatekeeper@1.0-impl \ - gatekeeper.trusty + android.hardware.gatekeeper@1.0-service.trusty PRODUCT_PROPERTY_OVERRIDES += \ ro.hardware.keystore=trusty \ From db825ceba694eb6abe4ecff45fc4e1121646385f Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 30 Jul 2019 15:27:39 +0900 Subject: [PATCH 007/388] Don't fail if default namespace isn't found This fixes a regression caused by 8f4afc8298ebae34e8f944a0807943997908c67d that libnativeloader can't no longer handle the case that it has failed to find the default namespace. Previously before the change, libnativeloader continued to use nullptr as the parent namespace which is reconized as the default namespace inside the linker. This change recovers the previous behavior. When the default namespace is not found, NativeLoaderNamespace object is constructed from nullptr. Bug: 138607234 Test: run app-compat/app-startup-gce on cf_x86_phone using forrest Change-Id: If518fbc055399b73e7d3a6b45ace0f71e9c25dae --- libnativeloader/native_loader_namespace.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libnativeloader/native_loader_namespace.cpp b/libnativeloader/native_loader_namespace.cpp index 4b0211670..4add6e690 100644 --- a/libnativeloader/native_loader_namespace.cpp +++ b/libnativeloader/native_loader_namespace.cpp @@ -69,10 +69,18 @@ Result NativeLoaderNamespace::GetExportedNamespace(const // "default" always exists. Result NativeLoaderNamespace::GetPlatformNamespace(bool is_bridged) { auto ns = GetExportedNamespace(kPlatformNamespaceName, is_bridged); - if (!ns) { - ns = GetExportedNamespace(kDefaultNamespaceName, is_bridged); + if (ns) return ns; + ns = GetExportedNamespace(kDefaultNamespaceName, is_bridged); + if (ns) return ns; + + // If nothing is found, return NativeLoaderNamespace constructed from nullptr. + // nullptr also means default namespace to the linker. + if (!is_bridged) { + return NativeLoaderNamespace(kDefaultNamespaceName, static_cast(nullptr)); + } else { + return NativeLoaderNamespace(kDefaultNamespaceName, + static_cast(nullptr)); } - return ns; } Result NativeLoaderNamespace::Create( From f711999132f148448bfb5df164163976b6d20b50 Mon Sep 17 00:00:00 2001 From: Inseob Kim Date: Tue, 30 Jul 2019 19:17:58 +0900 Subject: [PATCH 008/388] Implement sysprop_library API stability check sysprop_library now checks the API stability itself, cutting dependency on java_sdk_library. Under the directory {module_dir}/api, {module_name}-current.txt and {module_name}-latest.txt hold API signatures. When sysprop_library is built, or a user run "m {module_name}-check-api" command, API check is performed. First, current.txt must have exactly same signature with built sysprop_library module. Second, current.txt must be compatible with latest.txt. Build system emits a handy error message to generate/update those API files, in case of missing or mismatching. Also, a script file for freezing API files is introduced. Bug: 131637873 Test: 1) m && boot blueline Test: 2) m {sysprop_library} performs API check Test: 3) manual test for check-api, freezing api Change-Id: I6b95eebafaf88ad326be5d7c890e000cbdb79cb5 --- healthd/api/charger_sysprop-current.txt | 29 +++++++++++++++++++++++++ healthd/api/charger_sysprop-latest.txt | 29 +++++++++++++++++++++++++ healthd/api/current.txt | 1 - healthd/api/removed.txt | 1 - healthd/api/system-current.txt | 1 - healthd/api/system-removed.txt | 1 - healthd/api/test-current.txt | 1 - healthd/api/test-removed.txt | 1 - 8 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 healthd/api/charger_sysprop-current.txt create mode 100644 healthd/api/charger_sysprop-latest.txt delete mode 100644 healthd/api/current.txt delete mode 100644 healthd/api/removed.txt delete mode 100644 healthd/api/system-current.txt delete mode 100644 healthd/api/system-removed.txt delete mode 100644 healthd/api/test-current.txt delete mode 100644 healthd/api/test-removed.txt diff --git a/healthd/api/charger_sysprop-current.txt b/healthd/api/charger_sysprop-current.txt new file mode 100644 index 000000000..678c847cd --- /dev/null +++ b/healthd/api/charger_sysprop-current.txt @@ -0,0 +1,29 @@ +props { + module: "android.sysprop.ChargerProperties" + prop { + api_name: "disable_init_blank" + scope: Internal + prop_name: "ro.charger.disable_init_blank" + } + prop { + api_name: "draw_split_offset" + type: Long + scope: Internal + prop_name: "ro.charger.draw_split_offset" + } + prop { + api_name: "draw_split_screen" + scope: Internal + prop_name: "ro.charger.draw_split_screen" + } + prop { + api_name: "enable_suspend" + scope: Internal + prop_name: "ro.charger.enable_suspend" + } + prop { + api_name: "no_ui" + scope: Internal + prop_name: "ro.charger.no_ui" + } +} diff --git a/healthd/api/charger_sysprop-latest.txt b/healthd/api/charger_sysprop-latest.txt new file mode 100644 index 000000000..678c847cd --- /dev/null +++ b/healthd/api/charger_sysprop-latest.txt @@ -0,0 +1,29 @@ +props { + module: "android.sysprop.ChargerProperties" + prop { + api_name: "disable_init_blank" + scope: Internal + prop_name: "ro.charger.disable_init_blank" + } + prop { + api_name: "draw_split_offset" + type: Long + scope: Internal + prop_name: "ro.charger.draw_split_offset" + } + prop { + api_name: "draw_split_screen" + scope: Internal + prop_name: "ro.charger.draw_split_screen" + } + prop { + api_name: "enable_suspend" + scope: Internal + prop_name: "ro.charger.enable_suspend" + } + prop { + api_name: "no_ui" + scope: Internal + prop_name: "ro.charger.no_ui" + } +} diff --git a/healthd/api/current.txt b/healthd/api/current.txt deleted file mode 100644 index d802177e2..000000000 --- a/healthd/api/current.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/healthd/api/removed.txt b/healthd/api/removed.txt deleted file mode 100644 index d802177e2..000000000 --- a/healthd/api/removed.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/healthd/api/system-current.txt b/healthd/api/system-current.txt deleted file mode 100644 index d802177e2..000000000 --- a/healthd/api/system-current.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/healthd/api/system-removed.txt b/healthd/api/system-removed.txt deleted file mode 100644 index d802177e2..000000000 --- a/healthd/api/system-removed.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/healthd/api/test-current.txt b/healthd/api/test-current.txt deleted file mode 100644 index d802177e2..000000000 --- a/healthd/api/test-current.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/healthd/api/test-removed.txt b/healthd/api/test-removed.txt deleted file mode 100644 index d802177e2..000000000 --- a/healthd/api/test-removed.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 From 7bf42f148a1ad0dd0a33ccf4f1c73fc603ff4194 Mon Sep 17 00:00:00 2001 From: Paul Crowley Date: Fri, 9 Aug 2019 14:13:41 -0700 Subject: [PATCH 009/388] Create the rollback directories in init Init sets the encryption policy on these directores when created. Bug: b/139193659 Test: Boot device without this, then try to boot with it without wiping. Change-Id: I6b26710674b51d62fa4a07b06e06c539571fb7ac --- rootdir/init.rc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rootdir/init.rc b/rootdir/init.rc index ba505ded1..3f31eae2f 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -609,6 +609,9 @@ on post-fs-data mkdir /data/cache/backup_stage 0700 system system mkdir /data/cache/backup 0700 system system + mkdir /data/rollback 0700 system system + mkdir /data/rollback-observer 0700 system system + # Wait for apexd to finish activating APEXes before starting more processes. wait_for_prop apexd.status ready parse_apex_configs From 2167b9082dcbe12a6e4f7f966ae6a39ec241d126 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Mon, 19 Aug 2019 14:37:19 +0200 Subject: [PATCH 010/388] adb: fix mac build Ensure that off64_t is defined when building adb for mac Fixes: 139646013 Test: make # On mac Change-Id: I32b68738d71c8a63a35c22434092933dcabac1ce --- adb/sysdeps.h | 1 + 1 file changed, 1 insertion(+) diff --git a/adb/sysdeps.h b/adb/sysdeps.h index b08a13b9c..987f9942b 100644 --- a/adb/sysdeps.h +++ b/adb/sysdeps.h @@ -33,6 +33,7 @@ // Include this before open/close/unlink are defined as macros below. #include #include +#include #include #include From d62804fe9eb2c206b60f5b618d5d3491499c19c2 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Wed, 17 Jul 2019 22:17:58 +0100 Subject: [PATCH 011/388] Update paths and names for the new ART APEX. Test: Build & boot Test: atest CtsJniTestCases Bug: 135753770 Change-Id: Ic59b7bc8aae7ce521cf3ec9df4ab72aa611d0b75 --- init/mount_namespace.cpp | 14 +++++++------- libnativeloader/native_loader.cpp | 4 ++++ libnativeloader/public_libraries.cpp | 16 ++++++++-------- rootdir/Android.mk | 8 ++++---- rootdir/etc/ld.config.legacy.txt | 4 ++-- rootdir/etc/ld.config.txt | 12 ++++++------ rootdir/etc/ld.config.vndk_lite.txt | 12 ++++++------ rootdir/init.environ.rc.in | 2 +- 8 files changed, 38 insertions(+), 34 deletions(-) diff --git a/init/mount_namespace.cpp b/init/mount_namespace.cpp index 12144c120..0745148bd 100644 --- a/init/mount_namespace.cpp +++ b/init/mount_namespace.cpp @@ -91,22 +91,22 @@ static bool ActivateFlattenedApexesIfPossible() { return false; } - // Special casing for the runtime APEX - constexpr const char kRuntimeApexMountPath[] = "/system/apex/com.android.runtime"; - static const std::vector kRuntimeApexDirNames = {"com.android.runtime.release", - "com.android.runtime.debug"}; + // Special casing for the ART APEX + constexpr const char kArtApexMountPath[] = "/system/apex/com.android.art"; + static const std::vector kArtApexDirNames = {"com.android.art.release", + "com.android.art.debug"}; bool success = false; - for (const auto& name : kRuntimeApexDirNames) { + for (const auto& name : kArtApexDirNames) { std::string path = std::string(kSystemApex) + "/" + name; if (access(path.c_str(), F_OK) == 0) { - if (mount(path.c_str(), kRuntimeApexMountPath, nullptr, MS_BIND, nullptr) == 0) { + if (mount(path.c_str(), kArtApexMountPath, nullptr, MS_BIND, nullptr) == 0) { success = true; break; } } } if (!success) { - PLOG(ERROR) << "Failed to bind mount the runtime APEX to " << kRuntimeApexMountPath; + PLOG(ERROR) << "Failed to bind mount the ART APEX to " << kArtApexMountPath; } return success; } diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index 6d3c057b9..60d462f87 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -63,6 +63,10 @@ android_namespace_t* FindExportedNamespace(const char* caller_location) { LOG_ALWAYS_FATAL_IF((dot_index == std::string::npos), "Error finding namespace of apex: no dot in apex name %s", caller_location); std::string name = location.substr(dot_index + 1, slash_index - dot_index - 1); + // TODO(b/139408016): Rename the runtime namespace to "art". + if (name == "art") { + name = "runtime"; + } android_namespace_t* boot_namespace = android_get_exported_namespace(name.c_str()); LOG_ALWAYS_FATAL_IF((boot_namespace == nullptr), "Error finding namespace of apex: no namespace called %s", name.c_str()); diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp index 6cee668a1..59ea90061 100644 --- a/libnativeloader/public_libraries.cpp +++ b/libnativeloader/public_libraries.cpp @@ -48,12 +48,12 @@ constexpr const char* kVendorPublicLibrariesFile = "/vendor/etc/public.libraries constexpr const char* kLlndkLibrariesFile = "/system/etc/llndk.libraries.txt"; constexpr const char* kVndkLibrariesFile = "/system/etc/vndksp.libraries.txt"; -const std::vector kRuntimePublicLibraries = { +const std::vector kArtApexPublicLibraries = { "libicuuc.so", "libicui18n.so", }; -constexpr const char* kRuntimeApexLibPath = "/apex/com.android.runtime/" LIB; +constexpr const char* kArtApexLibPath = "/apex/com.android.art/" LIB; constexpr const char* kNeuralNetworksApexPublicLibrary = "libneuralnetworks.so"; @@ -206,8 +206,8 @@ static std::string InitDefaultPublicLibraries() { // For example, libicuuc.so is exposed to classloader namespace from runtime namespace. // Unfortunately, it does not have stable C symbols, and default namespace should only use // stable symbols in libandroidicu.so. http://b/120786417 - for (const std::string& lib_name : kRuntimePublicLibraries) { - std::string path(kRuntimeApexLibPath); + for (const std::string& lib_name : kArtApexPublicLibraries) { + std::string path(kArtApexLibPath); path.append("/").append(lib_name); struct stat s; @@ -231,9 +231,9 @@ static std::string InitDefaultPublicLibraries() { return android::base::Join(*sonames, ':'); } -static std::string InitRuntimePublicLibraries() { - CHECK(sizeof(kRuntimePublicLibraries) > 0); - std::string list = android::base::Join(kRuntimePublicLibraries, ":"); +static std::string InitArtPublicLibraries() { + CHECK(sizeof(kArtApexPublicLibraries) > 0); + std::string list = android::base::Join(kArtApexPublicLibraries, ":"); std::string additional_libs = additional_public_libraries(); if (!additional_libs.empty()) { @@ -296,7 +296,7 @@ const std::string& default_public_libraries() { } const std::string& runtime_public_libraries() { - static std::string list = InitRuntimePublicLibraries(); + static std::string list = InitArtPublicLibraries(); return list; } diff --git a/rootdir/Android.mk b/rootdir/Android.mk index 455905048..2fa110b0e 100644 --- a/rootdir/Android.mk +++ b/rootdir/Android.mk @@ -214,7 +214,7 @@ LOCAL_MODULE := ld.config.txt LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) -# Start of runtime APEX compatibility. +# Start of i18n and ART APEX compatibility. # # Meta-comment: # The placing of this section is somewhat arbitrary. The LOCAL_POST_INSTALL_CMD @@ -226,7 +226,7 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) # come to rely on them. # http://b/121248172 - create a link from /system/usr/icu to -# /apex/com.android.runtime/etc/icu so that apps can find the ICU .dat file. +# /apex/com.android.i18n/etc/icu so that apps can find the ICU .dat file. # A symlink can't overwrite a directory and the /system/usr/icu directory once # existed so the required structure must be created whatever we find. LOCAL_POST_INSTALL_CMD = mkdir -p $(TARGET_OUT)/usr && rm -rf $(TARGET_OUT)/usr/icu @@ -248,10 +248,10 @@ ART_BINARIES := \ LOCAL_POST_INSTALL_CMD += && mkdir -p $(TARGET_OUT)/bin $(foreach b,$(ART_BINARIES), \ $(eval LOCAL_POST_INSTALL_CMD += \ - && ln -sf /apex/com.android.runtime/bin/$(b) $(TARGET_OUT)/bin/$(b)) \ + && ln -sf /apex/com.android.art/bin/$(b) $(TARGET_OUT)/bin/$(b)) \ ) -# End of runtime APEX compatibilty. +# End of i18n and ART APEX compatibilty. ifeq ($(_enforce_vndk_at_runtime),true) diff --git a/rootdir/etc/ld.config.legacy.txt b/rootdir/etc/ld.config.legacy.txt index f0b1fd292..6ab998874 100644 --- a/rootdir/etc/ld.config.legacy.txt +++ b/rootdir/etc/ld.config.legacy.txt @@ -85,8 +85,8 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} namespace.runtime.links = default # Need allow_all_shared_libs because libart.so can dlopen oat files in # /system/framework and /data. diff --git a/rootdir/etc/ld.config.txt b/rootdir/etc/ld.config.txt index 1c6bd3032..783d1c38b 100644 --- a/rootdir/etc/ld.config.txt +++ b/rootdir/etc/ld.config.txt @@ -166,8 +166,8 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} namespace.runtime.links = default # Need allow_all_shared_libs because libart.so can dlopen oat files in # /system/framework and /data. @@ -491,8 +491,8 @@ namespace.default.link.neuralnetworks.shared_libs = libneuralnetworks.so ############################################################################### namespace.runtime.isolated = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} namespace.runtime.links = system # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. @@ -698,8 +698,8 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} namespace.runtime.links = default # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. diff --git a/rootdir/etc/ld.config.vndk_lite.txt b/rootdir/etc/ld.config.vndk_lite.txt index 0bb60ab99..be9dbade3 100644 --- a/rootdir/etc/ld.config.vndk_lite.txt +++ b/rootdir/etc/ld.config.vndk_lite.txt @@ -105,8 +105,8 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} namespace.runtime.links = default # Need allow_all_shared_libs because libart.so can dlopen oat files in # /system/framework and /data. @@ -421,8 +421,8 @@ namespace.default.link.neuralnetworks.shared_libs = libneuralnetworks.so ############################################################################### namespace.runtime.isolated = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} namespace.runtime.links = default # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. @@ -505,8 +505,8 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.runtime/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.runtime/${LIB} +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} namespace.runtime.links = default # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. diff --git a/rootdir/init.environ.rc.in b/rootdir/init.environ.rc.in index 93b7f43f0..17f65960d 100644 --- a/rootdir/init.environ.rc.in +++ b/rootdir/init.environ.rc.in @@ -5,7 +5,7 @@ on early-init export ANDROID_ASSETS /system/app export ANDROID_DATA /data export ANDROID_STORAGE /storage - export ANDROID_RUNTIME_ROOT /apex/com.android.runtime + export ANDROID_RUNTIME_ROOT /apex/com.android.art export ANDROID_I18N_ROOT /apex/com.android.i18n export ANDROID_TZDATA_ROOT /apex/com.android.tzdata export EXTERNAL_STORAGE /sdcard From b0c7da28e88f4aa8b9e53392167c327aa85f0757 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Wed, 21 Aug 2019 18:34:31 +0100 Subject: [PATCH 012/388] Update logic for detecting pre-apexd services to check that the ART APEX is mounted. Necessary to make e.g. bootanimation work, which depends on (at least) libandroidicu.so in the ART APEX. Test: Build & boot Bug: 135753770 Change-Id: Ibab4f5f7a243d0815b9c70a537bae8d77dee2fbb --- init/service.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/init/service.cpp b/init/service.cpp index 9537843a1..7a209664e 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -116,9 +116,10 @@ static bool ExpandArgsAndExecv(const std::vector& args, bool sigsto return execv(c_strings[0], c_strings.data()) == 0; } -static bool IsRuntimeApexReady() { +static bool AreRuntimeApexesReady() { struct stat buf; - return stat("/apex/com.android.runtime/", &buf) == 0; + return stat("/apex/com.android.art/", &buf) == 0 && + stat("/apex/com.android.runtime/", &buf) == 0; } unsigned long Service::next_start_order_ = 1; @@ -406,11 +407,11 @@ Result Service::Start() { scon = *result; } - if (!IsRuntimeApexReady() && !pre_apexd_) { - // If this service is started before the runtime APEX gets available, - // mark it as pre-apexd one. Note that this marking is permanent. So - // for example, if the service is re-launched (e.g., due to crash), - // it is still recognized as pre-apexd... for consistency. + if (!AreRuntimeApexesReady() && !pre_apexd_) { + // If this service is started before the Runtime and ART APEXes get + // available, mark it as pre-apexd one. Note that this marking is + // permanent. So for example, if the service is re-launched (e.g., due + // to crash), it is still recognized as pre-apexd... for consistency. pre_apexd_ = true; } From cd75355c6caa87fb3cce977c7c421856bfbdd538 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 22 Aug 2019 18:32:53 -0700 Subject: [PATCH 013/388] Remove libpixelflinger The last real user of this was libagl, which is going away Change-Id: I73b95ff1d6d17af512ce2226b6324e5da0343c39 --- libpixelflinger/Android.bp | 115 - libpixelflinger/MODULE_LICENSE_APACHE2 | 0 libpixelflinger/NOTICE | 190 -- libpixelflinger/arch-arm64/col32cb16blend.S | 87 - libpixelflinger/arch-arm64/t32cb16blend.S | 213 -- libpixelflinger/arch-mips/col32cb16blend.S | 134 - libpixelflinger/arch-mips/t32cb16blend.S | 273 -- libpixelflinger/arch-mips64/col32cb16blend.S | 108 - libpixelflinger/arch-mips64/t32cb16blend.S | 172 -- libpixelflinger/buffer.cpp | 389 --- libpixelflinger/buffer.h | 39 - libpixelflinger/clear.cpp | 171 -- libpixelflinger/clear.h | 30 - libpixelflinger/codeflinger/ARMAssembler.cpp | 579 ---- libpixelflinger/codeflinger/ARMAssembler.h | 187 -- .../codeflinger/ARMAssemblerInterface.cpp | 90 - .../codeflinger/ARMAssemblerInterface.h | 349 --- .../codeflinger/ARMAssemblerProxy.cpp | 311 --- .../codeflinger/ARMAssemblerProxy.h | 164 -- .../codeflinger/Arm64Assembler.cpp | 1240 --------- libpixelflinger/codeflinger/Arm64Assembler.h | 290 -- .../codeflinger/Arm64Disassembler.cpp | 316 --- .../codeflinger/Arm64Disassembler.h | 35 - libpixelflinger/codeflinger/CodeCache.cpp | 217 -- libpixelflinger/codeflinger/CodeCache.h | 136 - libpixelflinger/codeflinger/GGLAssembler.cpp | 1195 --------- libpixelflinger/codeflinger/GGLAssembler.h | 572 ---- .../codeflinger/MIPS64Assembler.cpp | 1447 ---------- libpixelflinger/codeflinger/MIPS64Assembler.h | 404 --- libpixelflinger/codeflinger/MIPSAssembler.cpp | 1955 -------------- libpixelflinger/codeflinger/MIPSAssembler.h | 557 ---- libpixelflinger/codeflinger/armreg.h | 300 --- libpixelflinger/codeflinger/blending.cpp | 674 ----- libpixelflinger/codeflinger/disassem.c | 714 ----- libpixelflinger/codeflinger/disassem.h | 65 - libpixelflinger/codeflinger/load_store.cpp | 384 --- libpixelflinger/codeflinger/mips64_disassem.c | 584 ---- libpixelflinger/codeflinger/mips64_disassem.h | 56 - libpixelflinger/codeflinger/mips_disassem.c | 592 ---- libpixelflinger/codeflinger/mips_disassem.h | 66 - libpixelflinger/codeflinger/mips_opcode.h | 410 --- libpixelflinger/codeflinger/texturing.cpp | 1261 --------- .../codeflinger/tinyutils/smartpointer.h | 180 -- libpixelflinger/col32cb16blend.S | 77 - libpixelflinger/col32cb16blend_neon.S | 153 -- libpixelflinger/fixed.cpp | 329 --- libpixelflinger/format.cpp | 76 - libpixelflinger/include/pixelflinger/format.h | 136 - .../include/pixelflinger/pixelflinger.h | 330 --- .../private/pixelflinger/ggl_context.h | 565 ---- .../include/private/pixelflinger/ggl_fixed.h | 878 ------ libpixelflinger/picker.cpp | 173 -- libpixelflinger/picker.h | 31 - libpixelflinger/pixelflinger.cpp | 836 ------ libpixelflinger/raster.cpp | 216 -- libpixelflinger/raster.h | 33 - libpixelflinger/scanline.cpp | 2373 ----------------- libpixelflinger/scanline.h | 32 - libpixelflinger/t32cb16blend.S | 203 -- libpixelflinger/tests/Android.bp | 17 - libpixelflinger/tests/arch-arm64/Android.bp | 11 - .../tests/arch-arm64/assembler/Android.bp | 9 - .../assembler/arm64_assembler_test.cpp | 782 ------ .../arch-arm64/assembler/asm_test_jacket.S | 221 -- .../arch-arm64/col32cb16blend/Android.bp | 6 - .../col32cb16blend/col32cb16blend_test.c | 125 - .../tests/arch-arm64/disassembler/Android.bp | 6 - .../disassembler/arm64_diassembler_test.cpp | 321 --- .../tests/arch-arm64/t32cb16blend/Android.bp | 6 - .../t32cb16blend/t32cb16blend_test.c | 134 - libpixelflinger/tests/arch-mips/Android.bp | 11 - .../tests/arch-mips/col32cb16blend/Android.bp | 6 - .../col32cb16blend/col32cb16blend_test.c | 125 - .../tests/arch-mips/t32cb16blend/Android.bp | 6 - .../t32cb16blend/t32cb16blend_test.c | 134 - libpixelflinger/tests/arch-mips64/Android.bp | 11 - .../tests/arch-mips64/assembler/Android.bp | 9 - .../assembler/asm_mips_test_jacket.S | 93 - .../assembler/mips64_assembler_test.cpp | 643 ----- .../arch-mips64/col32cb16blend/Android.bp | 6 - .../col32cb16blend/col32cb16blend_test.c | 125 - .../tests/arch-mips64/disassembler/Android.bp | 6 - .../disassembler/mips64_disassembler_test.cpp | 218 -- libpixelflinger/tests/codegen/Android.bp | 12 - libpixelflinger/tests/codegen/codegen.cpp | 96 - libpixelflinger/tests/gglmul/Android.bp | 12 - libpixelflinger/tests/gglmul/gglmul_test.cpp | 278 -- libpixelflinger/trap.cpp | 1173 -------- libpixelflinger/trap.h | 31 - 89 files changed, 28325 deletions(-) delete mode 100644 libpixelflinger/Android.bp delete mode 100644 libpixelflinger/MODULE_LICENSE_APACHE2 delete mode 100644 libpixelflinger/NOTICE delete mode 100644 libpixelflinger/arch-arm64/col32cb16blend.S delete mode 100644 libpixelflinger/arch-arm64/t32cb16blend.S delete mode 100644 libpixelflinger/arch-mips/col32cb16blend.S delete mode 100644 libpixelflinger/arch-mips/t32cb16blend.S delete mode 100644 libpixelflinger/arch-mips64/col32cb16blend.S delete mode 100644 libpixelflinger/arch-mips64/t32cb16blend.S delete mode 100644 libpixelflinger/buffer.cpp delete mode 100644 libpixelflinger/buffer.h delete mode 100644 libpixelflinger/clear.cpp delete mode 100644 libpixelflinger/clear.h delete mode 100644 libpixelflinger/codeflinger/ARMAssembler.cpp delete mode 100644 libpixelflinger/codeflinger/ARMAssembler.h delete mode 100644 libpixelflinger/codeflinger/ARMAssemblerInterface.cpp delete mode 100644 libpixelflinger/codeflinger/ARMAssemblerInterface.h delete mode 100644 libpixelflinger/codeflinger/ARMAssemblerProxy.cpp delete mode 100644 libpixelflinger/codeflinger/ARMAssemblerProxy.h delete mode 100644 libpixelflinger/codeflinger/Arm64Assembler.cpp delete mode 100644 libpixelflinger/codeflinger/Arm64Assembler.h delete mode 100644 libpixelflinger/codeflinger/Arm64Disassembler.cpp delete mode 100644 libpixelflinger/codeflinger/Arm64Disassembler.h delete mode 100644 libpixelflinger/codeflinger/CodeCache.cpp delete mode 100644 libpixelflinger/codeflinger/CodeCache.h delete mode 100644 libpixelflinger/codeflinger/GGLAssembler.cpp delete mode 100644 libpixelflinger/codeflinger/GGLAssembler.h delete mode 100644 libpixelflinger/codeflinger/MIPS64Assembler.cpp delete mode 100644 libpixelflinger/codeflinger/MIPS64Assembler.h delete mode 100644 libpixelflinger/codeflinger/MIPSAssembler.cpp delete mode 100644 libpixelflinger/codeflinger/MIPSAssembler.h delete mode 100644 libpixelflinger/codeflinger/armreg.h delete mode 100644 libpixelflinger/codeflinger/blending.cpp delete mode 100644 libpixelflinger/codeflinger/disassem.c delete mode 100644 libpixelflinger/codeflinger/disassem.h delete mode 100644 libpixelflinger/codeflinger/load_store.cpp delete mode 100644 libpixelflinger/codeflinger/mips64_disassem.c delete mode 100644 libpixelflinger/codeflinger/mips64_disassem.h delete mode 100644 libpixelflinger/codeflinger/mips_disassem.c delete mode 100644 libpixelflinger/codeflinger/mips_disassem.h delete mode 100644 libpixelflinger/codeflinger/mips_opcode.h delete mode 100644 libpixelflinger/codeflinger/texturing.cpp delete mode 100644 libpixelflinger/codeflinger/tinyutils/smartpointer.h delete mode 100644 libpixelflinger/col32cb16blend.S delete mode 100644 libpixelflinger/col32cb16blend_neon.S delete mode 100644 libpixelflinger/fixed.cpp delete mode 100644 libpixelflinger/format.cpp delete mode 100644 libpixelflinger/include/pixelflinger/format.h delete mode 100644 libpixelflinger/include/pixelflinger/pixelflinger.h delete mode 100644 libpixelflinger/include/private/pixelflinger/ggl_context.h delete mode 100644 libpixelflinger/include/private/pixelflinger/ggl_fixed.h delete mode 100644 libpixelflinger/picker.cpp delete mode 100644 libpixelflinger/picker.h delete mode 100644 libpixelflinger/pixelflinger.cpp delete mode 100644 libpixelflinger/raster.cpp delete mode 100644 libpixelflinger/raster.h delete mode 100644 libpixelflinger/scanline.cpp delete mode 100644 libpixelflinger/scanline.h delete mode 100644 libpixelflinger/t32cb16blend.S delete mode 100644 libpixelflinger/tests/Android.bp delete mode 100644 libpixelflinger/tests/arch-arm64/Android.bp delete mode 100644 libpixelflinger/tests/arch-arm64/assembler/Android.bp delete mode 100644 libpixelflinger/tests/arch-arm64/assembler/arm64_assembler_test.cpp delete mode 100644 libpixelflinger/tests/arch-arm64/assembler/asm_test_jacket.S delete mode 100644 libpixelflinger/tests/arch-arm64/col32cb16blend/Android.bp delete mode 100644 libpixelflinger/tests/arch-arm64/col32cb16blend/col32cb16blend_test.c delete mode 100644 libpixelflinger/tests/arch-arm64/disassembler/Android.bp delete mode 100644 libpixelflinger/tests/arch-arm64/disassembler/arm64_diassembler_test.cpp delete mode 100644 libpixelflinger/tests/arch-arm64/t32cb16blend/Android.bp delete mode 100644 libpixelflinger/tests/arch-arm64/t32cb16blend/t32cb16blend_test.c delete mode 100644 libpixelflinger/tests/arch-mips/Android.bp delete mode 100644 libpixelflinger/tests/arch-mips/col32cb16blend/Android.bp delete mode 100644 libpixelflinger/tests/arch-mips/col32cb16blend/col32cb16blend_test.c delete mode 100644 libpixelflinger/tests/arch-mips/t32cb16blend/Android.bp delete mode 100644 libpixelflinger/tests/arch-mips/t32cb16blend/t32cb16blend_test.c delete mode 100644 libpixelflinger/tests/arch-mips64/Android.bp delete mode 100644 libpixelflinger/tests/arch-mips64/assembler/Android.bp delete mode 100644 libpixelflinger/tests/arch-mips64/assembler/asm_mips_test_jacket.S delete mode 100644 libpixelflinger/tests/arch-mips64/assembler/mips64_assembler_test.cpp delete mode 100644 libpixelflinger/tests/arch-mips64/col32cb16blend/Android.bp delete mode 100644 libpixelflinger/tests/arch-mips64/col32cb16blend/col32cb16blend_test.c delete mode 100644 libpixelflinger/tests/arch-mips64/disassembler/Android.bp delete mode 100644 libpixelflinger/tests/arch-mips64/disassembler/mips64_disassembler_test.cpp delete mode 100644 libpixelflinger/tests/codegen/Android.bp delete mode 100644 libpixelflinger/tests/codegen/codegen.cpp delete mode 100644 libpixelflinger/tests/gglmul/Android.bp delete mode 100644 libpixelflinger/tests/gglmul/gglmul_test.cpp delete mode 100644 libpixelflinger/trap.cpp delete mode 100644 libpixelflinger/trap.h diff --git a/libpixelflinger/Android.bp b/libpixelflinger/Android.bp deleted file mode 100644 index 76d944418..000000000 --- a/libpixelflinger/Android.bp +++ /dev/null @@ -1,115 +0,0 @@ -cc_defaults { - name: "pixelflinger_defaults", - - cflags: [ - "-fstrict-aliasing", - "-fomit-frame-pointer", - "-Wall", - "-Werror", - "-Wno-unused-function", - ], - export_include_dirs: ["include"], - header_libs: ["libbase_headers"], - shared_libs: [ - "libcutils", - "liblog", - "libutils", - ], - - arch: { - arm: { - neon: { - cflags: ["-D__ARM_HAVE_NEON"], - }, - }, - }, -} - -cc_library_static { - name: "libpixelflinger-arm", - defaults: ["pixelflinger_defaults"], - - srcs: [ - "fixed.cpp", - "picker.cpp", - "pixelflinger.cpp", - "trap.cpp", - "scanline.cpp", - ], - - arch: { - arm: { - instruction_set: "arm", - }, - }, -} - -// For the tests to use -cc_library_headers { - name: "libpixelflinger_internal", - export_include_dirs: [ - "include", - ".", - ], -} - -cc_library { - name: "libpixelflinger", - defaults: ["pixelflinger_defaults"], - - srcs: [ - "codeflinger/ARMAssemblerInterface.cpp", - "codeflinger/ARMAssemblerProxy.cpp", - "codeflinger/CodeCache.cpp", - "codeflinger/GGLAssembler.cpp", - "codeflinger/load_store.cpp", - "codeflinger/blending.cpp", - "codeflinger/texturing.cpp", - "format.cpp", - "clear.cpp", - "raster.cpp", - "buffer.cpp", - ], - whole_static_libs: ["libpixelflinger-arm"], - - arch: { - arm: { - srcs: [ - "codeflinger/ARMAssembler.cpp", - "codeflinger/disassem.c", - "col32cb16blend.S", - "t32cb16blend.S", - ], - - neon: { - srcs: ["col32cb16blend_neon.S"], - }, - }, - arm64: { - srcs: [ - "codeflinger/Arm64Assembler.cpp", - "codeflinger/Arm64Disassembler.cpp", - "arch-arm64/col32cb16blend.S", - "arch-arm64/t32cb16blend.S", - ], - }, - mips: { - mips32r6: { - srcs: [ - "codeflinger/MIPSAssembler.cpp", - "codeflinger/mips_disassem.c", - "arch-mips/t32cb16blend.S", - ], - }, - }, - mips64: { - srcs: [ - "codeflinger/MIPSAssembler.cpp", - "codeflinger/MIPS64Assembler.cpp", - "codeflinger/mips64_disassem.c", - "arch-mips64/col32cb16blend.S", - "arch-mips64/t32cb16blend.S", - ], - }, - }, -} diff --git a/libpixelflinger/MODULE_LICENSE_APACHE2 b/libpixelflinger/MODULE_LICENSE_APACHE2 deleted file mode 100644 index e69de29bb..000000000 diff --git a/libpixelflinger/NOTICE b/libpixelflinger/NOTICE deleted file mode 100644 index c5b1efa7a..000000000 --- a/libpixelflinger/NOTICE +++ /dev/null @@ -1,190 +0,0 @@ - - Copyright (c) 2005-2008, 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. - - 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. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/libpixelflinger/arch-arm64/col32cb16blend.S b/libpixelflinger/arch-arm64/col32cb16blend.S deleted file mode 100644 index 84596f90b..000000000 --- a/libpixelflinger/arch-arm64/col32cb16blend.S +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - .text - .balign 0 - - .global scanline_col32cb16blend_arm64 - -// -// This function alpha blends a fixed color into a destination scanline, using -// the formula: -// -// d = s + (((a + (a >> 7)) * d) >> 8) -// -// where d is the destination pixel, -// s is the source color, -// a is the alpha channel of the source color. -// - -// x0 = destination buffer pointer -// w1 = color value -// w2 = count - - -scanline_col32cb16blend_arm64: - - lsr w5, w1, #24 // shift down alpha - mov w9, #0xff // create mask - add w5, w5, w5, lsr #7 // add in top bit - mov w4, #256 // create #0x100 - sub w5, w4, w5 // invert alpha - and w10, w1, #0xff // extract red - and w12, w9, w1, lsr #8 // extract green - and w4, w9, w1, lsr #16 // extract blue - lsl w10, w10, #5 // prescale red - lsl w12, w12, #6 // prescale green - lsl w4, w4, #5 // prescale blue - lsr w9, w9, #2 // create dest green mask - -1: - ldrh w8, [x0] // load dest pixel - subs w2, w2, #1 // decrement loop counter - lsr w6, w8, #11 // extract dest red - and w7, w9, w8, lsr #5 // extract dest green - and w8, w8, #0x1f // extract dest blue - - madd w6, w6, w5, w10 // dest red * alpha + src red - madd w7, w7, w5, w12 // dest green * alpha + src green - madd w8, w8, w5, w4 // dest blue * alpha + src blue - - lsr w6, w6, #8 // shift down red - lsr w7, w7, #8 // shift down green - lsl w6, w6, #11 // shift red into 565 - orr w6, w6, w7, lsl #5 // shift green into 565 - orr w6, w6, w8, lsr #8 // shift blue into 565 - - strh w6, [x0], #2 // store pixel to dest, update ptr - b.ne 1b // if count != 0, loop - - ret - - - diff --git a/libpixelflinger/arch-arm64/t32cb16blend.S b/libpixelflinger/arch-arm64/t32cb16blend.S deleted file mode 100644 index a9733c0e2..000000000 --- a/libpixelflinger/arch-arm64/t32cb16blend.S +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - .text - .balign 0 - - .global scanline_t32cb16blend_arm64 - -/* - * .macro pixel - * - * This macro alpha blends RGB565 original pixel located in either - * top or bottom 16 bits of DREG register with SRC 32 bit pixel value - * and writes the result to FB register - * - * \DREG is a 32-bit register containing *two* original destination RGB565 - * pixels, with the even one in the low-16 bits, and the odd one in the - * high 16 bits. - * - * \SRC is a 32-bit 0xAABBGGRR pixel value, with pre-multiplied colors. - * - * \FB is a target register that will contain the blended pixel values. - * - * \ODD is either 0 or 1 and indicates if we're blending the lower or - * upper 16-bit pixels in DREG into FB - * - * - * clobbered: w6, w7, w15, w16, w17 - * - */ - -.macro pixel, DREG, SRC, FB, ODD - - // SRC = 0xAABBGGRR - lsr w7, \SRC, #24 // sA - add w7, w7, w7, lsr #7 // sA + (sA >> 7) - mov w6, #0x100 - sub w7, w6, w7 // sA = 0x100 - (sA+(sA>>7)) - -1: - -.if \ODD //Blending odd pixel present in top 16 bits of DREG register - - // red - lsr w16, \DREG, #(16 + 11) - mul w16, w7, w16 - lsr w6, \SRC, #3 - and w6, w6, #0x1F - add w16, w6, w16, lsr #8 - cmp w16, #0x1F - orr w17, \FB, #(0x1F<<(16 + 11)) - orr w15, \FB, w16, lsl #(16 + 11) - csel \FB, w17, w15, hi - // green - and w6, \DREG, #(0x3F<<(16 + 5)) - lsr w17,w6,#(16+5) - mul w6, w7, w17 - lsr w16, \SRC, #(8+2) - and w16, w16, #0x3F - add w6, w16, w6, lsr #8 - cmp w6, #0x3F - orr w17, \FB, #(0x3F<<(16 + 5)) - orr w15, \FB, w6, lsl #(16 + 5) - csel \FB, w17, w15, hi - // blue - and w16, \DREG, #(0x1F << 16) - lsr w17,w16,#16 - mul w16, w7, w17 - lsr w6, \SRC, #(8+8+3) - and w6, w6, #0x1F - add w16, w6, w16, lsr #8 - cmp w16, #0x1F - orr w17, \FB, #(0x1F << 16) - orr w15, \FB, w16, lsl #16 - csel \FB, w17, w15, hi - -.else //Blending even pixel present in bottom 16 bits of DREG register - - // red - lsr w16, \DREG, #11 - and w16, w16, #0x1F - mul w16, w7, w16 - lsr w6, \SRC, #3 - and w6, w6, #0x1F - add w16, w6, w16, lsr #8 - cmp w16, #0x1F - mov w17, #(0x1F<<11) - lsl w15, w16, #11 - csel \FB, w17, w15, hi - - - // green - and w6, \DREG, #(0x3F<<5) - mul w6, w7, w6 - lsr w16, \SRC, #(8+2) - and w16, w16, #0x3F - add w6, w16, w6, lsr #(5+8) - cmp w6, #0x3F - orr w17, \FB, #(0x3F<<5) - orr w15, \FB, w6, lsl #5 - csel \FB, w17, w15, hi - - // blue - and w16, \DREG, #0x1F - mul w16, w7, w16 - lsr w6, \SRC, #(8+8+3) - and w6, w6, #0x1F - add w16, w6, w16, lsr #8 - cmp w16, #0x1F - orr w17, \FB, #0x1F - orr w15, \FB, w16 - csel \FB, w17, w15, hi - -.endif // End of blending even pixel - -.endm // End of pixel macro - - -// x0: dst ptr -// x1: src ptr -// w2: count -// w3: d -// w4: s0 -// w5: s1 -// w6: pixel -// w7: pixel -// w8: free -// w9: free -// w10: free -// w11: free -// w12: scratch -// w14: pixel - -scanline_t32cb16blend_arm64: - - // align DST to 32 bits - tst x0, #0x3 - b.eq aligned - subs w2, w2, #1 - b.lo return - -last: - ldr w4, [x1], #4 - ldrh w3, [x0] - pixel w3, w4, w12, 0 - strh w12, [x0], #2 - -aligned: - subs w2, w2, #2 - b.lo 9f - - // The main loop is unrolled twice and processes 4 pixels -8: - ldp w4,w5, [x1], #8 - add x0, x0, #4 - // it's all zero, skip this pixel - orr w3, w4, w5 - cbz w3, 7f - - // load the destination - ldr w3, [x0, #-4] - // stream the destination - pixel w3, w4, w12, 0 - pixel w3, w5, w12, 1 - str w12, [x0, #-4] - - // 2nd iteration of the loop, don't stream anything - subs w2, w2, #2 - csel w4, w5, w4, lt - blt 9f - ldp w4,w5, [x1], #8 - add x0, x0, #4 - orr w3, w4, w5 - cbz w3, 7f - ldr w3, [x0, #-4] - pixel w3, w4, w12, 0 - pixel w3, w5, w12, 1 - str w12, [x0, #-4] - -7: subs w2, w2, #2 - bhs 8b - mov w4, w5 - -9: adds w2, w2, #1 - b.lo return - b last - -return: - ret diff --git a/libpixelflinger/arch-mips/col32cb16blend.S b/libpixelflinger/arch-mips/col32cb16blend.S deleted file mode 100644 index 810294c3a..000000000 --- a/libpixelflinger/arch-mips/col32cb16blend.S +++ /dev/null @@ -1,134 +0,0 @@ -/* -** Copyright 2015, 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. -*/ - - .macro pixel dreg src f sR sG sB shift - -#if __mips==32 && __mips_isa_rev>=2 - /* extract red */ - ext $t4,\src,\shift+11,5 - mul $t4,$t4,\f - - /* extract green */ - ext $t5,\src,\shift+5,6 - mul $t5,$t5,\f - - /* extract blue */ - ext $t6,\src,\shift,5 - mul $t6,$t6,\f -#else - /* extract red */ - srl $t4,\src,\shift+11 - andi $t4, 0x1f - mul $t4,$t4,\f - - /* extract green */ - srl $t5,\src,\shift+5 - andi $t5, 0x3f - mul $t5,$t5,\f - - /* extract blue */ - srl $t6,\src,\shift - andi $t6, 0x1f - mul $t6,$t6,\f -#endif - - srl $t4,$t4,8 - srl $t5,$t5,8 - srl $t6,$t6,8 - addu $t4,$t4,\sR - addu $t5,$t5,\sG - addu \dreg,$t6,\sB - sll $t4,$t4,11 - sll $t5,$t5,5 - or \dreg,\dreg,$t4 - or \dreg,\dreg,$t5 - andi \dreg, 0xffff - .endm - - .text - .balign 4 - - .global scanline_col32cb16blend_mips - .ent scanline_col32cb16blend_mips -scanline_col32cb16blend_mips: - - /* check if count is zero */ - srl $v0,$a1,24 /* sA */ - beqz $a2,done - li $t4, 0x100 - srl $v1,$v0,7 - addu $v0,$v1,$v0 - subu $v0,$t4,$v0 /* f */ -#if __mips==32 && __mips_isa_rev>=2 - ext $a3,$a1,3,5 /* sR */ - ext $t0,$a1,10,6 /* sG */ - ext $t1,$a1,19,5 /* sB */ -#else - srl $a3, $a1, 3 - andi $a3, 0x1f /* sR */ - srl $t0, $a1, 10 - andi $t0, 0x3f /* sG */ - srl $t1, $a1, 19 - andi $t1, 0x1f /* sB */ -#endif - - /* check if cnt is at least 4 */ - addiu $a2,$a2,-4 - bltz $a2,tail - -loop_4pixels: - lw $t7,0($a0) - lw $t8,4($a0) - addiu $a0,$a0,8 - addiu $a2,$a2,-4 - pixel $t2 $t7 $v0 $a3 $t0 $t1 0 - pixel $t3 $t7 $v0 $a3 $t0 $t1 16 -#if __mips==32 && __mips_isa_rev>=2 - ins $t2,$t3,16,16 -#else - sll $t3, 16 - or $t2, $t2, $t3 -#endif - pixel $t7 $t8 $v0 $a3 $t0 $t1 0 - pixel $t3 $t8 $v0 $a3 $t0 $t1 16 -#if __mips==32 && __mips_isa_rev>=2 - ins $t7,$t3,16,16 -#else - sll $t3, 16 - or $t7, $t7, $t3 -#endif - sw $t2,-8($a0) - sw $t7,-4($a0) - bgez $a2, loop_4pixels - -tail: - /* the pixel count underran, restore it now */ - addiu $a2,$a2,4 - - /* handle the last 0..3 pixels */ - beqz $a2,done - -loop_1pixel: - lhu $t7,0($a0) - addiu $a0,$a0,2 - addiu $a2,$a2,-1 - pixel $t2 $t7 $v0 $a3 $t0 $t1 0 - sh $t2, -2($a0) - bnez $a2,loop_1pixel - -done: - j $ra - .end scanline_col32cb16blend_mips diff --git a/libpixelflinger/arch-mips/t32cb16blend.S b/libpixelflinger/arch-mips/t32cb16blend.S deleted file mode 100644 index 1d2fb8f39..000000000 --- a/libpixelflinger/arch-mips/t32cb16blend.S +++ /dev/null @@ -1,273 +0,0 @@ -/* libs/pixelflinger/t32cb16blend.S -** -** Copyright 2010, 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. -*/ - -#ifdef DEBUG -#define DBG -#else -#define DBG # -#endif - -/* - * blend one of 2 16bpp RGB pixels held in dreg selected by shift - * with the 32bpp ABGR pixel held in src and store the result in fb - * - * Assumes that the dreg data is little endian and that - * the the second pixel (shift==16) will be merged into - * the fb result - * - * Uses $t0,$t6,$t7,$t8 - */ - -#if __mips==32 && __mips_isa_rev>=2 - .macro pixel dreg src fb shift - /* - * sA = s >> 24 - * f = 0x100 - (sA + (sA>>7)) - */ -DBG .set noat -DBG rdhwr $at,$2 -DBG .set at - - srl $t7,\src,24 - srl $t6,$t7,7 - addu $t7,$t6 - li $t6,0x100 - subu $t7,$t6,$t7 - - /* red */ - ext $t8,\dreg,\shift+6+5,5 # dst[\shift:15..11] - mul $t6,$t8,$t7 - ext $t0,\dreg,\shift+5,6 # start green extraction dst[\shift:10..5] - ext $t8,\src,3,5 # src[7..3] - srl $t6,8 - addu $t8,$t6 -.if \shift!=0 - sll $t8,\shift+11 - or \fb,$t8 -.else - sll \fb,$t8,11 -.endif - - /* green */ - mul $t8,$t0,$t7 - ext $t0,\dreg,\shift,5 # start blue extraction dst[\shift:4..0] - ext $t6,\src,2+8,6 # src[15..10] - srl $t8,8 - addu $t8,$t6 - - /* blue */ - mul $t0,$t0,$t7 - sll $t8, $t8, \shift+5 - or \fb, \fb, $t8 - ext $t6,\src,(3+8+8),5 - srl $t8,$t0,8 - addu $t8,$t6 - sll $t8, $t8, \shift - or \fb, \fb, $t8 - -DBG .set noat -DBG rdhwr $t8,$2 -DBG subu $t8,$at -DBG sltu $at,$t8,$v0 -DBG movn $v0,$t8,$at -DBG sgtu $at,$t8,$v1 -DBG movn $v1,$t8,$at -DBG .set at - .endm - -#else - - .macro pixel dreg src fb shift - /* - * sA = s >> 24 - * f = 0x100 - (sA + (sA>>7)) - */ -DBG .set push -DBG .set noat -DBG .set mips32r2 -DBG rdhwr $at,$2 -DBG .set pop - - srl $t7,\src,24 - srl $t6,$t7,7 - addu $t7,$t6 - li $t6,0x100 - subu $t7,$t6,$t7 - - /* - * red - * dR = (d >> (6 + 5)) & 0x1f; - * dR = (f*dR)>>8 - * sR = (s >> ( 3)) & 0x1f; - * sR += dR - * fb |= sR << 11 - */ - srl $t8,\dreg,\shift+6+5 -.if \shift==0 - and $t8,0x1f -.endif - mul $t8,$t8,$t7 - srl $t6,\src,3 - and $t6,0x1f - srl $t8,8 - addu $t8,$t6 -.if \shift!=0 - sll $t8,\shift+11 - or \fb,$t8 -.else - sll \fb,$t8,11 -.endif - - /* - * green - * dG = (d >> 5) & 0x3f - * dG = (f*dG) >> 8 - * sG = (s >> ( 8+2))&0x3F; - */ - srl $t8,\dreg,\shift+5 - and $t8,0x3f - mul $t8,$t8,$t7 - srl $t6,\src,8+2 - and $t6,0x3f - srl $t8,8 - addu $t8,$t6 - sll $t8,\shift + 5 - or \fb,$t8 - - /* blue */ -.if \shift!=0 - srl $t8,\dreg,\shift - and $t8,0x1f -.else - and $t8,\dreg,0x1f -.endif - mul $t8,$t8,$t7 - srl $t6,\src,(8+8+3) - and $t6,0x1f - srl $t8,8 - addu $t8,$t6 -.if \shift!=0 - sll $t8,\shift -.endif - or \fb,$t8 -DBG .set push -DBG .set noat -DBG .set mips32r2 -DBG rdhwr $t8,$2 -DBG subu $t8,$at -DBG sltu $at,$t8,$v0 -DBG movn $v0,$t8,$at -DBG sgtu $at,$t8,$v1 -DBG movn $v1,$t8,$at -DBG .set pop - .endm -#endif - - .text - .balign 4 - - .global scanline_t32cb16blend_mips - .ent scanline_t32cb16blend_mips -scanline_t32cb16blend_mips: -DBG li $v0,0xffffffff -DBG li $v1,0 - /* Align the destination if necessary */ - and $t0,$a0,3 - beqz $t0,aligned - - /* as long as there is at least one pixel */ - beqz $a2,done - - lw $t4,($a1) - addu $a0,2 - addu $a1,4 - beqz $t4,1f - lhu $t3,-2($a0) - pixel $t3,$t4,$t1,0 - sh $t1,-2($a0) -1: subu $a2,1 - -aligned: - /* Check to see if its worth unrolling the loop */ - subu $a2,4 - bltz $a2,tail - - /* Process 4 pixels at a time */ -fourpixels: - /* 1st pair of pixels */ - lw $t4,0($a1) - lw $t5,4($a1) - addu $a0,8 - addu $a1,16 - - /* both are zero, skip this pair */ - or $t3,$t4,$t5 - beqz $t3,1f - - /* load the destination */ - lw $t3,-8($a0) - - pixel $t3,$t4,$t1,0 - andi $t1, 0xFFFF - pixel $t3,$t5,$t1,16 - sw $t1,-8($a0) - -1: - /* 2nd pair of pixels */ - lw $t4,-8($a1) - lw $t5,-4($a1) - - /* both are zero, skip this pair */ - or $t3,$t4,$t5 - beqz $t3,1f - - /* load the destination */ - lw $t3,-4($a0) - - pixel $t3,$t4,$t1,0 - andi $t1, 0xFFFF - pixel $t3,$t5,$t1,16 - sw $t1,-4($a0) - -1: subu $a2,4 - bgtz $a2,fourpixels - -tail: - /* the pixel count underran, restore it now */ - addu $a2,4 - - /* handle the last 0..3 pixels */ - beqz $a2,done -onepixel: - lw $t4,($a1) - addu $a0,2 - addu $a1,4 - beqz $t4,1f - lhu $t3,-2($a0) - pixel $t3,$t4,$t1,0 - sh $t1,-2($a0) -1: subu $a2,1 - bnez $a2,onepixel -done: -DBG .set push -DBG .set mips32r2 -DBG rdhwr $a0,$3 -DBG mul $v0,$a0 -DBG mul $v1,$a0 -DBG .set pop - j $ra - .end scanline_t32cb16blend_mips diff --git a/libpixelflinger/arch-mips64/col32cb16blend.S b/libpixelflinger/arch-mips64/col32cb16blend.S deleted file mode 100644 index 5baffb183..000000000 --- a/libpixelflinger/arch-mips64/col32cb16blend.S +++ /dev/null @@ -1,108 +0,0 @@ -/* -** Copyright 2015, 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. -*/ - - .macro pixel dreg src f sR sG sB shift - - /* extract red */ -.if \shift < 32 - dext $t0,\src,\shift+11,5 -.else - dextu $t0,\src,\shift+11,5 -.endif - mul $t0,$t0,\f - - /* extract green */ -.if \shift < 32 - dext $t1,\src,\shift+5,6 -.else - dextu $t1,\src,\shift+5,6 -.endif - mul $t1,$t1,\f - - /* extract blue */ -.if \shift < 32 - dext $t2,\src,\shift,5 -.else - dextu $t2,\src,\shift,5 -.endif - mul $t2,$t2,\f - - srl $t0,$t0,8 - srl $t1,$t1,8 - srl $t2,$t2,8 - addu $t0,$t0,\sR - addu $t1,$t1,\sG - addu \dreg,$t2,\sB - sll $t0,$t0,11 - sll $t1,$t1,5 - or \dreg,\dreg,$t0 - or \dreg,\dreg,$t1 - .endm - - .text - .balign 4 - - .global scanline_col32cb16blend_mips64 - .ent scanline_col32cb16blend_mips64 -scanline_col32cb16blend_mips64: - - /* check if count is zero */ - srl $v0,$a1,24 /* sA */ - beqz $a2,done - li $t0, 0x100 - srl $v1,$v0,7 - addu $v0,$v1,$v0 - subu $v0,$t0,$v0 /* f */ - ext $a3,$a1,3,5 /* sR */ - ext $a4,$a1,10,6 /* sG */ - ext $a5,$a1,19,5 /* sB */ - - /* check if cnt is at least 4 */ - addiu $a2,$a2,-4 - bltz $a2,tail - -loop_4pixels: - ld $t3,0($a0) - daddiu $a0,$a0,8 - addiu $a2,$a2,-4 - pixel $a6 $t3 $v0 $a3 $a4 $a5 0 - pixel $a7 $t3 $v0 $a3 $a4 $a5 16 - pixel $t8 $t3 $v0 $a3 $a4 $a5 32 - pixel $t9 $t3 $v0 $a3 $a4 $a5 48 - dins $a6,$a7,16,16 - dinsu $a6,$t8,32,16 - dinsu $a6,$t9,48,16 - sd $a6,-8($a0) - bgez $a2, loop_4pixels - -tail: - /* the pixel count underran, restore it now */ - addiu $a2,$a2,4 - - /* handle the last 0..3 pixels */ - beqz $a2,done - -loop_1pixel: - lhu $t3,0($a0) - daddiu $a0,$a0,2 - addiu $a2,$a2,-1 - pixel $a6 $t3 $v0 $a3 $a4 $a5 0 - sh $a6, -2($a0) - bnez $a2,loop_1pixel - -done: - j $ra - .end scanline_col32cb16blend_mips64 diff --git a/libpixelflinger/arch-mips64/t32cb16blend.S b/libpixelflinger/arch-mips64/t32cb16blend.S deleted file mode 100644 index 3cb5f93e2..000000000 --- a/libpixelflinger/arch-mips64/t32cb16blend.S +++ /dev/null @@ -1,172 +0,0 @@ -/* -** Copyright 2015, 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. -*/ - -#ifdef DEBUG -#define DBG -#else -#define DBG # -#endif - -/* - * blend one of 2 16bpp RGB pixels held in dreg selected by shift - * with the 32bpp ABGR pixel held in src and store the result in fb - * - * Assumes that the dreg data is little endian and that - * the the second pixel (shift==16) will be merged into - * the fb result - * - * Uses $a4,$t2,$t3,$t8 - */ - - .macro pixel dreg src fb shift - /* - * sA = s >> 24 - * f = 0x100 - (sA + (sA>>7)) - */ - srl $t3,\src,24 - srl $t2,$t3,7 - addu $t3,$t2 - li $t2,0x100 - subu $t3,$t2,$t3 - - /* red */ - ext $t8,\dreg,\shift+6+5,5 # dst[\shift:15..11] - mul $t2,$t8,$t3 - ext $a4,\dreg,\shift+5,6 # start green extraction dst[\shift:10..5] - ext $t8,\src,3,5 # src[7..3] - srl $t2,8 - addu $t8,$t2 -.if \shift!=0 - sll $t8,\shift+11 # dst[\shift:15..11] - or \fb,$t8 -.else - sll \fb,$t8,11 -.endif - - /* green */ - mul $t8,$a4,$t3 - ext $a4,\dreg,\shift,5 # start blue extraction dst[\shift:4..0] - ext $t2,\src,2+8,6 # src[15..10] - srl $t8,8 - addu $t8,$t2 - - /* blue */ - mul $a4,$a4,$t3 - sll $t8, $t8, \shift+5 # finish green insertion dst[\shift:10..5] - or \fb, \fb, $t8 - ext $t2,\src,(3+8+8),5 - srl $t8,$a4,8 - addu $t8,$t2 - sll $t8, $t8, \shift - or \fb, \fb, $t8 - .endm - - .text - .balign 4 - - .global scanline_t32cb16blend_mips64 - .ent scanline_t32cb16blend_mips64 -scanline_t32cb16blend_mips64: - daddiu $sp, $sp, -40 -DBG li $v0,0xffffffff -DBG li $v1,0 - /* Align the destination if necessary */ - and $a4,$a0,3 - beqz $a4,aligned - - /* as long as there is at least one pixel */ - beqz $a2,done - - lw $t0,($a1) - daddu $a0,2 - daddu $a1,4 - beqz $t0,1f - lhu $a7,-2($a0) - pixel $a7,$t0,$a5,0 - sh $a5,-2($a0) -1: subu $a2,1 - -aligned: - /* Check to see if its worth unrolling the loop */ - subu $a2,4 - bltz $a2,tail - - /* Process 4 pixels at a time */ -fourpixels: - /* 1st pair of pixels */ - lw $t0,0($a1) - lw $t1,4($a1) - daddu $a0,8 - daddu $a1,16 - - /* both are zero, skip this pair */ - or $a7,$t0,$t1 - beqz $a7,1f - - /* load the destination */ - lw $a7,-8($a0) - - pixel $a7,$t0,$a5,0 - andi $a5, 0xFFFF - pixel $a7,$t1,$a5,16 - sw $a5,-8($a0) - -1: - /* 2nd pair of pixels */ - lw $t0,-8($a1) - lw $t1,-4($a1) - - /* both are zero, skip this pair */ - or $a7,$t0,$t1 - beqz $a7,1f - - /* load the destination */ - lw $a7,-4($a0) - - pixel $a7,$t0,$a5,0 - andi $a5, 0xFFFF - pixel $a7,$t1,$a5,16 - sw $a5,-4($a0) - -1: subu $a2,4 - bgtz $a2,fourpixels - -tail: - /* the pixel count underran, restore it now */ - addu $a2,4 - - /* handle the last 0..3 pixels */ - beqz $a2,done -onepixel: - lw $t0,($a1) - daddu $a0,2 - daddu $a1,4 - beqz $t0,1f - lhu $a7,-2($a0) - pixel $a7,$t0,$a5,0 - sh $a5,-2($a0) -1: subu $a2,1 - bnez $a2,onepixel -done: -DBG .set push -DBG .set mips32r2 -DBG rdhwr $a0,$3 -DBG mul $v0,$a0 -DBG mul $v1,$a0 -DBG .set pop - daddiu $sp, $sp, 40 - j $ra - .end scanline_t32cb16blend_mips64 diff --git a/libpixelflinger/buffer.cpp b/libpixelflinger/buffer.cpp deleted file mode 100644 index ea9514ca4..000000000 --- a/libpixelflinger/buffer.cpp +++ /dev/null @@ -1,389 +0,0 @@ -/* libs/pixelflinger/buffer.cpp -** -** Copyright 2006, 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 "buffer.h" - -namespace android { -// ---------------------------------------------------------------------------- - -static void read_pixel(const surface_t* s, context_t* c, - uint32_t x, uint32_t y, pixel_t* pixel); -static void write_pixel(const surface_t* s, context_t* c, - uint32_t x, uint32_t y, const pixel_t* pixel); -static void readRGB565(const surface_t* s, context_t* c, - uint32_t x, uint32_t y, pixel_t* pixel); -static void readABGR8888(const surface_t* s, context_t* c, - uint32_t x, uint32_t y, pixel_t* pixel); - -static uint32_t logic_op(int op, uint32_t s, uint32_t d); -static uint32_t extract(uint32_t v, int h, int l, int bits); -static uint32_t expand(uint32_t v, int sbits, int dbits); -static uint32_t downshift_component(uint32_t in, uint32_t v, - int sh, int sl, int dh, int dl, int ch, int cl, int dither); - -// ---------------------------------------------------------------------------- - -void ggl_init_texture(context_t* c) -{ - for (int i=0 ; istate.texture[i]; - t.s_coord = GGL_ONE_TO_ONE; - t.t_coord = GGL_ONE_TO_ONE; - t.s_wrap = GGL_REPEAT; - t.t_wrap = GGL_REPEAT; - t.min_filter = GGL_NEAREST; - t.mag_filter = GGL_NEAREST; - t.env = GGL_MODULATE; - } - c->activeTMU = &(c->state.texture[0]); -} - -void ggl_set_surface(context_t* c, surface_t* dst, const GGLSurface* src) -{ - dst->width = src->width; - dst->height = src->height; - dst->stride = src->stride; - dst->data = src->data; - dst->format = src->format; - dst->dirty = 1; - if (__builtin_expect(dst->stride < 0, false)) { - const GGLFormat& pixelFormat(c->formats[dst->format]); - const int32_t bpr = -dst->stride * pixelFormat.size; - dst->data += bpr * (dst->height-1); - } -} - -static void pick_read_write(surface_t* s) -{ - // Choose best reader/writers. - switch (s->format) { - case GGL_PIXEL_FORMAT_RGBA_8888: s->read = readABGR8888; break; - case GGL_PIXEL_FORMAT_RGB_565: s->read = readRGB565; break; - default: s->read = read_pixel; break; - } - s->write = write_pixel; -} - -void ggl_pick_texture(context_t* c) -{ - for (int i=0 ; istate.texture[i].surface; - if ((!c->state.texture[i].enable) || (!s.dirty)) - continue; - s.dirty = 0; - pick_read_write(&s); - generated_tex_vars_t& gen = c->generated_vars.texture[i]; - gen.width = s.width; - gen.height = s.height; - gen.stride = s.stride; - gen.data = uintptr_t(s.data); - } -} - -void ggl_pick_cb(context_t* c) -{ - surface_t& s = c->state.buffers.color; - if (s.dirty) { - s.dirty = 0; - pick_read_write(&s); - } -} - -// ---------------------------------------------------------------------------- - -void read_pixel(const surface_t* s, context_t* c, - uint32_t x, uint32_t y, pixel_t* pixel) -{ - assert((x < s->width) && (y < s->height)); - - const GGLFormat* f = &(c->formats[s->format]); - int32_t index = x + (s->stride * y); - uint8_t* const data = s->data + index * f->size; - uint32_t v = 0; - switch (f->size) { - case 1: v = *data; break; - case 2: v = *(uint16_t*)data; break; - case 3: v = (data[2]<<16)|(data[1]<<8)|data[0]; break; - case 4: v = GGL_RGBA_TO_HOST(*(uint32_t*)data); break; - } - for (int i=0 ; i<4 ; i++) { - pixel->s[i] = f->c[i].h - f->c[i].l; - if (pixel->s[i]) - pixel->c[i] = extract(v, f->c[i].h, f->c[i].l, f->size*8); - } -} - -void readRGB565(const surface_t* s, context_t* /*c*/, - uint32_t x, uint32_t y, pixel_t* pixel) -{ - uint16_t v = *(reinterpret_cast(s->data) + (x + (s->stride * y))); - pixel->c[0] = 0; - pixel->c[1] = v>>11; - pixel->c[2] = (v>>5)&0x3F; - pixel->c[3] = v&0x1F; - pixel->s[0] = 0; - pixel->s[1] = 5; - pixel->s[2] = 6; - pixel->s[3] = 5; -} - -void readABGR8888(const surface_t* s, context_t* /*c*/, - uint32_t x, uint32_t y, pixel_t* pixel) -{ - uint32_t v = *(reinterpret_cast(s->data) + (x + (s->stride * y))); - v = GGL_RGBA_TO_HOST(v); - pixel->c[0] = v>>24; // A - pixel->c[1] = v&0xFF; // R - pixel->c[2] = (v>>8)&0xFF; // G - pixel->c[3] = (v>>16)&0xFF; // B - pixel->s[0] = - pixel->s[1] = - pixel->s[2] = - pixel->s[3] = 8; -} - -void write_pixel(const surface_t* s, context_t* c, - uint32_t x, uint32_t y, const pixel_t* pixel) -{ - assert((x < s->width) && (y < s->height)); - - int dither = -1; - if (c->state.enables & GGL_ENABLE_DITHER) { - dither = c->ditherMatrix[ (x & GGL_DITHER_MASK) + - ((y & GGL_DITHER_MASK)<formats[s->format]); - int32_t index = x + (s->stride * y); - uint8_t* const data = s->data + index * f->size; - - uint32_t mask = 0; - uint32_t v = 0; - for (int i=0 ; i<4 ; i++) { - const int component_mask = 1 << i; - if (f->components>=GGL_LUMINANCE && - (i==GGLFormat::GREEN || i==GGLFormat::BLUE)) { - // destinations L formats don't have G or B - continue; - } - const int l = f->c[i].l; - const int h = f->c[i].h; - if (h && (c->state.mask.color & component_mask)) { - mask |= (((1<<(h-l))-1)<c[i]; - int32_t pixelSize = pixel->s[i]; - if (pixelSize < (h-l)) { - u = expand(u, pixelSize, h-l); - pixelSize = h-l; - } - v = downshift_component(v, u, pixelSize, 0, h, l, 0, 0, dither); - } - } - - if ((c->state.mask.color != 0xF) || - (c->state.enables & GGL_ENABLE_LOGIC_OP)) { - uint32_t d = 0; - switch (f->size) { - case 1: d = *data; break; - case 2: d = *(uint16_t*)data; break; - case 3: d = (data[2]<<16)|(data[1]<<8)|data[0]; break; - case 4: d = GGL_RGBA_TO_HOST(*(uint32_t*)data); break; - } - if (c->state.enables & GGL_ENABLE_LOGIC_OP) { - v = logic_op(c->state.logic_op.opcode, v, d); - v &= mask; - } - v |= (d & ~mask); - } - - switch (f->size) { - case 1: *data = v; break; - case 2: *(uint16_t*)data = v; break; - case 3: - data[0] = v; - data[1] = v>>8; - data[2] = v>>16; - break; - case 4: *(uint32_t*)data = GGL_HOST_TO_RGBA(v); break; - } -} - -static uint32_t logic_op(int op, uint32_t s, uint32_t d) -{ - switch(op) { - case GGL_CLEAR: return 0; - case GGL_AND: return s & d; - case GGL_AND_REVERSE: return s & ~d; - case GGL_COPY: return s; - case GGL_AND_INVERTED: return ~s & d; - case GGL_NOOP: return d; - case GGL_XOR: return s ^ d; - case GGL_OR: return s | d; - case GGL_NOR: return ~(s | d); - case GGL_EQUIV: return ~(s ^ d); - case GGL_INVERT: return ~d; - case GGL_OR_REVERSE: return s | ~d; - case GGL_COPY_INVERTED: return ~s; - case GGL_OR_INVERTED: return ~s | d; - case GGL_NAND: return ~(s & d); - case GGL_SET: return ~0; - }; - return s; -} - - -uint32_t ggl_expand(uint32_t v, int sbits, int dbits) -{ - return expand(v, sbits, dbits); -} - -uint32_t ggl_pack_color(context_t* c, int32_t format, - GGLcolor r, GGLcolor g, GGLcolor b, GGLcolor a) -{ - const GGLFormat* f = &(c->formats[format]); - uint32_t p = 0; - const int32_t hbits = GGL_COLOR_BITS; - const int32_t lbits = GGL_COLOR_BITS - 8; - p = downshift_component(p, r, hbits, lbits, f->rh, f->rl, 0, 1, -1); - p = downshift_component(p, g, hbits, lbits, f->gh, f->gl, 0, 1, -1); - p = downshift_component(p, b, hbits, lbits, f->bh, f->bl, 0, 1, -1); - p = downshift_component(p, a, hbits, lbits, f->ah, f->al, 0, 1, -1); - switch (f->size) { - case 1: - p |= p << 8; - FALLTHROUGH_INTENDED; - case 2: - p |= p << 16; - } - return p; -} - -// ---------------------------------------------------------------------------- - -// extract a component from a word -uint32_t extract(uint32_t v, int h, int l, int bits) -{ - assert(h); - if (l) { - v >>= l; - } - if (h != bits) { - v &= (1<<(h-l))-1; - } - return v; -} - -// expand a component from sbits to dbits -uint32_t expand(uint32_t v, int sbits, int dbits) -{ - if (dbits > sbits) { - assert(sbits); - if (sbits==1) { - v = (v<>sbits; - dbits -= sbits; - sbits *= 2; - } while (dbits>0); - } else { - dbits -= sbits; - do { - v |= v< 0); - } - } - } - return v; -} - -// downsample a component from sbits to dbits -// and shift / construct the pixel -uint32_t downshift_component( uint32_t in, uint32_t v, - int sh, int sl, // src - int dh, int dl, // dst - int ch, int cl, // clear - int dither) -{ - const int sbits = sh-sl; - const int dbits = dh-dl; - - assert(sbits>=dbits); - - - if (sbits>dbits) { - if (dither>=0) { - v -= (v>>dbits); // fix up - const int shift = (GGL_DITHER_BITS - (sbits-dbits)); - if (shift >= 0) v += (dither >> shift) << sl; - else v += (dither << (-shift)) << sl; - } else { - // don't do that right now, so we can reproduce the same - // artifacts we get on ARM (Where we don't do this) - // -> this is not really needed if we don't dither - //if (dBits > 1) { // result already OK if dBits==1 - // v -= (v>>dbits); // fix up - // v += 1 << ((sbits-dbits)-1); // rounding - //} - } - } - - - // we need to clear the high bits of the source - if (ch) { - v <<= 32-sh; - sl += 32-sh; - sh = 32; - } - - if (dl) { - if (cl || (sbits>dbits)) { - v >>= sh-dbits; - sl = 0; - sh = dbits; - in |= v< 0) in |= v>>shift; - else if (shift < 0) in |= v< - -namespace android { - -void ggl_init_texture(context_t* c); - -void ggl_set_surface(context_t* c, surface_t* dst, const GGLSurface* src); - -void ggl_pick_texture(context_t* c); -void ggl_pick_cb(context_t* c); - -uint32_t ggl_expand(uint32_t v, int sbits, int dbits); -uint32_t ggl_pack_color(context_t* c, int32_t format, - GGLcolor r, GGLcolor g, GGLcolor b, GGLcolor a); - -}; // namespace android - -#endif // ANDROID_GGL_TEXTURE_H diff --git a/libpixelflinger/clear.cpp b/libpixelflinger/clear.cpp deleted file mode 100644 index b96245635..000000000 --- a/libpixelflinger/clear.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* libs/pixelflinger/clear.cpp -** -** Copyright 2006, 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 "clear.h" -#include "buffer.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -static void ggl_clear(void* c, GGLbitfield mask); -static void ggl_clearColorx(void* c, - GGLclampx r, GGLclampx g, GGLclampx b, GGLclampx a); -static void ggl_clearDepthx(void* c, GGLclampx depth); -static void ggl_clearStencil(void* c, GGLint s); - -// ---------------------------------------------------------------------------- - -void ggl_init_clear(context_t* c) -{ - GGLContext& procs = *(GGLContext*)c; - GGL_INIT_PROC(procs, clear); - GGL_INIT_PROC(procs, clearColorx); - GGL_INIT_PROC(procs, clearDepthx); - GGL_INIT_PROC(procs, clearStencil); - c->state.clear.dirty = GGL_STENCIL_BUFFER_BIT | - GGL_COLOR_BUFFER_BIT | - GGL_DEPTH_BUFFER_BIT; - c->state.clear.depth = FIXED_ONE; -} - -// ---------------------------------------------------------------------------- - -static void memset2d(context_t* c, const surface_t& s, uint32_t packed, - uint32_t l, uint32_t t, uint32_t w, uint32_t h) -{ - const uint32_t size = c->formats[s.format].size; - const int32_t stride = s.stride * size; - uint8_t* dst = (uint8_t*)s.data + (l + t*s.stride)*size; - w *= size; - - if (ggl_likely(int32_t(w) == stride)) { - // clear the whole thing in one call - w *= h; - h = 1; - } - - switch (size) { - case 1: - do { - memset(dst, packed, w); - dst += stride; - } while(--h); - break; - case 2: - do { - android_memset16((uint16_t*)dst, packed, w); - dst += stride; - } while(--h); - break; - case 3: // XXX: 24-bit clear. - break; - case 4: - do { - android_memset32((uint32_t*)dst, packed, w); - dst += stride; - } while(--h); - break; - } -} - -static inline GGLfixed fixedToZ(GGLfixed z) { - return GGLfixed(((int64_t(z) << 16) - z) >> 16); -} - -static void ggl_clear(void* con, GGLbitfield mask) -{ - GGL_CONTEXT(c, con); - - // XXX: rgba-dithering, rgba-masking - // XXX: handle all formats of Z and S - - const uint32_t l = c->state.scissor.left; - const uint32_t t = c->state.scissor.top; - uint32_t w = c->state.scissor.right - l; - uint32_t h = c->state.scissor.bottom - t; - - if (!w || !h) - return; - - // unexsiting buffers have no effect... - if (c->state.buffers.color.format == 0) - mask &= ~GGL_COLOR_BUFFER_BIT; - - if (c->state.buffers.depth.format == 0) - mask &= ~GGL_DEPTH_BUFFER_BIT; - - if (c->state.buffers.stencil.format == 0) - mask &= ~GGL_STENCIL_BUFFER_BIT; - - if (mask & GGL_COLOR_BUFFER_BIT) { - if (c->state.clear.dirty & GGL_COLOR_BUFFER_BIT) { - c->state.clear.dirty &= ~GGL_COLOR_BUFFER_BIT; - - uint32_t colorPacked = ggl_pack_color(c, - c->state.buffers.color.format, - gglFixedToIteratedColor(c->state.clear.r), - gglFixedToIteratedColor(c->state.clear.g), - gglFixedToIteratedColor(c->state.clear.b), - gglFixedToIteratedColor(c->state.clear.a)); - - c->state.clear.colorPacked = GGL_HOST_TO_RGBA(colorPacked); - } - const uint32_t packed = c->state.clear.colorPacked; - memset2d(c, c->state.buffers.color, packed, l, t, w, h); - } - if (mask & GGL_DEPTH_BUFFER_BIT) { - if (c->state.clear.dirty & GGL_DEPTH_BUFFER_BIT) { - c->state.clear.dirty &= ~GGL_DEPTH_BUFFER_BIT; - uint32_t depth = fixedToZ(c->state.clear.depth); - c->state.clear.depthPacked = (depth<<16)|depth; - } - const uint32_t packed = c->state.clear.depthPacked; - memset2d(c, c->state.buffers.depth, packed, l, t, w, h); - } - - // XXX: do stencil buffer -} - -static void ggl_clearColorx(void* con, - GGLclampx r, GGLclampx g, GGLclampx b, GGLclampx a) -{ - GGL_CONTEXT(c, con); - c->state.clear.r = gglClampx(r); - c->state.clear.g = gglClampx(g); - c->state.clear.b = gglClampx(b); - c->state.clear.a = gglClampx(a); - c->state.clear.dirty |= GGL_COLOR_BUFFER_BIT; -} - -static void ggl_clearDepthx(void* con, GGLclampx depth) -{ - GGL_CONTEXT(c, con); - c->state.clear.depth = gglClampx(depth); - c->state.clear.dirty |= GGL_DEPTH_BUFFER_BIT; -} - -static void ggl_clearStencil(void* con, GGLint s) -{ - GGL_CONTEXT(c, con); - c->state.clear.stencil = s; - c->state.clear.dirty |= GGL_STENCIL_BUFFER_BIT; -} - -}; // namespace android diff --git a/libpixelflinger/clear.h b/libpixelflinger/clear.h deleted file mode 100644 index b071df0a7..000000000 --- a/libpixelflinger/clear.h +++ /dev/null @@ -1,30 +0,0 @@ -/* libs/pixelflinger/clear.h -** -** Copyright 2006, 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_GGL_CLEAR_H -#define ANDROID_GGL_CLEAR_H - -#include -#include - -namespace android { - -void ggl_init_clear(context_t* c); - -}; // namespace android - -#endif // ANDROID_GGL_CLEAR_H diff --git a/libpixelflinger/codeflinger/ARMAssembler.cpp b/libpixelflinger/codeflinger/ARMAssembler.cpp deleted file mode 100644 index f47b6e42a..000000000 --- a/libpixelflinger/codeflinger/ARMAssembler.cpp +++ /dev/null @@ -1,579 +0,0 @@ -/* libs/pixelflinger/codeflinger/ARMAssembler.cpp -** -** Copyright 2006, 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 "ARMAssembler" - -#include -#include - -#include -#include -#include - -#include "ARMAssembler.h" -#include "CodeCache.h" -#include "disassem.h" - -// ---------------------------------------------------------------------------- - -namespace android { - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark ARMAssembler... -#endif - -ARMAssembler::ARMAssembler(const sp& assembly) - : ARMAssemblerInterface(), - mAssembly(assembly) -{ - mBase = mPC = (uint32_t *)assembly->base(); - mDuration = ggl_system_time(); -} - -ARMAssembler::~ARMAssembler() -{ -} - -uint32_t* ARMAssembler::pc() const -{ - return mPC; -} - -uint32_t* ARMAssembler::base() const -{ - return mBase; -} - -void ARMAssembler::reset() -{ - mBase = mPC = (uint32_t *)mAssembly->base(); - mBranchTargets.clear(); - mLabels.clear(); - mLabelsInverseMapping.clear(); - mComments.clear(); -} - -int ARMAssembler::getCodegenArch() -{ - return CODEGEN_ARCH_ARM; -} - -// ---------------------------------------------------------------------------- - -void ARMAssembler::disassemble(const char* name) -{ - if (name) { - printf("%s:\n", name); - } - size_t count = pc()-base(); - uint32_t* i = base(); - while (count--) { - ssize_t label = mLabelsInverseMapping.indexOfKey(i); - if (label >= 0) { - printf("%s:\n", mLabelsInverseMapping.valueAt(label)); - } - ssize_t comment = mComments.indexOfKey(i); - if (comment >= 0) { - printf("; %s\n", mComments.valueAt(comment)); - } - printf("%08x: %08x ", uintptr_t(i), int(i[0])); - ::disassemble((uintptr_t)i); - i++; - } -} - -void ARMAssembler::comment(const char* string) -{ - mComments.add(mPC, string); -} - -void ARMAssembler::label(const char* theLabel) -{ - mLabels.add(theLabel, mPC); - mLabelsInverseMapping.add(mPC, theLabel); -} - -void ARMAssembler::B(int cc, const char* label) -{ - mBranchTargets.add(branch_target_t(label, mPC)); - *mPC++ = (cc<<28) | (0xA<<24) | 0; -} - -void ARMAssembler::BL(int cc, const char* label) -{ - mBranchTargets.add(branch_target_t(label, mPC)); - *mPC++ = (cc<<28) | (0xB<<24) | 0; -} - -#if 0 -#pragma mark - -#pragma mark Prolog/Epilog & Generate... -#endif - - -void ARMAssembler::prolog() -{ - // write dummy prolog code - mPrologPC = mPC; - STM(AL, FD, SP, 1, LSAVED); -} - -void ARMAssembler::epilog(uint32_t touched) -{ - touched &= LSAVED; - if (touched) { - // write prolog code - uint32_t* pc = mPC; - mPC = mPrologPC; - STM(AL, FD, SP, 1, touched | LLR); - mPC = pc; - // write epilog code - LDM(AL, FD, SP, 1, touched | LLR); - BX(AL, LR); - } else { // heh, no registers to save! - // write prolog code - uint32_t* pc = mPC; - mPC = mPrologPC; - MOV(AL, 0, R0, R0); // NOP - mPC = pc; - // write epilog code - BX(AL, LR); - } -} - -int ARMAssembler::generate(const char* name) -{ - // fixup all the branches - size_t count = mBranchTargets.size(); - while (count--) { - const branch_target_t& bt = mBranchTargets[count]; - uint32_t* target_pc = mLabels.valueFor(bt.label); - LOG_ALWAYS_FATAL_IF(!target_pc, - "error resolving branch targets, target_pc is null"); - int32_t offset = int32_t(target_pc - (bt.pc+2)); - *bt.pc |= offset & 0xFFFFFF; - } - - mAssembly->resize( int(pc()-base())*4 ); - - // the instruction cache is flushed by CodeCache - const int64_t duration = ggl_system_time() - mDuration; - const char * const format = "generated %s (%d ins) at [%p:%p] in %lld ns\n"; - ALOGI(format, name, int(pc()-base()), base(), pc(), duration); - - char value[PROPERTY_VALUE_MAX]; - property_get("debug.pf.disasm", value, "0"); - if (atoi(value) != 0) { - printf(format, name, int(pc()-base()), base(), pc(), duration); - disassemble(name); - } - - return OK; -} - -uint32_t* ARMAssembler::pcForLabel(const char* label) -{ - return mLabels.valueFor(label); -} - -// ---------------------------------------------------------------------------- - -#if 0 -#pragma mark - -#pragma mark Data Processing... -#endif - -void ARMAssembler::dataProcessing(int opcode, int cc, - int s, int Rd, int Rn, uint32_t Op2) -{ - *mPC++ = (cc<<28) | (opcode<<21) | (s<<20) | (Rn<<16) | (Rd<<12) | Op2; -} - -#if 0 -#pragma mark - -#pragma mark Multiply... -#endif - -// multiply... -void ARMAssembler::MLA(int cc, int s, - int Rd, int Rm, int Rs, int Rn) { - if (Rd == Rm) { int t = Rm; Rm=Rs; Rs=t; } - LOG_FATAL_IF(Rd==Rm, "MLA(r%u,r%u,r%u,r%u)", Rd,Rm,Rs,Rn); - *mPC++ = (cc<<28) | (1<<21) | (s<<20) | - (Rd<<16) | (Rn<<12) | (Rs<<8) | 0x90 | Rm; -} -void ARMAssembler::MUL(int cc, int s, - int Rd, int Rm, int Rs) { - if (Rd == Rm) { int t = Rm; Rm=Rs; Rs=t; } - LOG_FATAL_IF(Rd==Rm, "MUL(r%u,r%u,r%u)", Rd,Rm,Rs); - *mPC++ = (cc<<28) | (s<<20) | (Rd<<16) | (Rs<<8) | 0x90 | Rm; -} -void ARMAssembler::UMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "UMULL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - *mPC++ = (cc<<28) | (1<<23) | (s<<20) | - (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; -} -void ARMAssembler::UMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "UMUAL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - *mPC++ = (cc<<28) | (1<<23) | (1<<21) | (s<<20) | - (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; -} -void ARMAssembler::SMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "SMULL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - *mPC++ = (cc<<28) | (1<<23) | (1<<22) | (s<<20) | - (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; -} -void ARMAssembler::SMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "SMUAL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - *mPC++ = (cc<<28) | (1<<23) | (1<<22) | (1<<21) | (s<<20) | - (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; -} - -#if 0 -#pragma mark - -#pragma mark Branches... -#endif - -// branches... -void ARMAssembler::B(int cc, uint32_t* pc) -{ - int32_t offset = int32_t(pc - (mPC+2)); - *mPC++ = (cc<<28) | (0xA<<24) | (offset & 0xFFFFFF); -} - -void ARMAssembler::BL(int cc, uint32_t* pc) -{ - int32_t offset = int32_t(pc - (mPC+2)); - *mPC++ = (cc<<28) | (0xB<<24) | (offset & 0xFFFFFF); -} - -void ARMAssembler::BX(int cc, int Rn) -{ - *mPC++ = (cc<<28) | 0x12FFF10 | Rn; -} - -#if 0 -#pragma mark - -#pragma mark Data Transfer... -#endif - -// data transfert... -void ARMAssembler::LDR(int cc, int Rd, int Rn, uint32_t offset) { - *mPC++ = (cc<<28) | (1<<26) | (1<<20) | (Rn<<16) | (Rd<<12) | offset; -} -void ARMAssembler::LDRB(int cc, int Rd, int Rn, uint32_t offset) { - *mPC++ = (cc<<28) | (1<<26) | (1<<22) | (1<<20) | (Rn<<16) | (Rd<<12) | offset; -} -void ARMAssembler::STR(int cc, int Rd, int Rn, uint32_t offset) { - *mPC++ = (cc<<28) | (1<<26) | (Rn<<16) | (Rd<<12) | offset; -} -void ARMAssembler::STRB(int cc, int Rd, int Rn, uint32_t offset) { - *mPC++ = (cc<<28) | (1<<26) | (1<<22) | (Rn<<16) | (Rd<<12) | offset; -} - -void ARMAssembler::LDRH(int cc, int Rd, int Rn, uint32_t offset) { - *mPC++ = (cc<<28) | (1<<20) | (Rn<<16) | (Rd<<12) | 0xB0 | offset; -} -void ARMAssembler::LDRSB(int cc, int Rd, int Rn, uint32_t offset) { - *mPC++ = (cc<<28) | (1<<20) | (Rn<<16) | (Rd<<12) | 0xD0 | offset; -} -void ARMAssembler::LDRSH(int cc, int Rd, int Rn, uint32_t offset) { - *mPC++ = (cc<<28) | (1<<20) | (Rn<<16) | (Rd<<12) | 0xF0 | offset; -} -void ARMAssembler::STRH(int cc, int Rd, int Rn, uint32_t offset) { - *mPC++ = (cc<<28) | (Rn<<16) | (Rd<<12) | 0xB0 | offset; -} - -#if 0 -#pragma mark - -#pragma mark Block Data Transfer... -#endif - -// block data transfer... -void ARMAssembler::LDM(int cc, int dir, - int Rn, int W, uint32_t reg_list) -{ // ED FD EA FA IB IA DB DA - const uint8_t P[8] = { 1, 0, 1, 0, 1, 0, 1, 0 }; - const uint8_t U[8] = { 1, 1, 0, 0, 1, 1, 0, 0 }; - *mPC++ = (cc<<28) | (4<<25) | (uint32_t(P[dir])<<24) | - (uint32_t(U[dir])<<23) | (1<<20) | (W<<21) | (Rn<<16) | reg_list; -} - -void ARMAssembler::STM(int cc, int dir, - int Rn, int W, uint32_t reg_list) -{ // ED FD EA FA IB IA DB DA - const uint8_t P[8] = { 0, 1, 0, 1, 1, 0, 1, 0 }; - const uint8_t U[8] = { 0, 0, 1, 1, 1, 1, 0, 0 }; - *mPC++ = (cc<<28) | (4<<25) | (uint32_t(P[dir])<<24) | - (uint32_t(U[dir])<<23) | (0<<20) | (W<<21) | (Rn<<16) | reg_list; -} - -#if 0 -#pragma mark - -#pragma mark Special... -#endif - -// special... -void ARMAssembler::SWP(int cc, int Rn, int Rd, int Rm) { - *mPC++ = (cc<<28) | (2<<23) | (Rn<<16) | (Rd << 12) | 0x90 | Rm; -} -void ARMAssembler::SWPB(int cc, int Rn, int Rd, int Rm) { - *mPC++ = (cc<<28) | (2<<23) | (1<<22) | (Rn<<16) | (Rd << 12) | 0x90 | Rm; -} -void ARMAssembler::SWI(int cc, uint32_t comment) { - *mPC++ = (cc<<28) | (0xF<<24) | comment; -} - -#if 0 -#pragma mark - -#pragma mark DSP instructions... -#endif - -// DSP instructions... -void ARMAssembler::PLD(int Rn, uint32_t offset) { - LOG_ALWAYS_FATAL_IF(!((offset&(1<<24)) && !(offset&(1<<21))), - "PLD only P=1, W=0"); - *mPC++ = 0xF550F000 | (Rn<<16) | offset; -} - -void ARMAssembler::CLZ(int cc, int Rd, int Rm) -{ - *mPC++ = (cc<<28) | 0x16F0F10| (Rd<<12) | Rm; -} - -void ARMAssembler::QADD(int cc, int Rd, int Rm, int Rn) -{ - *mPC++ = (cc<<28) | 0x1000050 | (Rn<<16) | (Rd<<12) | Rm; -} - -void ARMAssembler::QDADD(int cc, int Rd, int Rm, int Rn) -{ - *mPC++ = (cc<<28) | 0x1400050 | (Rn<<16) | (Rd<<12) | Rm; -} - -void ARMAssembler::QSUB(int cc, int Rd, int Rm, int Rn) -{ - *mPC++ = (cc<<28) | 0x1200050 | (Rn<<16) | (Rd<<12) | Rm; -} - -void ARMAssembler::QDSUB(int cc, int Rd, int Rm, int Rn) -{ - *mPC++ = (cc<<28) | 0x1600050 | (Rn<<16) | (Rd<<12) | Rm; -} - -void ARMAssembler::SMUL(int cc, int xy, - int Rd, int Rm, int Rs) -{ - *mPC++ = (cc<<28) | 0x1600080 | (Rd<<16) | (Rs<<8) | (xy<<4) | Rm; -} - -void ARMAssembler::SMULW(int cc, int y, - int Rd, int Rm, int Rs) -{ - *mPC++ = (cc<<28) | 0x12000A0 | (Rd<<16) | (Rs<<8) | (y<<4) | Rm; -} - -void ARMAssembler::SMLA(int cc, int xy, - int Rd, int Rm, int Rs, int Rn) -{ - *mPC++ = (cc<<28) | 0x1000080 | (Rd<<16) | (Rn<<12) | (Rs<<8) | (xy<<4) | Rm; -} - -void ARMAssembler::SMLAL(int cc, int xy, - int RdHi, int RdLo, int Rs, int Rm) -{ - *mPC++ = (cc<<28) | 0x1400080 | (RdHi<<16) | (RdLo<<12) | (Rs<<8) | (xy<<4) | Rm; -} - -void ARMAssembler::SMLAW(int cc, int y, - int Rd, int Rm, int Rs, int Rn) -{ - *mPC++ = (cc<<28) | 0x1200080 | (Rd<<16) | (Rn<<12) | (Rs<<8) | (y<<4) | Rm; -} - -#if 0 -#pragma mark - -#pragma mark Byte/half word extract and extend (ARMv6+ only)... -#endif - -void ARMAssembler::UXTB16(int cc, int Rd, int Rm, int rotate) -{ - *mPC++ = (cc<<28) | 0x6CF0070 | (Rd<<12) | ((rotate >> 3) << 10) | Rm; -} -#if 0 -#pragma mark - -#pragma mark Bit manipulation (ARMv7+ only)... -#endif - -// Bit manipulation (ARMv7+ only)... -void ARMAssembler::UBFX(int cc, int Rd, int Rn, int lsb, int width) -{ - *mPC++ = (cc<<28) | 0x7E00000 | ((width-1)<<16) | (Rd<<12) | (lsb<<7) | 0x50 | Rn; -} - -#if 0 -#pragma mark - -#pragma mark Addressing modes... -#endif - -int ARMAssembler::buildImmediate( - uint32_t immediate, uint32_t& rot, uint32_t& imm) -{ - rot = 0; - imm = immediate; - if (imm > 0x7F) { // skip the easy cases - while (!(imm&3) || (imm&0xFC000000)) { - uint32_t newval; - newval = imm >> 2; - newval |= (imm&3) << 30; - imm = newval; - rot += 2; - if (rot == 32) { - rot = 0; - break; - } - } - } - rot = (16 - (rot>>1)) & 0xF; - - if (imm>=0x100) - return -EINVAL; - - if (((imm>>(rot<<1)) | (imm<<(32-(rot<<1)))) != immediate) - return -1; - - return 0; -} - -// shifters... - -bool ARMAssembler::isValidImmediate(uint32_t immediate) -{ - uint32_t rot, imm; - return buildImmediate(immediate, rot, imm) == 0; -} - -uint32_t ARMAssembler::imm(uint32_t immediate) -{ - uint32_t rot, imm; - int err = buildImmediate(immediate, rot, imm); - - LOG_ALWAYS_FATAL_IF(err==-EINVAL, - "immediate %08x cannot be encoded", - immediate); - - LOG_ALWAYS_FATAL_IF(err, - "immediate (%08x) encoding bogus!", - immediate); - - return (1<<25) | (rot<<8) | imm; -} - -uint32_t ARMAssembler::reg_imm(int Rm, int type, uint32_t shift) -{ - return ((shift&0x1F)<<7) | ((type&0x3)<<5) | (Rm&0xF); -} - -uint32_t ARMAssembler::reg_rrx(int Rm) -{ - return (ROR<<5) | (Rm&0xF); -} - -uint32_t ARMAssembler::reg_reg(int Rm, int type, int Rs) -{ - return ((Rs&0xF)<<8) | ((type&0x3)<<5) | (1<<4) | (Rm&0xF); -} - -// addressing modes... -// LDR(B)/STR(B)/PLD (immediate and Rm can be negative, which indicate U=0) -uint32_t ARMAssembler::immed12_pre(int32_t immed12, int W) -{ - LOG_ALWAYS_FATAL_IF(abs(immed12) >= 0x800, - "LDR(B)/STR(B)/PLD immediate too big (%08x)", - immed12); - return (1<<24) | (((uint32_t(immed12)>>31)^1)<<23) | - ((W&1)<<21) | (abs(immed12)&0x7FF); -} - -uint32_t ARMAssembler::immed12_post(int32_t immed12) -{ - LOG_ALWAYS_FATAL_IF(abs(immed12) >= 0x800, - "LDR(B)/STR(B)/PLD immediate too big (%08x)", - immed12); - - return (((uint32_t(immed12)>>31)^1)<<23) | (abs(immed12)&0x7FF); -} - -uint32_t ARMAssembler::reg_scale_pre(int Rm, int type, - uint32_t shift, int W) -{ - return (1<<25) | (1<<24) | - (((uint32_t(Rm)>>31)^1)<<23) | ((W&1)<<21) | - reg_imm(abs(Rm), type, shift); -} - -uint32_t ARMAssembler::reg_scale_post(int Rm, int type, uint32_t shift) -{ - return (1<<25) | (((uint32_t(Rm)>>31)^1)<<23) | reg_imm(abs(Rm), type, shift); -} - -// LDRH/LDRSB/LDRSH/STRH (immediate and Rm can be negative, which indicate U=0) -uint32_t ARMAssembler::immed8_pre(int32_t immed8, int W) -{ - uint32_t offset = abs(immed8); - - LOG_ALWAYS_FATAL_IF(abs(immed8) >= 0x100, - "LDRH/LDRSB/LDRSH/STRH immediate too big (%08x)", - immed8); - - return (1<<24) | (1<<22) | (((uint32_t(immed8)>>31)^1)<<23) | - ((W&1)<<21) | (((offset&0xF0)<<4)|(offset&0xF)); -} - -uint32_t ARMAssembler::immed8_post(int32_t immed8) -{ - uint32_t offset = abs(immed8); - - LOG_ALWAYS_FATAL_IF(abs(immed8) >= 0x100, - "LDRH/LDRSB/LDRSH/STRH immediate too big (%08x)", - immed8); - - return (1<<22) | (((uint32_t(immed8)>>31)^1)<<23) | - (((offset&0xF0)<<4) | (offset&0xF)); -} - -uint32_t ARMAssembler::reg_pre(int Rm, int W) -{ - return (1<<24) | (((uint32_t(Rm)>>31)^1)<<23) | ((W&1)<<21) | (abs(Rm)&0xF); -} - -uint32_t ARMAssembler::reg_post(int Rm) -{ - return (((uint32_t(Rm)>>31)^1)<<23) | (abs(Rm)&0xF); -} - -}; // namespace android diff --git a/libpixelflinger/codeflinger/ARMAssembler.h b/libpixelflinger/codeflinger/ARMAssembler.h deleted file mode 100644 index 76acf7e3a..000000000 --- a/libpixelflinger/codeflinger/ARMAssembler.h +++ /dev/null @@ -1,187 +0,0 @@ -/* libs/pixelflinger/codeflinger/ARMAssembler.h -** -** Copyright 2006, 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_ARMASSEMBLER_H -#define ANDROID_ARMASSEMBLER_H - -#include -#include - -#include "tinyutils/smartpointer.h" -#include "utils/Vector.h" -#include "utils/KeyedVector.h" - -#include "ARMAssemblerInterface.h" -#include "CodeCache.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -class ARMAssembler : public ARMAssemblerInterface -{ -public: - explicit ARMAssembler(const sp& assembly); - virtual ~ARMAssembler(); - - uint32_t* base() const; - uint32_t* pc() const; - - - void disassemble(const char* name); - - // ------------------------------------------------------------------------ - // ARMAssemblerInterface... - // ------------------------------------------------------------------------ - - virtual void reset(); - - virtual int generate(const char* name); - virtual int getCodegenArch(); - - virtual void prolog(); - virtual void epilog(uint32_t touched); - virtual void comment(const char* string); - - - // ----------------------------------------------------------------------- - // shifters and addressing modes - // ----------------------------------------------------------------------- - - // shifters... - virtual bool isValidImmediate(uint32_t immed); - virtual int buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm); - - virtual uint32_t imm(uint32_t immediate); - virtual uint32_t reg_imm(int Rm, int type, uint32_t shift); - virtual uint32_t reg_rrx(int Rm); - virtual uint32_t reg_reg(int Rm, int type, int Rs); - - // addressing modes... - // LDR(B)/STR(B)/PLD - // (immediate and Rm can be negative, which indicates U=0) - virtual uint32_t immed12_pre(int32_t immed12, int W=0); - virtual uint32_t immed12_post(int32_t immed12); - virtual uint32_t reg_scale_pre(int Rm, int type=0, uint32_t shift=0, int W=0); - virtual uint32_t reg_scale_post(int Rm, int type=0, uint32_t shift=0); - - // LDRH/LDRSB/LDRSH/STRH - // (immediate and Rm can be negative, which indicates U=0) - virtual uint32_t immed8_pre(int32_t immed8, int W=0); - virtual uint32_t immed8_post(int32_t immed8); - virtual uint32_t reg_pre(int Rm, int W=0); - virtual uint32_t reg_post(int Rm); - - - virtual void dataProcessing(int opcode, int cc, int s, - int Rd, int Rn, - uint32_t Op2); - virtual void MLA(int cc, int s, - int Rd, int Rm, int Rs, int Rn); - virtual void MUL(int cc, int s, - int Rd, int Rm, int Rs); - virtual void UMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void UMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - - virtual void B(int cc, uint32_t* pc); - virtual void BL(int cc, uint32_t* pc); - virtual void BX(int cc, int Rn); - virtual void label(const char* theLabel); - virtual void B(int cc, const char* label); - virtual void BL(int cc, const char* label); - - virtual uint32_t* pcForLabel(const char* label); - - virtual void LDR (int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void LDRB(int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void STR (int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void STRB(int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void LDRH (int cc, int Rd, - int Rn, uint32_t offset = __immed8_pre(0)); - virtual void LDRSB(int cc, int Rd, - int Rn, uint32_t offset = __immed8_pre(0)); - virtual void LDRSH(int cc, int Rd, - int Rn, uint32_t offset = __immed8_pre(0)); - virtual void STRH (int cc, int Rd, - int Rn, uint32_t offset = __immed8_pre(0)); - - - virtual void LDM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - virtual void STM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - - virtual void SWP(int cc, int Rn, int Rd, int Rm); - virtual void SWPB(int cc, int Rn, int Rd, int Rm); - virtual void SWI(int cc, uint32_t comment); - - virtual void PLD(int Rn, uint32_t offset); - virtual void CLZ(int cc, int Rd, int Rm); - virtual void QADD(int cc, int Rd, int Rm, int Rn); - virtual void QDADD(int cc, int Rd, int Rm, int Rn); - virtual void QSUB(int cc, int Rd, int Rm, int Rn); - virtual void QDSUB(int cc, int Rd, int Rm, int Rn); - virtual void SMUL(int cc, int xy, - int Rd, int Rm, int Rs); - virtual void SMULW(int cc, int y, - int Rd, int Rm, int Rs); - virtual void SMLA(int cc, int xy, - int Rd, int Rm, int Rs, int Rn); - virtual void SMLAL(int cc, int xy, - int RdHi, int RdLo, int Rs, int Rm); - virtual void SMLAW(int cc, int y, - int Rd, int Rm, int Rs, int Rn); - virtual void UXTB16(int cc, int Rd, int Rm, int rotate); - virtual void UBFX(int cc, int Rd, int Rn, int lsb, int width); - -private: - ARMAssembler(const ARMAssembler& rhs); - ARMAssembler& operator = (const ARMAssembler& rhs); - - sp mAssembly; - uint32_t* mBase; - uint32_t* mPC; - uint32_t* mPrologPC; - int64_t mDuration; - - struct branch_target_t { - inline branch_target_t() : label(0), pc(0) { } - inline branch_target_t(const char* l, uint32_t* p) - : label(l), pc(p) { } - const char* label; - uint32_t* pc; - }; - - Vector mBranchTargets; - KeyedVector< const char*, uint32_t* > mLabels; - KeyedVector< uint32_t*, const char* > mLabelsInverseMapping; - KeyedVector< uint32_t*, const char* > mComments; -}; - -}; // namespace android - -#endif //ANDROID_ARMASSEMBLER_H diff --git a/libpixelflinger/codeflinger/ARMAssemblerInterface.cpp b/libpixelflinger/codeflinger/ARMAssemblerInterface.cpp deleted file mode 100644 index c96cf4b02..000000000 --- a/libpixelflinger/codeflinger/ARMAssemblerInterface.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* libs/pixelflinger/codeflinger/ARMAssemblerInterface.cpp -** -** Copyright 2006, 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 "pixelflinger-code" - -#include -#include -#include -#include - -#include - -#include "ARMAssemblerInterface.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -ARMAssemblerInterface::~ARMAssemblerInterface() -{ -} - -// -------------------------------------------------------------------- - -// The following two functions are static and used for initializers -// in the original ARM code. The above versions (without __), are now -// virtual, and can be overridden in the MIPS code. But since these are -// needed at initialization time, they must be static. Not thrilled with -// this implementation, but it works... - -uint32_t ARMAssemblerInterface::__immed12_pre(int32_t immed12, int W) -{ - LOG_ALWAYS_FATAL_IF(abs(immed12) >= 0x800, - "LDR(B)/STR(B)/PLD immediate too big (%08x)", - immed12); - return (1<<24) | (((uint32_t(immed12)>>31)^1)<<23) | - ((W&1)<<21) | (abs(immed12)&0x7FF); -} - -uint32_t ARMAssemblerInterface::__immed8_pre(int32_t immed8, int W) -{ - uint32_t offset = abs(immed8); - - LOG_ALWAYS_FATAL_IF(abs(immed8) >= 0x100, - "LDRH/LDRSB/LDRSH/STRH immediate too big (%08x)", - immed8); - - return (1<<24) | (1<<22) | (((uint32_t(immed8)>>31)^1)<<23) | - ((W&1)<<21) | (((offset&0xF0)<<4)|(offset&0xF)); -} - -// The following four functions are required for address manipulation -// These are virtual functions, which can be overridden by architectures -// that need special handling of address values (e.g. 64-bit arch) - -void ARMAssemblerInterface::ADDR_LDR(int cc, int Rd, - int Rn, uint32_t offset) -{ - LDR(cc, Rd, Rn, offset); -} -void ARMAssemblerInterface::ADDR_STR(int cc, int Rd, - int Rn, uint32_t offset) -{ - STR(cc, Rd, Rn, offset); -} -void ARMAssemblerInterface::ADDR_ADD(int cc, int s, - int Rd, int Rn, uint32_t Op2) -{ - dataProcessing(opADD, cc, s, Rd, Rn, Op2); -} -void ARMAssemblerInterface::ADDR_SUB(int cc, int s, - int Rd, int Rn, uint32_t Op2) -{ - dataProcessing(opSUB, cc, s, Rd, Rn, Op2); -} -}; // namespace android - diff --git a/libpixelflinger/codeflinger/ARMAssemblerInterface.h b/libpixelflinger/codeflinger/ARMAssemblerInterface.h deleted file mode 100644 index 72935acd2..000000000 --- a/libpixelflinger/codeflinger/ARMAssemblerInterface.h +++ /dev/null @@ -1,349 +0,0 @@ -/* libs/pixelflinger/codeflinger/ARMAssemblerInterface.h -** -** Copyright 2006, 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_ARMASSEMBLER_INTERFACE_H -#define ANDROID_ARMASSEMBLER_INTERFACE_H - -#include -#include - -namespace android { - -// ---------------------------------------------------------------------------- - -class ARMAssemblerInterface -{ -public: - virtual ~ARMAssemblerInterface(); - - enum { - EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL, NV, - HS = CS, - LO = CC - }; - enum { - S = 1 - }; - enum { - LSL, LSR, ASR, ROR - }; - enum { - ED, FD, EA, FA, - IB, IA, DB, DA - }; - enum { - R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, - SP = R13, - LR = R14, - PC = R15 - }; - enum { - #define LIST(rr) L##rr=1< -#include - -#include "ARMAssemblerProxy.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -ARMAssemblerProxy::ARMAssemblerProxy() - : mTarget(0) -{ -} - -ARMAssemblerProxy::ARMAssemblerProxy(ARMAssemblerInterface* target) - : mTarget(target) -{ -} - -ARMAssemblerProxy::~ARMAssemblerProxy() -{ - delete mTarget; -} - -void ARMAssemblerProxy::setTarget(ARMAssemblerInterface* target) -{ - delete mTarget; - mTarget = target; -} - -void ARMAssemblerProxy::reset() { - mTarget->reset(); -} -int ARMAssemblerProxy::generate(const char* name) { - return mTarget->generate(name); -} -void ARMAssemblerProxy::disassemble(const char* name) { - return mTarget->disassemble(name); -} -int ARMAssemblerProxy::getCodegenArch() -{ - return mTarget->getCodegenArch(); -} -void ARMAssemblerProxy::prolog() { - mTarget->prolog(); -} -void ARMAssemblerProxy::epilog(uint32_t touched) { - mTarget->epilog(touched); -} -void ARMAssemblerProxy::comment(const char* string) { - mTarget->comment(string); -} - - - -// addressing modes - -bool ARMAssemblerProxy::isValidImmediate(uint32_t immed) -{ - return mTarget->isValidImmediate(immed); -} - -int ARMAssemblerProxy::buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm) -{ - return mTarget->buildImmediate(i, rot, imm); -} - - - -uint32_t ARMAssemblerProxy::imm(uint32_t immediate) -{ - return mTarget->imm(immediate); -} - -uint32_t ARMAssemblerProxy::reg_imm(int Rm, int type, uint32_t shift) -{ - return mTarget->reg_imm(Rm, type, shift); -} - -uint32_t ARMAssemblerProxy::reg_rrx(int Rm) -{ - return mTarget->reg_rrx(Rm); -} - -uint32_t ARMAssemblerProxy::reg_reg(int Rm, int type, int Rs) -{ - return mTarget->reg_reg(Rm, type, Rs); -} - - -// addressing modes... -// LDR(B)/STR(B)/PLD -// (immediate and Rm can be negative, which indicates U=0) -uint32_t ARMAssemblerProxy::immed12_pre(int32_t immed12, int W) -{ - return mTarget->immed12_pre(immed12, W); -} - -uint32_t ARMAssemblerProxy::immed12_post(int32_t immed12) -{ - return mTarget->immed12_post(immed12); -} - -uint32_t ARMAssemblerProxy::reg_scale_pre(int Rm, int type, uint32_t shift, int W) -{ - return mTarget->reg_scale_pre(Rm, type, shift, W); -} - -uint32_t ARMAssemblerProxy::reg_scale_post(int Rm, int type, uint32_t shift) -{ - return mTarget->reg_scale_post(Rm, type, shift); -} - - -// LDRH/LDRSB/LDRSH/STRH -// (immediate and Rm can be negative, which indicates U=0) -uint32_t ARMAssemblerProxy::immed8_pre(int32_t immed8, int W) -{ - return mTarget->immed8_pre(immed8, W); -} - -uint32_t ARMAssemblerProxy::immed8_post(int32_t immed8) -{ - return mTarget->immed8_post(immed8); -} - -uint32_t ARMAssemblerProxy::reg_pre(int Rm, int W) -{ - return mTarget->reg_pre(Rm, W); -} - -uint32_t ARMAssemblerProxy::reg_post(int Rm) -{ - return mTarget->reg_post(Rm); -} - - -//------------------------------------------------------------------------ - - - -void ARMAssemblerProxy::dataProcessing( int opcode, int cc, int s, - int Rd, int Rn, uint32_t Op2) -{ - mTarget->dataProcessing(opcode, cc, s, Rd, Rn, Op2); -} - -void ARMAssemblerProxy::MLA(int cc, int s, int Rd, int Rm, int Rs, int Rn) { - mTarget->MLA(cc, s, Rd, Rm, Rs, Rn); -} -void ARMAssemblerProxy::MUL(int cc, int s, int Rd, int Rm, int Rs) { - mTarget->MUL(cc, s, Rd, Rm, Rs); -} -void ARMAssemblerProxy::UMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs) { - mTarget->UMULL(cc, s, RdLo, RdHi, Rm, Rs); -} -void ARMAssemblerProxy::UMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs) { - mTarget->UMUAL(cc, s, RdLo, RdHi, Rm, Rs); -} -void ARMAssemblerProxy::SMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs) { - mTarget->SMULL(cc, s, RdLo, RdHi, Rm, Rs); -} -void ARMAssemblerProxy::SMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs) { - mTarget->SMUAL(cc, s, RdLo, RdHi, Rm, Rs); -} - -void ARMAssemblerProxy::B(int cc, uint32_t* pc) { - mTarget->B(cc, pc); -} -void ARMAssemblerProxy::BL(int cc, uint32_t* pc) { - mTarget->BL(cc, pc); -} -void ARMAssemblerProxy::BX(int cc, int Rn) { - mTarget->BX(cc, Rn); -} -void ARMAssemblerProxy::label(const char* theLabel) { - mTarget->label(theLabel); -} -void ARMAssemblerProxy::B(int cc, const char* label) { - mTarget->B(cc, label); -} -void ARMAssemblerProxy::BL(int cc, const char* label) { - mTarget->BL(cc, label); -} - -uint32_t* ARMAssemblerProxy::pcForLabel(const char* label) { - return mTarget->pcForLabel(label); -} - -void ARMAssemblerProxy::LDR(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->LDR(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::LDRB(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->LDRB(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::STR(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->STR(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::STRB(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->STRB(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::LDRH(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->LDRH(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::LDRSB(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->LDRSB(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::LDRSH(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->LDRSH(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::STRH(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->STRH(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::LDM(int cc, int dir, int Rn, int W, uint32_t reg_list) { - mTarget->LDM(cc, dir, Rn, W, reg_list); -} -void ARMAssemblerProxy::STM(int cc, int dir, int Rn, int W, uint32_t reg_list) { - mTarget->STM(cc, dir, Rn, W, reg_list); -} - -void ARMAssemblerProxy::SWP(int cc, int Rn, int Rd, int Rm) { - mTarget->SWP(cc, Rn, Rd, Rm); -} -void ARMAssemblerProxy::SWPB(int cc, int Rn, int Rd, int Rm) { - mTarget->SWPB(cc, Rn, Rd, Rm); -} -void ARMAssemblerProxy::SWI(int cc, uint32_t comment) { - mTarget->SWI(cc, comment); -} - - -void ARMAssemblerProxy::PLD(int Rn, uint32_t offset) { - mTarget->PLD(Rn, offset); -} -void ARMAssemblerProxy::CLZ(int cc, int Rd, int Rm) { - mTarget->CLZ(cc, Rd, Rm); -} -void ARMAssemblerProxy::QADD(int cc, int Rd, int Rm, int Rn) { - mTarget->QADD(cc, Rd, Rm, Rn); -} -void ARMAssemblerProxy::QDADD(int cc, int Rd, int Rm, int Rn) { - mTarget->QDADD(cc, Rd, Rm, Rn); -} -void ARMAssemblerProxy::QSUB(int cc, int Rd, int Rm, int Rn) { - mTarget->QSUB(cc, Rd, Rm, Rn); -} -void ARMAssemblerProxy::QDSUB(int cc, int Rd, int Rm, int Rn) { - mTarget->QDSUB(cc, Rd, Rm, Rn); -} -void ARMAssemblerProxy::SMUL(int cc, int xy, int Rd, int Rm, int Rs) { - mTarget->SMUL(cc, xy, Rd, Rm, Rs); -} -void ARMAssemblerProxy::SMULW(int cc, int y, int Rd, int Rm, int Rs) { - mTarget->SMULW(cc, y, Rd, Rm, Rs); -} -void ARMAssemblerProxy::SMLA(int cc, int xy, int Rd, int Rm, int Rs, int Rn) { - mTarget->SMLA(cc, xy, Rd, Rm, Rs, Rn); -} -void ARMAssemblerProxy::SMLAL( int cc, int xy, - int RdHi, int RdLo, int Rs, int Rm) { - mTarget->SMLAL(cc, xy, RdHi, RdLo, Rs, Rm); -} -void ARMAssemblerProxy::SMLAW(int cc, int y, int Rd, int Rm, int Rs, int Rn) { - mTarget->SMLAW(cc, y, Rd, Rm, Rs, Rn); -} - -void ARMAssemblerProxy::UXTB16(int cc, int Rd, int Rm, int rotate) { - mTarget->UXTB16(cc, Rd, Rm, rotate); -} - -void ARMAssemblerProxy::UBFX(int cc, int Rd, int Rn, int lsb, int width) { - mTarget->UBFX(cc, Rd, Rn, lsb, width); -} - -void ARMAssemblerProxy::ADDR_LDR(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->ADDR_LDR(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::ADDR_STR(int cc, int Rd, int Rn, uint32_t offset) { - mTarget->ADDR_STR(cc, Rd, Rn, offset); -} -void ARMAssemblerProxy::ADDR_ADD(int cc, int s, int Rd, int Rn, uint32_t Op2){ - mTarget->ADDR_ADD(cc, s, Rd, Rn, Op2); -} -void ARMAssemblerProxy::ADDR_SUB(int cc, int s, int Rd, int Rn, uint32_t Op2){ - mTarget->ADDR_SUB(cc, s, Rd, Rn, Op2); -} - -}; // namespace android - diff --git a/libpixelflinger/codeflinger/ARMAssemblerProxy.h b/libpixelflinger/codeflinger/ARMAssemblerProxy.h deleted file mode 100644 index 10d039085..000000000 --- a/libpixelflinger/codeflinger/ARMAssemblerProxy.h +++ /dev/null @@ -1,164 +0,0 @@ -/* libs/pixelflinger/codeflinger/ARMAssemblerProxy.h -** -** Copyright 2006, 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_ARMASSEMBLER_PROXY_H -#define ANDROID_ARMASSEMBLER_PROXY_H - -#include -#include - -#include "ARMAssemblerInterface.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -class ARMAssemblerProxy : public ARMAssemblerInterface -{ -public: - // ARMAssemblerProxy take ownership of the target - - ARMAssemblerProxy(); - explicit ARMAssemblerProxy(ARMAssemblerInterface* target); - virtual ~ARMAssemblerProxy(); - - void setTarget(ARMAssemblerInterface* target); - - virtual void reset(); - virtual int generate(const char* name); - virtual void disassemble(const char* name); - virtual int getCodegenArch(); - - virtual void prolog(); - virtual void epilog(uint32_t touched); - virtual void comment(const char* string); - - // ----------------------------------------------------------------------- - // shifters and addressing modes - // ----------------------------------------------------------------------- - - virtual bool isValidImmediate(uint32_t immed); - virtual int buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm); - - virtual uint32_t imm(uint32_t immediate); - virtual uint32_t reg_imm(int Rm, int type, uint32_t shift); - virtual uint32_t reg_rrx(int Rm); - virtual uint32_t reg_reg(int Rm, int type, int Rs); - - // addressing modes... - // LDR(B)/STR(B)/PLD - // (immediate and Rm can be negative, which indicates U=0) - virtual uint32_t immed12_pre(int32_t immed12, int W=0); - virtual uint32_t immed12_post(int32_t immed12); - virtual uint32_t reg_scale_pre(int Rm, int type=0, uint32_t shift=0, int W=0); - virtual uint32_t reg_scale_post(int Rm, int type=0, uint32_t shift=0); - - // LDRH/LDRSB/LDRSH/STRH - // (immediate and Rm can be negative, which indicates U=0) - virtual uint32_t immed8_pre(int32_t immed8, int W=0); - virtual uint32_t immed8_post(int32_t immed8); - virtual uint32_t reg_pre(int Rm, int W=0); - virtual uint32_t reg_post(int Rm); - - - virtual void dataProcessing(int opcode, int cc, int s, - int Rd, int Rn, - uint32_t Op2); - virtual void MLA(int cc, int s, - int Rd, int Rm, int Rs, int Rn); - virtual void MUL(int cc, int s, - int Rd, int Rm, int Rs); - virtual void UMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void UMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - - virtual void B(int cc, uint32_t* pc); - virtual void BL(int cc, uint32_t* pc); - virtual void BX(int cc, int Rn); - virtual void label(const char* theLabel); - virtual void B(int cc, const char* label); - virtual void BL(int cc, const char* label); - - uint32_t* pcForLabel(const char* label); - - virtual void LDR (int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void LDRB(int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void STR (int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void STRB(int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void LDRH (int cc, int Rd, - int Rn, uint32_t offset = __immed8_pre(0)); - virtual void LDRSB(int cc, int Rd, - int Rn, uint32_t offset = __immed8_pre(0)); - virtual void LDRSH(int cc, int Rd, - int Rn, uint32_t offset = __immed8_pre(0)); - virtual void STRH (int cc, int Rd, - int Rn, uint32_t offset = __immed8_pre(0)); - virtual void LDM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - virtual void STM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - - virtual void SWP(int cc, int Rn, int Rd, int Rm); - virtual void SWPB(int cc, int Rn, int Rd, int Rm); - virtual void SWI(int cc, uint32_t comment); - - virtual void PLD(int Rn, uint32_t offset); - virtual void CLZ(int cc, int Rd, int Rm); - virtual void QADD(int cc, int Rd, int Rm, int Rn); - virtual void QDADD(int cc, int Rd, int Rm, int Rn); - virtual void QSUB(int cc, int Rd, int Rm, int Rn); - virtual void QDSUB(int cc, int Rd, int Rm, int Rn); - virtual void SMUL(int cc, int xy, - int Rd, int Rm, int Rs); - virtual void SMULW(int cc, int y, - int Rd, int Rm, int Rs); - virtual void SMLA(int cc, int xy, - int Rd, int Rm, int Rs, int Rn); - virtual void SMLAL(int cc, int xy, - int RdHi, int RdLo, int Rs, int Rm); - virtual void SMLAW(int cc, int y, - int Rd, int Rm, int Rs, int Rn); - - virtual void UXTB16(int cc, int Rd, int Rm, int rotate); - virtual void UBFX(int cc, int Rd, int Rn, int lsb, int width); - - virtual void ADDR_LDR(int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void ADDR_STR (int cc, int Rd, - int Rn, uint32_t offset = __immed12_pre(0)); - virtual void ADDR_ADD(int cc, int s, int Rd, - int Rn, uint32_t Op2); - virtual void ADDR_SUB(int cc, int s, int Rd, - int Rn, uint32_t Op2); - -private: - ARMAssemblerInterface* mTarget; -}; - -}; // namespace android - -#endif //ANDROID_ARMASSEMBLER_PROXY_H diff --git a/libpixelflinger/codeflinger/Arm64Assembler.cpp b/libpixelflinger/codeflinger/Arm64Assembler.cpp deleted file mode 100644 index 8926776d4..000000000 --- a/libpixelflinger/codeflinger/Arm64Assembler.cpp +++ /dev/null @@ -1,1240 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#define LOG_TAG "ArmToArm64Assembler" - -#include -#include -#include - -#include -#include -#include - -#include "codeflinger/Arm64Assembler.h" -#include "codeflinger/Arm64Disassembler.h" -#include "codeflinger/CodeCache.h" - -/* -** -------------------------------------------- -** Support for Arm64 in GGLAssembler JIT -** -------------------------------------------- -** -** Approach -** - GGLAssembler and associated files are largely un-changed. -** - A translator class maps ArmAssemblerInterface calls to -** generate Arm64 instructions. -** -** ---------------------- -** ArmToArm64Assembler -** ---------------------- -** -** - Subclassed from ArmAssemblerInterface -** -** - Translates each ArmAssemblerInterface call to generate -** one or more Arm64 instructions as necessary. -** -** - Does not implement ArmAssemblerInterface portions unused by GGLAssembler -** It calls NOT_IMPLEMENTED() for such cases, which in turn logs -** a fatal message. -** -** - Uses A64_.. series of functions to generate instruction machine code -** for Arm64 instructions. These functions also log the instruction -** to LOG, if ARM64_ASM_DEBUG define is set to 1 -** -** - Dumps machine code and eqvt assembly if "debug.pf.disasm" option is set -** It uses arm64_disassemble to perform disassembly -** -** - Uses register 13 (SP in ARM), 15 (PC in ARM), 16, 17 for storing -** intermediate results. GGLAssembler does not use SP and PC as these -** registers are marked as reserved. The temporary registers are not -** saved/restored on stack as these are caller-saved registers in Arm64 -** -** - Uses CSEL instruction to support conditional execution. The result is -** stored in a temporary register and then copied to the target register -** if the condition is true. -** -** - In the case of conditional data transfer instructions, conditional -** branch is used to skip over instruction, if the condition is false -** -** - Wherever possible, immediate values are transferred to temporary -** register prior to processing. This simplifies overall implementation -** as instructions requiring immediate values are converted to -** move immediate instructions followed by register-register instruction. -** -** -------------------------------------------- -** ArmToArm64Assembler unit test bench -** -------------------------------------------- -** -** - Tests ArmToArm64Assembler interface for all the possible -** ways in which GGLAssembler uses ArmAssemblerInterface interface. -** -** - Uses test jacket (written in assembly) to set the registers, -** condition flags prior to calling generated instruction. It also -** copies registers and flags at the end of execution. Caller then -** checks if generated code performed correct operation based on -** output registers and flags. -** -** - Broadly contains three type of tests, (i) data operation tests -** (ii) data transfer tests and (iii) LDM/STM tests. -** -** ---------------------- -** Arm64 disassembler -** ---------------------- -** - This disassembler disassembles only those machine codes which can be -** generated by ArmToArm64Assembler. It has a unit testbench which -** tests all the instructions supported by the disassembler. -** -** ------------------------------------------------------------------ -** ARMAssembler/ARMAssemblerInterface/ARMAssemblerProxy changes -** ------------------------------------------------------------------ -** -** - In existing code, addresses were being handled as 32 bit values at -** certain places. -** -** - Added a new set of functions for address load/store/manipulation. -** These are ADDR_LDR, ADDR_STR, ADDR_ADD, ADDR_SUB and they map to -** default 32 bit implementations in ARMAssemblerInterface. -** -** - ArmToArm64Assembler maps these functions to appropriate 64 bit -** functions. -** -** ---------------------- -** GGLAssembler changes -** ---------------------- -** - Since ArmToArm64Assembler can generate 4 Arm64 instructions for -** each call in worst case, the memory required is set to 4 times -** ARM memory -** -** - Address load/store/manipulation were changed to use new functions -** added in the ARMAssemblerInterface. -** -*/ - - -#define NOT_IMPLEMENTED() LOG_FATAL("Arm instruction %s not yet implemented\n", __func__) - -#define ARM64_ASM_DEBUG 0 - -#if ARM64_ASM_DEBUG - #define LOG_INSTR(...) ALOGD("\t" __VA_ARGS__) - #define LOG_LABEL(...) ALOGD(__VA_ARGS__) -#else - #define LOG_INSTR(...) ((void)0) - #define LOG_LABEL(...) ((void)0) -#endif - -namespace android { - -static __unused const char* shift_codes[] = -{ - "LSL", "LSR", "ASR", "ROR" -}; -static __unused const char *cc_codes[] = -{ - "EQ", "NE", "CS", "CC", "MI", - "PL", "VS", "VC", "HI", "LS", - "GE", "LT", "GT", "LE", "AL", "NV" -}; - -ArmToArm64Assembler::ArmToArm64Assembler(const sp& assembly) - : ARMAssemblerInterface(), - mAssembly(assembly) -{ - mBase = mPC = (uint32_t *)assembly->base(); - mDuration = ggl_system_time(); - mZeroReg = 13; - mTmpReg1 = 15; - mTmpReg2 = 16; - mTmpReg3 = 17; -} - -ArmToArm64Assembler::ArmToArm64Assembler(void *base) - : ARMAssemblerInterface(), mAssembly(NULL) -{ - mBase = mPC = (uint32_t *)base; - mDuration = ggl_system_time(); - // Regs 13, 15, 16, 17 are used as temporary registers - mZeroReg = 13; - mTmpReg1 = 15; - mTmpReg2 = 16; - mTmpReg3 = 17; -} - -ArmToArm64Assembler::~ArmToArm64Assembler() -{ -} - -uint32_t* ArmToArm64Assembler::pc() const -{ - return mPC; -} - -uint32_t* ArmToArm64Assembler::base() const -{ - return mBase; -} - -void ArmToArm64Assembler::reset() -{ - if(mAssembly == NULL) - mPC = mBase; - else - mBase = mPC = (uint32_t *)mAssembly->base(); - mBranchTargets.clear(); - mLabels.clear(); - mLabelsInverseMapping.clear(); - mComments.clear(); -#if ARM64_ASM_DEBUG - ALOGI("RESET\n"); -#endif -} - -int ArmToArm64Assembler::getCodegenArch() -{ - return CODEGEN_ARCH_ARM64; -} - -// ---------------------------------------------------------------------------- - -void ArmToArm64Assembler::disassemble(const char* name) -{ - if(name) - { - printf("%s:\n", name); - } - size_t count = pc()-base(); - uint32_t* i = base(); - while (count--) - { - ssize_t label = mLabelsInverseMapping.indexOfKey(i); - if (label >= 0) - { - printf("%s:\n", mLabelsInverseMapping.valueAt(label)); - } - ssize_t comment = mComments.indexOfKey(i); - if (comment >= 0) - { - printf("; %s\n", mComments.valueAt(comment)); - } - printf("%p: %08x ", i, uint32_t(i[0])); - { - char instr[256]; - ::arm64_disassemble(*i, instr); - printf("%s\n", instr); - } - i++; - } -} - -void ArmToArm64Assembler::comment(const char* string) -{ - mComments.add(mPC, string); - LOG_INSTR("//%s\n", string); -} - -void ArmToArm64Assembler::label(const char* theLabel) -{ - mLabels.add(theLabel, mPC); - mLabelsInverseMapping.add(mPC, theLabel); - LOG_LABEL("%s:\n", theLabel); -} - -void ArmToArm64Assembler::B(int cc, const char* label) -{ - mBranchTargets.add(branch_target_t(label, mPC)); - LOG_INSTR("B%s %s\n", cc_codes[cc], label ); - *mPC++ = (0x54 << 24) | cc; -} - -void ArmToArm64Assembler::BL(int /*cc*/, const char* /*label*/) -{ - NOT_IMPLEMENTED(); //Not Required -} - -// ---------------------------------------------------------------------------- -//Prolog/Epilog & Generate... -// ---------------------------------------------------------------------------- - -void ArmToArm64Assembler::prolog() -{ - // write prolog code - mPrologPC = mPC; - *mPC++ = A64_MOVZ_X(mZeroReg,0,0); -} - -void ArmToArm64Assembler::epilog(uint32_t /*touched*/) -{ - // write epilog code - static const int XLR = 30; - *mPC++ = A64_RET(XLR); -} - -int ArmToArm64Assembler::generate(const char* name) -{ - // fixup all the branches - size_t count = mBranchTargets.size(); - while (count--) - { - const branch_target_t& bt = mBranchTargets[count]; - uint32_t* target_pc = mLabels.valueFor(bt.label); - LOG_ALWAYS_FATAL_IF(!target_pc, - "error resolving branch targets, target_pc is null"); - int32_t offset = int32_t(target_pc - bt.pc); - *bt.pc |= (offset & 0x7FFFF) << 5; - } - - if(mAssembly != NULL) - mAssembly->resize( int(pc()-base())*4 ); - - // the instruction cache is flushed by CodeCache - const int64_t duration = ggl_system_time() - mDuration; - const char * const format = "generated %s (%d ins) at [%p:%p] in %ld ns\n"; - ALOGI(format, name, int(pc()-base()), base(), pc(), duration); - - - char value[PROPERTY_VALUE_MAX]; - property_get("debug.pf.disasm", value, "0"); - if (atoi(value) != 0) - { - printf(format, name, int(pc()-base()), base(), pc(), duration); - disassemble(name); - } - return OK; -} - -uint32_t* ArmToArm64Assembler::pcForLabel(const char* label) -{ - return mLabels.valueFor(label); -} - -// ---------------------------------------------------------------------------- -// Data Processing... -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::dataProcessingCommon(int opcode, - int s, int Rd, int Rn, uint32_t Op2) -{ - if(opcode != opSUB && s == 1) - { - NOT_IMPLEMENTED(); //Not required - return; - } - - if(opcode != opSUB && opcode != opADD && opcode != opAND && - opcode != opORR && opcode != opMVN) - { - NOT_IMPLEMENTED(); //Not required - return; - } - - if(Op2 == OPERAND_REG_IMM && mAddrMode.reg_imm_shift > 31) - { - NOT_IMPLEMENTED(); - return; - } - - //Store immediate in temporary register and convert - //immediate operation into register operation - if(Op2 == OPERAND_IMM) - { - int imm = mAddrMode.immediate; - *mPC++ = A64_MOVZ_W(mTmpReg2, imm & 0x0000FFFF, 0); - *mPC++ = A64_MOVK_W(mTmpReg2, (imm >> 16) & 0x0000FFFF, 16); - Op2 = mTmpReg2; - } - - - { - uint32_t shift; - uint32_t amount; - uint32_t Rm; - - if(Op2 == OPERAND_REG_IMM) - { - shift = mAddrMode.reg_imm_type; - amount = mAddrMode.reg_imm_shift; - Rm = mAddrMode.reg_imm_Rm; - } - else if(Op2 < OPERAND_REG) - { - shift = 0; - amount = 0; - Rm = Op2; - } - else - { - NOT_IMPLEMENTED(); //Not required - return; - } - - switch(opcode) - { - case opADD: *mPC++ = A64_ADD_W(Rd, Rn, Rm, shift, amount); break; - case opAND: *mPC++ = A64_AND_W(Rd, Rn, Rm, shift, amount); break; - case opORR: *mPC++ = A64_ORR_W(Rd, Rn, Rm, shift, amount); break; - case opMVN: *mPC++ = A64_ORN_W(Rd, Rn, Rm, shift, amount); break; - case opSUB: *mPC++ = A64_SUB_W(Rd, Rn, Rm, shift, amount, s);break; - }; - - } -} - -void ArmToArm64Assembler::dataProcessing(int opcode, int cc, - int s, int Rd, int Rn, uint32_t Op2) -{ - uint32_t Wd; - - if(cc != AL) - Wd = mTmpReg1; - else - Wd = Rd; - - if(opcode == opADD || opcode == opAND || opcode == opORR ||opcode == opSUB) - { - dataProcessingCommon(opcode, s, Wd, Rn, Op2); - } - else if(opcode == opCMP) - { - dataProcessingCommon(opSUB, 1, mTmpReg3, Rn, Op2); - } - else if(opcode == opRSB) - { - dataProcessingCommon(opSUB, s, Wd, Rn, Op2); - dataProcessingCommon(opSUB, s, Wd, mZeroReg, Wd); - } - else if(opcode == opMOV) - { - dataProcessingCommon(opORR, 0, Wd, mZeroReg, Op2); - if(s == 1) - { - dataProcessingCommon(opSUB, 1, mTmpReg3, Wd, mZeroReg); - } - } - else if(opcode == opMVN) - { - dataProcessingCommon(opMVN, s, Wd, mZeroReg, Op2); - } - else if(opcode == opBIC) - { - dataProcessingCommon(opMVN, s, mTmpReg3, mZeroReg, Op2); - dataProcessingCommon(opAND, s, Wd, Rn, mTmpReg3); - } - else - { - NOT_IMPLEMENTED(); - return; - } - - if(cc != AL) - { - *mPC++ = A64_CSEL_W(Rd, mTmpReg1, Rd, cc); - } -} -// ---------------------------------------------------------------------------- -// Address Processing... -// ---------------------------------------------------------------------------- - -void ArmToArm64Assembler::ADDR_ADD(int cc, - int s, int Rd, int Rn, uint32_t Op2) -{ - if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required - if(s != 0) { NOT_IMPLEMENTED(); return;} //Not required - - - if(Op2 == OPERAND_REG_IMM && mAddrMode.reg_imm_type == LSL) - { - int Rm = mAddrMode.reg_imm_Rm; - int amount = mAddrMode.reg_imm_shift; - *mPC++ = A64_ADD_X_Wm_SXTW(Rd, Rn, Rm, amount); - } - else if(Op2 < OPERAND_REG) - { - int Rm = Op2; - int amount = 0; - *mPC++ = A64_ADD_X_Wm_SXTW(Rd, Rn, Rm, amount); - } - else if(Op2 == OPERAND_IMM) - { - int imm = mAddrMode.immediate; - *mPC++ = A64_MOVZ_W(mTmpReg1, imm & 0x0000FFFF, 0); - *mPC++ = A64_MOVK_W(mTmpReg1, (imm >> 16) & 0x0000FFFF, 16); - - int Rm = mTmpReg1; - int amount = 0; - *mPC++ = A64_ADD_X_Wm_SXTW(Rd, Rn, Rm, amount); - } - else - { - NOT_IMPLEMENTED(); //Not required - } -} - -void ArmToArm64Assembler::ADDR_SUB(int cc, - int s, int Rd, int Rn, uint32_t Op2) -{ - if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required - if(s != 0) { NOT_IMPLEMENTED(); return;} //Not required - - if(Op2 == OPERAND_REG_IMM && mAddrMode.reg_imm_type == LSR) - { - *mPC++ = A64_ADD_W(mTmpReg1, mZeroReg, mAddrMode.reg_imm_Rm, - LSR, mAddrMode.reg_imm_shift); - *mPC++ = A64_SUB_X_Wm_SXTW(Rd, Rn, mTmpReg1, 0); - } - else - { - NOT_IMPLEMENTED(); //Not required - } -} - -// ---------------------------------------------------------------------------- -// multiply... -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::MLA(int cc, int s,int Rd, int Rm, int Rs, int Rn) -{ - if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required - - *mPC++ = A64_MADD_W(Rd, Rm, Rs, Rn); - if(s == 1) - dataProcessingCommon(opSUB, 1, mTmpReg1, Rd, mZeroReg); -} -void ArmToArm64Assembler::MUL(int cc, int s, int Rd, int Rm, int Rs) -{ - if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required - if(s != 0) { NOT_IMPLEMENTED(); return;} //Not required - *mPC++ = A64_MADD_W(Rd, Rm, Rs, mZeroReg); -} -void ArmToArm64Assembler::UMULL(int /*cc*/, int /*s*/, - int /*RdLo*/, int /*RdHi*/, int /*Rm*/, int /*Rs*/) -{ - NOT_IMPLEMENTED(); //Not required -} -void ArmToArm64Assembler::UMUAL(int /*cc*/, int /*s*/, - int /*RdLo*/, int /*RdHi*/, int /*Rm*/, int /*Rs*/) -{ - NOT_IMPLEMENTED(); //Not required -} -void ArmToArm64Assembler::SMULL(int /*cc*/, int /*s*/, - int /*RdLo*/, int /*RdHi*/, int /*Rm*/, int /*Rs*/) -{ - NOT_IMPLEMENTED(); //Not required -} -void ArmToArm64Assembler::SMUAL(int /*cc*/, int /*s*/, - int /*RdLo*/, int /*RdHi*/, int /*Rm*/, int /*Rs*/) -{ - NOT_IMPLEMENTED(); //Not required -} - -// ---------------------------------------------------------------------------- -// branches relative to PC... -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::B(int /*cc*/, uint32_t* /*pc*/){ - NOT_IMPLEMENTED(); //Not required -} - -void ArmToArm64Assembler::BL(int /*cc*/, uint32_t* /*pc*/){ - NOT_IMPLEMENTED(); //Not required -} - -void ArmToArm64Assembler::BX(int /*cc*/, int /*Rn*/){ - NOT_IMPLEMENTED(); //Not required -} - -// ---------------------------------------------------------------------------- -// data transfer... -// ---------------------------------------------------------------------------- -enum dataTransferOp -{ - opLDR,opLDRB,opLDRH,opSTR,opSTRB,opSTRH -}; - -void ArmToArm64Assembler::dataTransfer(int op, int cc, - int Rd, int Rn, uint32_t op_type, uint32_t size) -{ - const int XSP = 31; - if(Rn == SP) - Rn = XSP; - - if(op_type == OPERAND_IMM) - { - int addrReg; - int imm = mAddrMode.immediate; - if(imm >= 0 && imm < (1<<12)) - *mPC++ = A64_ADD_IMM_X(mTmpReg1, mZeroReg, imm, 0); - else if(imm < 0 && -imm < (1<<12)) - *mPC++ = A64_SUB_IMM_X(mTmpReg1, mZeroReg, -imm, 0); - else - { - NOT_IMPLEMENTED(); - return; - } - - addrReg = Rn; - if(mAddrMode.preindex == true || mAddrMode.postindex == true) - { - *mPC++ = A64_ADD_X(mTmpReg2, addrReg, mTmpReg1); - if(mAddrMode.preindex == true) - addrReg = mTmpReg2; - } - - if(cc != AL) - *mPC++ = A64_B_COND(cc^1, 8); - - *mPC++ = A64_LDRSTR_Wm_SXTW_0(op, size, Rd, addrReg, mZeroReg); - - if(mAddrMode.writeback == true) - *mPC++ = A64_CSEL_X(Rn, mTmpReg2, Rn, cc); - } - else if(op_type == OPERAND_REG_OFFSET) - { - if(cc != AL) - *mPC++ = A64_B_COND(cc^1, 8); - *mPC++ = A64_LDRSTR_Wm_SXTW_0(op, size, Rd, Rn, mAddrMode.reg_offset); - - } - else if(op_type > OPERAND_UNSUPPORTED) - { - if(cc != AL) - *mPC++ = A64_B_COND(cc^1, 8); - *mPC++ = A64_LDRSTR_Wm_SXTW_0(op, size, Rd, Rn, mZeroReg); - } - else - { - NOT_IMPLEMENTED(); // Not required - } - return; - -} -void ArmToArm64Assembler::ADDR_LDR(int cc, int Rd, int Rn, uint32_t op_type) -{ - return dataTransfer(opLDR, cc, Rd, Rn, op_type, 64); -} -void ArmToArm64Assembler::ADDR_STR(int cc, int Rd, int Rn, uint32_t op_type) -{ - return dataTransfer(opSTR, cc, Rd, Rn, op_type, 64); -} -void ArmToArm64Assembler::LDR(int cc, int Rd, int Rn, uint32_t op_type) -{ - return dataTransfer(opLDR, cc, Rd, Rn, op_type); -} -void ArmToArm64Assembler::LDRB(int cc, int Rd, int Rn, uint32_t op_type) -{ - return dataTransfer(opLDRB, cc, Rd, Rn, op_type); -} -void ArmToArm64Assembler::STR(int cc, int Rd, int Rn, uint32_t op_type) -{ - return dataTransfer(opSTR, cc, Rd, Rn, op_type); -} - -void ArmToArm64Assembler::STRB(int cc, int Rd, int Rn, uint32_t op_type) -{ - return dataTransfer(opSTRB, cc, Rd, Rn, op_type); -} - -void ArmToArm64Assembler::LDRH(int cc, int Rd, int Rn, uint32_t op_type) -{ - return dataTransfer(opLDRH, cc, Rd, Rn, op_type); -} -void ArmToArm64Assembler::LDRSB(int /*cc*/, int /*Rd*/, int /*Rn*/, uint32_t /*offset*/) -{ - NOT_IMPLEMENTED(); //Not required -} -void ArmToArm64Assembler::LDRSH(int /*cc*/, int /*Rd*/, int /*Rn*/, uint32_t /*offset*/) -{ - NOT_IMPLEMENTED(); //Not required -} - -void ArmToArm64Assembler::STRH(int cc, int Rd, int Rn, uint32_t op_type) -{ - return dataTransfer(opSTRH, cc, Rd, Rn, op_type); -} - -// ---------------------------------------------------------------------------- -// block data transfer... -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::LDM(int cc, int dir, - int Rn, int W, uint32_t reg_list) -{ - const int XSP = 31; - if(cc != AL || dir != IA || W == 0 || Rn != SP) - { - NOT_IMPLEMENTED(); - return; - } - - for(int i = 0; i < 32; ++i) - { - if((reg_list & (1 << i))) - { - int reg = i; - int size = 16; - *mPC++ = A64_LDR_IMM_PostIndex(reg, XSP, size); - } - } -} - -void ArmToArm64Assembler::STM(int cc, int dir, - int Rn, int W, uint32_t reg_list) -{ - const int XSP = 31; - if(cc != AL || dir != DB || W == 0 || Rn != SP) - { - NOT_IMPLEMENTED(); - return; - } - - for(int i = 31; i >= 0; --i) - { - if((reg_list & (1 << i))) - { - int size = -16; - int reg = i; - *mPC++ = A64_STR_IMM_PreIndex(reg, XSP, size); - } - } -} - -// ---------------------------------------------------------------------------- -// special... -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::SWP(int /*cc*/, int /*Rn*/, int /*Rd*/, int /*Rm*/) -{ - NOT_IMPLEMENTED(); //Not required -} -void ArmToArm64Assembler::SWPB(int /*cc*/, int /*Rn*/, int /*Rd*/, int /*Rm*/) -{ - NOT_IMPLEMENTED(); //Not required -} -void ArmToArm64Assembler::SWI(int /*cc*/, uint32_t /*comment*/) -{ - NOT_IMPLEMENTED(); //Not required -} - -// ---------------------------------------------------------------------------- -// DSP instructions... -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::PLD(int /*Rn*/, uint32_t /*offset*/) { - NOT_IMPLEMENTED(); //Not required -} - -void ArmToArm64Assembler::CLZ(int /*cc*/, int /*Rd*/, int /*Rm*/) -{ - NOT_IMPLEMENTED(); //Not required -} - -void ArmToArm64Assembler::QADD(int /*cc*/, int /*Rd*/, int /*Rm*/, int /*Rn*/) -{ - NOT_IMPLEMENTED(); //Not required -} - -void ArmToArm64Assembler::QDADD(int /*cc*/, int /*Rd*/, int /*Rm*/, int /*Rn*/) -{ - NOT_IMPLEMENTED(); //Not required -} - -void ArmToArm64Assembler::QSUB(int /*cc*/, int /*Rd*/, int /*Rm*/, int /*Rn*/) -{ - NOT_IMPLEMENTED(); //Not required -} - -void ArmToArm64Assembler::QDSUB(int /*cc*/, int /*Rd*/, int /*Rm*/, int /*Rn*/) -{ - NOT_IMPLEMENTED(); //Not required -} - -// ---------------------------------------------------------------------------- -// 16 x 16 multiplication -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::SMUL(int cc, int xy, - int Rd, int Rm, int Rs) -{ - if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required - - if (xy & xyTB) - *mPC++ = A64_SBFM_W(mTmpReg1, Rm, 16, 31); - else - *mPC++ = A64_SBFM_W(mTmpReg1, Rm, 0, 15); - - if (xy & xyBT) - *mPC++ = A64_SBFM_W(mTmpReg2, Rs, 16, 31); - else - *mPC++ = A64_SBFM_W(mTmpReg2, Rs, 0, 15); - - *mPC++ = A64_MADD_W(Rd,mTmpReg1,mTmpReg2, mZeroReg); -} -// ---------------------------------------------------------------------------- -// 32 x 16 multiplication -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::SMULW(int cc, int y, int Rd, int Rm, int Rs) -{ - if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required - - if (y & yT) - *mPC++ = A64_SBFM_W(mTmpReg1, Rs, 16, 31); - else - *mPC++ = A64_SBFM_W(mTmpReg1, Rs, 0, 15); - - *mPC++ = A64_SBFM_W(mTmpReg2, Rm, 0, 31); - *mPC++ = A64_SMADDL(mTmpReg3,mTmpReg1,mTmpReg2, mZeroReg); - *mPC++ = A64_UBFM_X(Rd,mTmpReg3, 16, 47); -} -// ---------------------------------------------------------------------------- -// 16 x 16 multiplication and accumulate -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::SMLA(int cc, int xy, int Rd, int Rm, int Rs, int Rn) -{ - if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required - if(xy != xyBB) { NOT_IMPLEMENTED(); return;} //Not required - - *mPC++ = A64_SBFM_W(mTmpReg1, Rm, 0, 15); - *mPC++ = A64_SBFM_W(mTmpReg2, Rs, 0, 15); - *mPC++ = A64_MADD_W(Rd, mTmpReg1, mTmpReg2, Rn); -} - -void ArmToArm64Assembler::SMLAL(int /*cc*/, int /*xy*/, - int /*RdHi*/, int /*RdLo*/, int /*Rs*/, int /*Rm*/) -{ - NOT_IMPLEMENTED(); //Not required - return; -} - -void ArmToArm64Assembler::SMLAW(int /*cc*/, int /*y*/, - int /*Rd*/, int /*Rm*/, int /*Rs*/, int /*Rn*/) -{ - NOT_IMPLEMENTED(); //Not required - return; -} - -// ---------------------------------------------------------------------------- -// Byte/half word extract and extend -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::UXTB16(int cc, int Rd, int Rm, int rotate) -{ - if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required - - *mPC++ = A64_EXTR_W(mTmpReg1, Rm, Rm, rotate * 8); - - uint32_t imm = 0x00FF00FF; - *mPC++ = A64_MOVZ_W(mTmpReg2, imm & 0xFFFF, 0); - *mPC++ = A64_MOVK_W(mTmpReg2, (imm >> 16) & 0x0000FFFF, 16); - *mPC++ = A64_AND_W(Rd,mTmpReg1, mTmpReg2); -} - -// ---------------------------------------------------------------------------- -// Bit manipulation -// ---------------------------------------------------------------------------- -void ArmToArm64Assembler::UBFX(int cc, int Rd, int Rn, int lsb, int width) -{ - if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required - *mPC++ = A64_UBFM_W(Rd, Rn, lsb, lsb + width - 1); -} -// ---------------------------------------------------------------------------- -// Shifters... -// ---------------------------------------------------------------------------- -int ArmToArm64Assembler::buildImmediate( - uint32_t immediate, uint32_t& rot, uint32_t& imm) -{ - rot = 0; - imm = immediate; - return 0; // Always true -} - - -bool ArmToArm64Assembler::isValidImmediate(uint32_t immediate) -{ - uint32_t rot, imm; - return buildImmediate(immediate, rot, imm) == 0; -} - -uint32_t ArmToArm64Assembler::imm(uint32_t immediate) -{ - mAddrMode.immediate = immediate; - mAddrMode.writeback = false; - mAddrMode.preindex = false; - mAddrMode.postindex = false; - return OPERAND_IMM; - -} - -uint32_t ArmToArm64Assembler::reg_imm(int Rm, int type, uint32_t shift) -{ - mAddrMode.reg_imm_Rm = Rm; - mAddrMode.reg_imm_type = type; - mAddrMode.reg_imm_shift = shift; - return OPERAND_REG_IMM; -} - -uint32_t ArmToArm64Assembler::reg_rrx(int /*Rm*/) -{ - NOT_IMPLEMENTED(); - return OPERAND_UNSUPPORTED; -} - -uint32_t ArmToArm64Assembler::reg_reg(int /*Rm*/, int /*type*/, int /*Rs*/) -{ - NOT_IMPLEMENTED(); //Not required - return OPERAND_UNSUPPORTED; -} -// ---------------------------------------------------------------------------- -// Addressing modes... -// ---------------------------------------------------------------------------- -uint32_t ArmToArm64Assembler::immed12_pre(int32_t immed12, int W) -{ - mAddrMode.immediate = immed12; - mAddrMode.writeback = W; - mAddrMode.preindex = true; - mAddrMode.postindex = false; - return OPERAND_IMM; -} - -uint32_t ArmToArm64Assembler::immed12_post(int32_t immed12) -{ - mAddrMode.immediate = immed12; - mAddrMode.writeback = true; - mAddrMode.preindex = false; - mAddrMode.postindex = true; - return OPERAND_IMM; -} - -uint32_t ArmToArm64Assembler::reg_scale_pre(int Rm, int type, - uint32_t shift, int W) -{ - if(type != 0 || shift != 0 || W != 0) - { - NOT_IMPLEMENTED(); //Not required - return OPERAND_UNSUPPORTED; - } - else - { - mAddrMode.reg_offset = Rm; - return OPERAND_REG_OFFSET; - } -} - -uint32_t ArmToArm64Assembler::reg_scale_post(int /*Rm*/, int /*type*/, uint32_t /*shift*/) -{ - NOT_IMPLEMENTED(); //Not required - return OPERAND_UNSUPPORTED; -} - -uint32_t ArmToArm64Assembler::immed8_pre(int32_t immed8, int W) -{ - mAddrMode.immediate = immed8; - mAddrMode.writeback = W; - mAddrMode.preindex = true; - mAddrMode.postindex = false; - return OPERAND_IMM; -} - -uint32_t ArmToArm64Assembler::immed8_post(int32_t immed8) -{ - mAddrMode.immediate = immed8; - mAddrMode.writeback = true; - mAddrMode.preindex = false; - mAddrMode.postindex = true; - return OPERAND_IMM; -} - -uint32_t ArmToArm64Assembler::reg_pre(int Rm, int W) -{ - if(W != 0) - { - NOT_IMPLEMENTED(); //Not required - return OPERAND_UNSUPPORTED; - } - else - { - mAddrMode.reg_offset = Rm; - return OPERAND_REG_OFFSET; - } -} - -uint32_t ArmToArm64Assembler::reg_post(int /*Rm*/) -{ - NOT_IMPLEMENTED(); //Not required - return OPERAND_UNSUPPORTED; -} - -// ---------------------------------------------------------------------------- -// A64 instructions -// ---------------------------------------------------------------------------- - -static __unused const char * dataTransferOpName[] = -{ - "LDR","LDRB","LDRH","STR","STRB","STRH" -}; - -static const uint32_t dataTransferOpCode [] = -{ - ((0xB8u << 24) | (0x3 << 21) | (0x6 << 13) | (0x0 << 12) |(0x1 << 11)), - ((0x38u << 24) | (0x3 << 21) | (0x6 << 13) | (0x1 << 12) |(0x1 << 11)), - ((0x78u << 24) | (0x3 << 21) | (0x6 << 13) | (0x0 << 12) |(0x1 << 11)), - ((0xB8u << 24) | (0x1 << 21) | (0x6 << 13) | (0x0 << 12) |(0x1 << 11)), - ((0x38u << 24) | (0x1 << 21) | (0x6 << 13) | (0x1 << 12) |(0x1 << 11)), - ((0x78u << 24) | (0x1 << 21) | (0x6 << 13) | (0x0 << 12) |(0x1 << 11)) -}; -uint32_t ArmToArm64Assembler::A64_LDRSTR_Wm_SXTW_0(uint32_t op, - uint32_t size, uint32_t Rt, - uint32_t Rn, uint32_t Rm) -{ - if(size == 32) - { - LOG_INSTR("%s W%d, [X%d, W%d, SXTW #0]\n", - dataTransferOpName[op], Rt, Rn, Rm); - return(dataTransferOpCode[op] | (Rm << 16) | (Rn << 5) | Rt); - } - else - { - LOG_INSTR("%s X%d, [X%d, W%d, SXTW #0]\n", - dataTransferOpName[op], Rt, Rn, Rm); - return(dataTransferOpCode[op] | (0x1<<30) | (Rm<<16) | (Rn<<5)|Rt); - } -} - -uint32_t ArmToArm64Assembler::A64_STR_IMM_PreIndex(uint32_t Rt, - uint32_t Rn, int32_t simm) -{ - if(Rn == 31) - LOG_INSTR("STR W%d, [SP, #%d]!\n", Rt, simm); - else - LOG_INSTR("STR W%d, [X%d, #%d]!\n", Rt, Rn, simm); - - uint32_t imm9 = (unsigned)(simm) & 0x01FF; - return (0xB8 << 24) | (imm9 << 12) | (0x3 << 10) | (Rn << 5) | Rt; -} - -uint32_t ArmToArm64Assembler::A64_LDR_IMM_PostIndex(uint32_t Rt, - uint32_t Rn, int32_t simm) -{ - if(Rn == 31) - LOG_INSTR("LDR W%d, [SP], #%d\n",Rt,simm); - else - LOG_INSTR("LDR W%d, [X%d], #%d\n",Rt, Rn, simm); - - uint32_t imm9 = (unsigned)(simm) & 0x01FF; - return (0xB8 << 24) | (0x1 << 22) | - (imm9 << 12) | (0x1 << 10) | (Rn << 5) | Rt; - -} -uint32_t ArmToArm64Assembler::A64_ADD_X_Wm_SXTW(uint32_t Rd, - uint32_t Rn, - uint32_t Rm, - uint32_t amount) -{ - LOG_INSTR("ADD X%d, X%d, W%d, SXTW #%d\n", Rd, Rn, Rm, amount); - return ((0x8B << 24) | (0x1 << 21) |(Rm << 16) | - (0x6 << 13) | (amount << 10) | (Rn << 5) | Rd); - -} - -uint32_t ArmToArm64Assembler::A64_SUB_X_Wm_SXTW(uint32_t Rd, - uint32_t Rn, - uint32_t Rm, - uint32_t amount) -{ - LOG_INSTR("SUB X%d, X%d, W%d, SXTW #%d\n", Rd, Rn, Rm, amount); - return ((0xCB << 24) | (0x1 << 21) |(Rm << 16) | - (0x6 << 13) | (amount << 10) | (Rn << 5) | Rd); - -} - -uint32_t ArmToArm64Assembler::A64_B_COND(uint32_t cc, uint32_t offset) -{ - LOG_INSTR("B.%s #.+%d\n", cc_codes[cc], offset); - return (0x54 << 24) | ((offset/4) << 5) | (cc); - -} -uint32_t ArmToArm64Assembler::A64_ADD_X(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift, - uint32_t amount) -{ - LOG_INSTR("ADD X%d, X%d, X%d, %s #%d\n", - Rd, Rn, Rm, shift_codes[shift], amount); - return ((0x8B << 24) | (shift << 22) | ( Rm << 16) | - (amount << 10) |(Rn << 5) | Rd); -} -uint32_t ArmToArm64Assembler::A64_ADD_IMM_X(uint32_t Rd, uint32_t Rn, - uint32_t imm, uint32_t shift) -{ - LOG_INSTR("ADD X%d, X%d, #%d, LSL #%d\n", Rd, Rn, imm, shift); - return (0x91 << 24) | ((shift/12) << 22) | (imm << 10) | (Rn << 5) | Rd; -} - -uint32_t ArmToArm64Assembler::A64_SUB_IMM_X(uint32_t Rd, uint32_t Rn, - uint32_t imm, uint32_t shift) -{ - LOG_INSTR("SUB X%d, X%d, #%d, LSL #%d\n", Rd, Rn, imm, shift); - return (0xD1 << 24) | ((shift/12) << 22) | (imm << 10) | (Rn << 5) | Rd; -} - -uint32_t ArmToArm64Assembler::A64_ADD_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift, - uint32_t amount) -{ - LOG_INSTR("ADD W%d, W%d, W%d, %s #%d\n", - Rd, Rn, Rm, shift_codes[shift], amount); - return ((0x0B << 24) | (shift << 22) | ( Rm << 16) | - (amount << 10) |(Rn << 5) | Rd); -} - -uint32_t ArmToArm64Assembler::A64_SUB_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift, - uint32_t amount, - uint32_t setflag) -{ - if(setflag == 0) - { - LOG_INSTR("SUB W%d, W%d, W%d, %s #%d\n", - Rd, Rn, Rm, shift_codes[shift], amount); - return ((0x4B << 24) | (shift << 22) | ( Rm << 16) | - (amount << 10) |(Rn << 5) | Rd); - } - else - { - LOG_INSTR("SUBS W%d, W%d, W%d, %s #%d\n", - Rd, Rn, Rm, shift_codes[shift], amount); - return ((0x6B << 24) | (shift << 22) | ( Rm << 16) | - (amount << 10) |(Rn << 5) | Rd); - } -} - -uint32_t ArmToArm64Assembler::A64_AND_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift, - uint32_t amount) -{ - LOG_INSTR("AND W%d, W%d, W%d, %s #%d\n", - Rd, Rn, Rm, shift_codes[shift], amount); - return ((0x0A << 24) | (shift << 22) | ( Rm << 16) | - (amount << 10) |(Rn << 5) | Rd); -} - -uint32_t ArmToArm64Assembler::A64_ORR_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift, - uint32_t amount) -{ - LOG_INSTR("ORR W%d, W%d, W%d, %s #%d\n", - Rd, Rn, Rm, shift_codes[shift], amount); - return ((0x2A << 24) | (shift << 22) | ( Rm << 16) | - (amount << 10) |(Rn << 5) | Rd); -} - -uint32_t ArmToArm64Assembler::A64_ORN_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift, - uint32_t amount) -{ - LOG_INSTR("ORN W%d, W%d, W%d, %s #%d\n", - Rd, Rn, Rm, shift_codes[shift], amount); - return ((0x2A << 24) | (shift << 22) | (0x1 << 21) | ( Rm << 16) | - (amount << 10) |(Rn << 5) | Rd); -} - -uint32_t ArmToArm64Assembler::A64_CSEL_X(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t cond) -{ - LOG_INSTR("CSEL X%d, X%d, X%d, %s\n", Rd, Rn, Rm, cc_codes[cond]); - return ((0x9A << 24)|(0x1 << 23)|(Rm << 16) |(cond << 12)| (Rn << 5) | Rd); -} - -uint32_t ArmToArm64Assembler::A64_CSEL_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t cond) -{ - LOG_INSTR("CSEL W%d, W%d, W%d, %s\n", Rd, Rn, Rm, cc_codes[cond]); - return ((0x1A << 24)|(0x1 << 23)|(Rm << 16) |(cond << 12)| (Rn << 5) | Rd); -} - -uint32_t ArmToArm64Assembler::A64_RET(uint32_t Rn) -{ - LOG_INSTR("RET X%d\n", Rn); - return ((0xD6 << 24) | (0x1 << 22) | (0x1F << 16) | (Rn << 5)); -} - -uint32_t ArmToArm64Assembler::A64_MOVZ_X(uint32_t Rd, uint32_t imm, - uint32_t shift) -{ - LOG_INSTR("MOVZ X%d, #0x%x, LSL #%d\n", Rd, imm, shift); - return(0xD2 << 24) | (0x1 << 23) | ((shift/16) << 21) | (imm << 5) | Rd; -} - -uint32_t ArmToArm64Assembler::A64_MOVK_W(uint32_t Rd, uint32_t imm, - uint32_t shift) -{ - LOG_INSTR("MOVK W%d, #0x%x, LSL #%d\n", Rd, imm, shift); - return (0x72 << 24) | (0x1 << 23) | ((shift/16) << 21) | (imm << 5) | Rd; -} - -uint32_t ArmToArm64Assembler::A64_MOVZ_W(uint32_t Rd, uint32_t imm, - uint32_t shift) -{ - LOG_INSTR("MOVZ W%d, #0x%x, LSL #%d\n", Rd, imm, shift); - return(0x52 << 24) | (0x1 << 23) | ((shift/16) << 21) | (imm << 5) | Rd; -} - -uint32_t ArmToArm64Assembler::A64_SMADDL(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t Ra) -{ - LOG_INSTR("SMADDL X%d, W%d, W%d, X%d\n",Rd, Rn, Rm, Ra); - return ((0x9B << 24) | (0x1 << 21) | (Rm << 16)|(Ra << 10)|(Rn << 5) | Rd); -} - -uint32_t ArmToArm64Assembler::A64_MADD_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t Ra) -{ - LOG_INSTR("MADD W%d, W%d, W%d, W%d\n",Rd, Rn, Rm, Ra); - return ((0x1B << 24) | (Rm << 16) | (Ra << 10) |(Rn << 5) | Rd); -} - -uint32_t ArmToArm64Assembler::A64_SBFM_W(uint32_t Rd, uint32_t Rn, - uint32_t immr, uint32_t imms) -{ - LOG_INSTR("SBFM W%d, W%d, #%d, #%d\n", Rd, Rn, immr, imms); - return ((0x13 << 24) | (immr << 16) | (imms << 10) | (Rn << 5) | Rd); - -} -uint32_t ArmToArm64Assembler::A64_UBFM_W(uint32_t Rd, uint32_t Rn, - uint32_t immr, uint32_t imms) -{ - LOG_INSTR("UBFM W%d, W%d, #%d, #%d\n", Rd, Rn, immr, imms); - return ((0x53 << 24) | (immr << 16) | (imms << 10) | (Rn << 5) | Rd); - -} -uint32_t ArmToArm64Assembler::A64_UBFM_X(uint32_t Rd, uint32_t Rn, - uint32_t immr, uint32_t imms) -{ - LOG_INSTR("UBFM X%d, X%d, #%d, #%d\n", Rd, Rn, immr, imms); - return ((0xD3 << 24) | (0x1 << 22) | - (immr << 16) | (imms << 10) | (Rn << 5) | Rd); - -} -uint32_t ArmToArm64Assembler::A64_EXTR_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t lsb) -{ - LOG_INSTR("EXTR W%d, W%d, W%d, #%d\n", Rd, Rn, Rm, lsb); - return (0x13 << 24)|(0x1 << 23) | (Rm << 16) | (lsb << 10)|(Rn << 5) | Rd; -} - -}; // namespace android diff --git a/libpixelflinger/codeflinger/Arm64Assembler.h b/libpixelflinger/codeflinger/Arm64Assembler.h deleted file mode 100644 index 527c757aa..000000000 --- a/libpixelflinger/codeflinger/Arm64Assembler.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef ANDROID_ARMTOARM64ASSEMBLER_H -#define ANDROID_ARMTOARM64ASSEMBLER_H - -#include -#include - -#include "tinyutils/smartpointer.h" -#include "utils/Vector.h" -#include "utils/KeyedVector.h" - -#include "tinyutils/smartpointer.h" -#include "codeflinger/ARMAssemblerInterface.h" -#include "codeflinger/CodeCache.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -class ArmToArm64Assembler : public ARMAssemblerInterface -{ -public: - explicit ArmToArm64Assembler(const sp& assembly); - explicit ArmToArm64Assembler(void *base); - virtual ~ArmToArm64Assembler(); - - uint32_t* base() const; - uint32_t* pc() const; - - - void disassemble(const char* name); - - // ------------------------------------------------------------------------ - // ARMAssemblerInterface... - // ------------------------------------------------------------------------ - - virtual void reset(); - - virtual int generate(const char* name); - virtual int getCodegenArch(); - - virtual void prolog(); - virtual void epilog(uint32_t touched); - virtual void comment(const char* string); - - - // ----------------------------------------------------------------------- - // shifters and addressing modes - // ----------------------------------------------------------------------- - - // shifters... - virtual bool isValidImmediate(uint32_t immed); - virtual int buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm); - - virtual uint32_t imm(uint32_t immediate); - virtual uint32_t reg_imm(int Rm, int type, uint32_t shift); - virtual uint32_t reg_rrx(int Rm); - virtual uint32_t reg_reg(int Rm, int type, int Rs); - - // addressing modes... - virtual uint32_t immed12_pre(int32_t immed12, int W=0); - virtual uint32_t immed12_post(int32_t immed12); - virtual uint32_t reg_scale_pre(int Rm, int type=0, uint32_t shift=0, int W=0); - virtual uint32_t reg_scale_post(int Rm, int type=0, uint32_t shift=0); - virtual uint32_t immed8_pre(int32_t immed8, int W=0); - virtual uint32_t immed8_post(int32_t immed8); - virtual uint32_t reg_pre(int Rm, int W=0); - virtual uint32_t reg_post(int Rm); - - - virtual void dataProcessing(int opcode, int cc, int s, - int Rd, int Rn, - uint32_t Op2); - virtual void MLA(int cc, int s, - int Rd, int Rm, int Rs, int Rn); - virtual void MUL(int cc, int s, - int Rd, int Rm, int Rs); - virtual void UMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void UMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - - virtual void B(int cc, uint32_t* pc); - virtual void BL(int cc, uint32_t* pc); - virtual void BX(int cc, int Rn); - virtual void label(const char* theLabel); - virtual void B(int cc, const char* label); - virtual void BL(int cc, const char* label); - - virtual uint32_t* pcForLabel(const char* label); - - virtual void ADDR_LDR(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void ADDR_ADD(int cc, int s, int Rd, - int Rn, uint32_t Op2); - virtual void ADDR_SUB(int cc, int s, int Rd, - int Rn, uint32_t Op2); - virtual void ADDR_STR (int cc, int Rd, - int Rn, uint32_t offset = 0); - - virtual void LDR (int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRB(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void STR (int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void STRB(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRH (int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRSB(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRSH(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void STRH (int cc, int Rd, - int Rn, uint32_t offset = 0); - - - virtual void LDM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - virtual void STM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - - virtual void SWP(int cc, int Rn, int Rd, int Rm); - virtual void SWPB(int cc, int Rn, int Rd, int Rm); - virtual void SWI(int cc, uint32_t comment); - - virtual void PLD(int Rn, uint32_t offset); - virtual void CLZ(int cc, int Rd, int Rm); - virtual void QADD(int cc, int Rd, int Rm, int Rn); - virtual void QDADD(int cc, int Rd, int Rm, int Rn); - virtual void QSUB(int cc, int Rd, int Rm, int Rn); - virtual void QDSUB(int cc, int Rd, int Rm, int Rn); - virtual void SMUL(int cc, int xy, - int Rd, int Rm, int Rs); - virtual void SMULW(int cc, int y, - int Rd, int Rm, int Rs); - virtual void SMLA(int cc, int xy, - int Rd, int Rm, int Rs, int Rn); - virtual void SMLAL(int cc, int xy, - int RdHi, int RdLo, int Rs, int Rm); - virtual void SMLAW(int cc, int y, - int Rd, int Rm, int Rs, int Rn); - virtual void UXTB16(int cc, int Rd, int Rm, int rotate); - virtual void UBFX(int cc, int Rd, int Rn, int lsb, int width); - -private: - ArmToArm64Assembler(const ArmToArm64Assembler& rhs); - ArmToArm64Assembler& operator = (const ArmToArm64Assembler& rhs); - - // ----------------------------------------------------------------------- - // helper functions - // ----------------------------------------------------------------------- - - void dataTransfer(int operation, int cc, int Rd, int Rn, - uint32_t operand_type, uint32_t size = 32); - void dataProcessingCommon(int opcode, int s, - int Rd, int Rn, uint32_t Op2); - - // ----------------------------------------------------------------------- - // Arm64 instructions - // ----------------------------------------------------------------------- - uint32_t A64_B_COND(uint32_t cc, uint32_t offset); - uint32_t A64_RET(uint32_t Rn); - - uint32_t A64_LDRSTR_Wm_SXTW_0(uint32_t operation, - uint32_t size, uint32_t Rt, - uint32_t Rn, uint32_t Rm); - - uint32_t A64_STR_IMM_PreIndex(uint32_t Rt, uint32_t Rn, int32_t simm); - uint32_t A64_LDR_IMM_PostIndex(uint32_t Rt,uint32_t Rn, int32_t simm); - - uint32_t A64_ADD_X_Wm_SXTW(uint32_t Rd, uint32_t Rn, uint32_t Rm, - uint32_t amount); - uint32_t A64_SUB_X_Wm_SXTW(uint32_t Rd, uint32_t Rn, uint32_t Rm, - uint32_t amount); - - uint32_t A64_ADD_IMM_X(uint32_t Rd, uint32_t Rn, - uint32_t imm, uint32_t shift = 0); - uint32_t A64_SUB_IMM_X(uint32_t Rd, uint32_t Rn, - uint32_t imm, uint32_t shift = 0); - - uint32_t A64_ADD_X(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift = 0, uint32_t amount = 0); - uint32_t A64_ADD_W(uint32_t Rd, uint32_t Rn, uint32_t Rm, - uint32_t shift = 0, uint32_t amount = 0); - uint32_t A64_SUB_W(uint32_t Rd, uint32_t Rn, uint32_t Rm, - uint32_t shift = 0, uint32_t amount = 0, - uint32_t setflag = 0); - uint32_t A64_AND_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift = 0, uint32_t amount = 0); - uint32_t A64_ORR_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift = 0, uint32_t amount = 0); - uint32_t A64_ORN_W(uint32_t Rd, uint32_t Rn, - uint32_t Rm, uint32_t shift = 0, uint32_t amount = 0); - - uint32_t A64_MOVZ_W(uint32_t Rd, uint32_t imm, uint32_t shift); - uint32_t A64_MOVZ_X(uint32_t Rd, uint32_t imm, uint32_t shift); - uint32_t A64_MOVK_W(uint32_t Rd, uint32_t imm, uint32_t shift); - - uint32_t A64_SMADDL(uint32_t Rd, uint32_t Rn, uint32_t Rm, uint32_t Ra); - uint32_t A64_MADD_W(uint32_t Rd, uint32_t Rn, uint32_t Rm, uint32_t Ra); - - uint32_t A64_SBFM_W(uint32_t Rd, uint32_t Rn, - uint32_t immr, uint32_t imms); - uint32_t A64_UBFM_W(uint32_t Rd, uint32_t Rn, - uint32_t immr, uint32_t imms); - uint32_t A64_UBFM_X(uint32_t Rd, uint32_t Rn, - uint32_t immr, uint32_t imms); - - uint32_t A64_EXTR_W(uint32_t Rd, uint32_t Rn, uint32_t Rm, uint32_t lsb); - uint32_t A64_CSEL_X(uint32_t Rd, uint32_t Rn, uint32_t Rm, uint32_t cond); - uint32_t A64_CSEL_W(uint32_t Rd, uint32_t Rn, uint32_t Rm, uint32_t cond); - - uint32_t* mBase; - uint32_t* mPC; - uint32_t* mPrologPC; - int64_t mDuration; - uint32_t mTmpReg1, mTmpReg2, mTmpReg3, mZeroReg; - - struct branch_target_t { - inline branch_target_t() : label(0), pc(0) { } - inline branch_target_t(const char* l, uint32_t* p) - : label(l), pc(p) { } - const char* label; - uint32_t* pc; - }; - - sp mAssembly; - Vector mBranchTargets; - KeyedVector< const char*, uint32_t* > mLabels; - KeyedVector< uint32_t*, const char* > mLabelsInverseMapping; - KeyedVector< uint32_t*, const char* > mComments; - - enum operand_type_t - { - OPERAND_REG = 0x20, - OPERAND_IMM, - OPERAND_REG_IMM, - OPERAND_REG_OFFSET, - OPERAND_UNSUPPORTED - }; - - struct addr_mode_t { - int32_t immediate; - bool writeback; - bool preindex; - bool postindex; - int32_t reg_imm_Rm; - int32_t reg_imm_type; - uint32_t reg_imm_shift; - int32_t reg_offset; - } mAddrMode; - -}; - -}; // namespace android - -#endif //ANDROID_ARM64ASSEMBLER_H diff --git a/libpixelflinger/codeflinger/Arm64Disassembler.cpp b/libpixelflinger/codeflinger/Arm64Disassembler.cpp deleted file mode 100644 index 70f1ff11f..000000000 --- a/libpixelflinger/codeflinger/Arm64Disassembler.cpp +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include - -struct disasm_table_entry_t -{ - uint32_t mask; - uint32_t value; - const char* instr_template; -}; - - -static disasm_table_entry_t disasm_table[] = -{ - {0xff000000, 0x91000000, "add , , #, "}, - {0xff000000, 0xd1000000, "sub , , #, "}, - {0xff200000, 0x8b000000, "add , , , #"}, - {0xff200000, 0x0b000000, "add , , , #"}, - {0xff200000, 0x4b000000, "sub , , , #"}, - {0xff200000, 0x6b000000, "subs , , , #"}, - {0xff200000, 0x0a000000, "and , , , #"}, - {0xff200000, 0x2a000000, "orr , , , #"}, - {0xff200000, 0x2a200000, "orn , , , #"}, - {0xff800000, 0x72800000, "movk , #, lsl #"}, - {0xff800000, 0x52800000, "movz , #, lsl #"}, - {0xff800000, 0xd2800000, "movz , #, lsl #"}, - {0xffe00c00, 0x1a800000, "csel , , , "}, - {0xffe00c00, 0x9a800000, "csel , , , "}, - {0xffe00c00, 0x5a800000, "csinv , , , "}, - {0xffe08000, 0x1b000000, "madd , , , "}, - {0xffe08000, 0x9b200000, "smaddl , , , "}, - {0xffe04c00, 0xb8604800, "ldr , [, , #]"}, - {0xffe04c00, 0xb8204800, "str , [, , #]"}, - {0xffe04c00, 0xf8604800, "ldr , [, , #]"}, - {0xffe04c00, 0xf8204800, "str , [, , #]"}, - {0xffe04c00, 0x38604800, "ldrb , [, , ]"}, - {0xffe04c00, 0x38204800, "strb , [, , ]"}, - {0xffe04c00, 0x78604800, "ldrh , [, , #]"}, - {0xffe04c00, 0x78204800, "strh , [, , #]"}, - {0xffe00c00, 0xb8400400, "ldr , [], #"}, - {0xffe00c00, 0xb8000c00, "str , [, #]!"}, - {0xffc00000, 0x13000000, "sbfm , , #, #"}, - {0xffc00000, 0x53000000, "ubfm , , #, #"}, - {0xffc00000, 0xd3400000, "ubfm , , #, #"}, - {0xffe00000, 0x13800000, "extr , , , #"}, - {0xff000000, 0x54000000, "b. "}, - {0xfffffc1f, 0xd65f0000, "ret "}, - {0xffe00000, 0x8b200000, "add , , , #"}, - {0xffe00000, 0xcb200000, "sub , , , #"} -}; - -static int32_t bits_signed(uint32_t instr, uint32_t msb, uint32_t lsb) -{ - int32_t value; - value = ((int32_t)instr) << (31 - msb); - value >>= (31 - msb); - value >>= lsb; - return value; -} -static uint32_t bits_unsigned(uint32_t instr, uint32_t msb, uint32_t lsb) -{ - uint32_t width = msb - lsb + 1; - uint32_t mask = (1 << width) - 1; - return ((instr >> lsb) & mask); -} - -static void get_token(const char *instr, uint32_t index, char *token) -{ - uint32_t i, j; - for(i = index, j = 0; i < strlen(instr); ++i) - { - if(instr[index] == '<' && instr[i] == '>') - { - token[j++] = instr[i]; - break; - } - else if(instr[index] != '<' && instr[i] == '<') - { - break; - } - else - { - token[j++] = instr[i]; - } - } - token[j] = '\0'; - return; -} - - -static const char * token_cc_table[] = -{ - "eq", "ne", "cs", "cc", "mi", - "pl", "vs", "vc", "hi", "ls", - "ge", "lt", "gt", "le", "al", "nv" -}; - -static void decode_rx_zr_token(uint32_t reg, const char *prefix, char *instr_part) -{ - if(reg == 31) - sprintf(instr_part, "%s%s", prefix, "zr"); - else - sprintf(instr_part, "%s%d", prefix, reg); -} - -static void decode_token(uint32_t code, char *token, char *instr_part) -{ - if(strcmp(token, "") == 0) - sprintf(instr_part, "0x%x", bits_unsigned(code, 21,10)); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "0x%x", bits_unsigned(code, 20,5)); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "lsl #%d", bits_unsigned(code, 23,22) * 12); - else if(strcmp(token, "") == 0) - { - static const char * shift2_table[] = { "lsl", "lsr", "asr", "ror"}; - sprintf(instr_part, "%s", shift2_table[bits_unsigned(code, 23,22)]); - } - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_unsigned(code, 22,21) * 16); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_unsigned(code, 15,10)); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_unsigned(code, 12,12) * 2); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_unsigned(code, 12,12) * 3); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_unsigned(code, 12,10)); - else if(strcmp(token, "") == 0) - { - static const char * amt5_table[] = {"", "#0"}; - sprintf(instr_part, "%s", amt5_table[bits_unsigned(code, 12,12)]); - } - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_unsigned(code, 12,12)); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_signed(code, 20,12)); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_unsigned(code, 21,16)); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_unsigned(code, 15,10)); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%d", bits_unsigned(code, 15,10)); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%s", token_cc_table[bits_unsigned(code, 15,12)]); - else if(strcmp(token, "") == 0) - sprintf(instr_part, "%s", token_cc_table[bits_unsigned(code, 4,0)]); - else if(strcmp(token, "") == 0) - { - const char * token_r1_table[] = - { - "reserved", "reserved", "w", "x", - "reserved", "reserved", "w", "x" - }; - sprintf(instr_part, "%s", token_r1_table[bits_unsigned(code, 15,13)]); - } - else if(strcmp(token, "") == 0) - { - static const char * token_r2_table[] = - { - "w","w","w", "x", "w", "w", "w", "x" - }; - sprintf(instr_part, "%s", token_r2_table[bits_unsigned(code, 15,13)]); - } - else if(strcmp(token, "") == 0) - { - uint32_t reg = bits_unsigned(code, 20,16); - if(reg == 31) - sprintf(instr_part, "%s", "zr"); - else - sprintf(instr_part, "%d", reg); - } - else if(strcmp(token, "") == 0) - { - static const char * token_ext1_table[] = - { - "reserved","reserved","uxtw", "lsl", - "reserved","reserved", "sxtw", "sxtx" - }; - sprintf(instr_part, "%s", token_ext1_table[bits_unsigned(code, 15,13)]); - } - else if(strcmp(token, "") == 0) - { - static const char * token_ext2_table[] = - { - "uxtb","uxth","uxtw","uxtx", - "sxtb","sxth","sxtw","sxtx" - }; - sprintf(instr_part, "%s", token_ext2_table[bits_unsigned(code, 15,13)]); - } - else if (strcmp(token, "") == 0) - { - int32_t offset = bits_signed(code, 23,5) * 4; - if(offset > 0) - sprintf(instr_part, "#.+%d", offset); - else - sprintf(instr_part, "#.-%d", -offset); - } - else if (strcmp(token, "") == 0) - { - uint32_t reg = bits_unsigned(code, 9, 5); - if(reg == 31) - sprintf(instr_part, "%s", "sp"); - else - sprintf(instr_part, "x%d", reg); - } - else if (strcmp(token, "") == 0) - { - uint32_t reg = bits_unsigned(code, 4, 0); - if(reg == 31) - sprintf(instr_part, "%s", "sp"); - else - sprintf(instr_part, "x%d", reg); - } - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 9, 5), "x", instr_part); - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 4, 0), "x", instr_part); - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 20, 16), "x", instr_part); - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 14, 10), "x", instr_part); - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 4, 0), "x", instr_part); - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 9, 5), "w", instr_part); - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 4, 0), "w", instr_part); - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 20, 16), "w", instr_part); - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 14, 10), "w", instr_part); - else if (strcmp(token, "") == 0) - decode_rx_zr_token(bits_unsigned(code, 4, 0), "w", instr_part); - else - { - sprintf(instr_part, "error"); - } - return; -} - -int arm64_disassemble(uint32_t code, char* instr) -{ - uint32_t i; - char token[256]; - char instr_part[256]; - - if(instr == NULL) - return -1; - - bool matched = false; - disasm_table_entry_t *entry = NULL; - for(i = 0; i < sizeof(disasm_table)/sizeof(disasm_table_entry_t); ++i) - { - entry = &disasm_table[i]; - if((code & entry->mask) == entry->value) - { - matched = true; - break; - } - } - if(matched == false) - { - strcpy(instr, "Unknown Instruction"); - return -1; - } - else - { - uint32_t index = 0; - uint32_t length = strlen(entry->instr_template); - instr[0] = '\0'; - do - { - get_token(entry->instr_template, index, token); - if(token[0] == '<') - { - decode_token(code, token, instr_part); - strcat(instr, instr_part); - } - else - { - strcat(instr, token); - } - index += strlen(token); - }while(index < length); - return 0; - } -} diff --git a/libpixelflinger/codeflinger/Arm64Disassembler.h b/libpixelflinger/codeflinger/Arm64Disassembler.h deleted file mode 100644 index 86f3aba8d..000000000 --- a/libpixelflinger/codeflinger/Arm64Disassembler.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef ANDROID_ARM64DISASSEMBLER_H -#define ANDROID_ARM64DISASSEMBLER_H - -#include -int arm64_disassemble(uint32_t code, char* instr); - -#endif //ANDROID_ARM64ASSEMBLER_H diff --git a/libpixelflinger/codeflinger/CodeCache.cpp b/libpixelflinger/codeflinger/CodeCache.cpp deleted file mode 100644 index 32691a389..000000000 --- a/libpixelflinger/codeflinger/CodeCache.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* libs/pixelflinger/codeflinger/CodeCache.cpp -** -** Copyright 2006, 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 "CodeCache" - -#include -#include -#include -#include -#include - -#include -#include - -#include "CodeCache.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -#if defined(__arm__) || defined(__aarch64__) -#include -#include -#endif - -#if defined(__mips__) -#include -#include -#endif - -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- - -// A dlmalloc mspace is used to manage the code cache over a mmaped region. -#define HAVE_MMAP 0 -#define HAVE_MREMAP 0 -#define HAVE_MORECORE 0 -#define MALLOC_ALIGNMENT 16 -#define MSPACES 1 -#define NO_MALLINFO 1 -#define ONLY_MSPACES 1 -// Custom heap error handling. -#define PROCEED_ON_ERROR 0 -static void heap_error(const char* msg, const char* function, void* p); -#define CORRUPTION_ERROR_ACTION(m) \ - heap_error("HEAP MEMORY CORRUPTION", __FUNCTION__, NULL) -#define USAGE_ERROR_ACTION(m,p) \ - heap_error("ARGUMENT IS INVALID HEAP ADDRESS", __FUNCTION__, p) - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wexpansion-to-defined" -#pragma GCC diagnostic ignored "-Wnull-pointer-arithmetic" -#include "../../../../external/dlmalloc/malloc.c" -#pragma GCC diagnostic pop - -static void heap_error(const char* msg, const char* function, void* p) { - ALOG(LOG_FATAL, LOG_TAG, "@@@ ABORTING: CODE FLINGER: %s IN %s addr=%p", - msg, function, p); - /* So that we can get a memory dump around p */ - *((int **) 0xdeadbaad) = (int *) p; -} - -// ---------------------------------------------------------------------------- - -static void* gExecutableStore = NULL; -static mspace gMspace = NULL; -const size_t kMaxCodeCacheCapacity = 1024 * 1024; - -static mspace getMspace() -{ - if (gExecutableStore == NULL) { - int fd = ashmem_create_region("CodeFlinger code cache", - kMaxCodeCacheCapacity); - LOG_ALWAYS_FATAL_IF(fd < 0, - "Creating code cache, ashmem_create_region " - "failed with error '%s'", strerror(errno)); - gExecutableStore = mmap(NULL, kMaxCodeCacheCapacity, - PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_PRIVATE, fd, 0); - LOG_ALWAYS_FATAL_IF(gExecutableStore == MAP_FAILED, - "Creating code cache, mmap failed with error " - "'%s'", strerror(errno)); - close(fd); - gMspace = create_mspace_with_base(gExecutableStore, kMaxCodeCacheCapacity, - /*locked=*/ false); - mspace_set_footprint_limit(gMspace, kMaxCodeCacheCapacity); - } - return gMspace; -} - -Assembly::Assembly(size_t size) - : mCount(0), mSize(0) -{ - mBase = (uint32_t*)mspace_malloc(getMspace(), size); - LOG_ALWAYS_FATAL_IF(mBase == NULL, - "Failed to create Assembly of size %zd in executable " - "store of size %zd", size, kMaxCodeCacheCapacity); - mSize = size; -} - -Assembly::~Assembly() -{ - mspace_free(getMspace(), mBase); -} - -void Assembly::incStrong(const void*) const -{ - mCount.fetch_add(1, std::memory_order_relaxed); -} - -void Assembly::decStrong(const void*) const -{ - if (mCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { - delete this; - } -} - -ssize_t Assembly::size() const -{ - if (!mBase) return NO_MEMORY; - return mSize; -} - -uint32_t* Assembly::base() const -{ - return mBase; -} - -ssize_t Assembly::resize(size_t newSize) -{ - mBase = (uint32_t*)mspace_realloc(getMspace(), mBase, newSize); - LOG_ALWAYS_FATAL_IF(mBase == NULL, - "Failed to resize Assembly to %zd in code cache " - "of size %zd", newSize, kMaxCodeCacheCapacity); - mSize = newSize; - return size(); -} - -// ---------------------------------------------------------------------------- - -CodeCache::CodeCache(size_t size) - : mCacheSize(size), mCacheInUse(0) -{ - pthread_mutex_init(&mLock, 0); -} - -CodeCache::~CodeCache() -{ - pthread_mutex_destroy(&mLock); -} - -sp CodeCache::lookup(const AssemblyKeyBase& keyBase) const -{ - pthread_mutex_lock(&mLock); - sp r; - ssize_t index = mCacheData.indexOfKey(key_t(keyBase)); - if (index >= 0) { - const cache_entry_t& e = mCacheData.valueAt(index); - e.when = mWhen++; - r = e.entry; - } - pthread_mutex_unlock(&mLock); - return r; -} - -int CodeCache::cache( const AssemblyKeyBase& keyBase, - const sp& assembly) -{ - pthread_mutex_lock(&mLock); - - const ssize_t assemblySize = assembly->size(); - while (mCacheInUse + assemblySize > mCacheSize) { - // evict the LRU - size_t lru = 0; - size_t count = mCacheData.size(); - for (size_t i=0 ; isize(); - mCacheData.removeItemsAt(lru); - } - - ssize_t err = mCacheData.add(key_t(keyBase), cache_entry_t(assembly, mWhen)); - if (err >= 0) { - mCacheInUse += assemblySize; - mWhen++; - // synchronize caches... - char* base = reinterpret_cast(assembly->base()); - char* curr = reinterpret_cast(base + assembly->size()); - __builtin___clear_cache(base, curr); - } - - pthread_mutex_unlock(&mLock); - return err; -} - -// ---------------------------------------------------------------------------- - -}; // namespace android diff --git a/libpixelflinger/codeflinger/CodeCache.h b/libpixelflinger/codeflinger/CodeCache.h deleted file mode 100644 index 93264530f..000000000 --- a/libpixelflinger/codeflinger/CodeCache.h +++ /dev/null @@ -1,136 +0,0 @@ -/* libs/pixelflinger/codeflinger/CodeCache.h -** -** Copyright 2006, 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_CODECACHE_H -#define ANDROID_CODECACHE_H - -#include -#include -#include -#include - -#include "utils/KeyedVector.h" -#include "tinyutils/smartpointer.h" - -namespace android { - -using namespace tinyutils; - -// ---------------------------------------------------------------------------- - -class AssemblyKeyBase { -public: - virtual ~AssemblyKeyBase() { } - virtual int compare_type(const AssemblyKeyBase& key) const = 0; -}; - -template -class AssemblyKey : public AssemblyKeyBase -{ -public: - explicit AssemblyKey(const T& rhs) : mKey(rhs) { } - virtual int compare_type(const AssemblyKeyBase& key) const { - const T& rhs = static_cast(key).mKey; - return android::compare_type(mKey, rhs); - } -private: - T mKey; -}; - -// ---------------------------------------------------------------------------- - -class Assembly -{ -public: - explicit Assembly(size_t size); - virtual ~Assembly(); - - ssize_t size() const; - uint32_t* base() const; - ssize_t resize(size_t size); - - // protocol for sp<> - void incStrong(const void* id) const; - void decStrong(const void* id) const; - typedef void weakref_type; - -private: - mutable std::atomic mCount; - uint32_t* mBase; - size_t mSize; -}; - -// ---------------------------------------------------------------------------- - -class CodeCache -{ -public: -// pretty simple cache API... - explicit CodeCache(size_t size); - ~CodeCache(); - - sp lookup(const AssemblyKeyBase& key) const; - - int cache(const AssemblyKeyBase& key, - const sp& assembly); - -private: - // nothing to see here... - struct cache_entry_t { - inline cache_entry_t() { } - inline cache_entry_t(const sp& a, int64_t w) - : entry(a), when(w) { } - sp entry; - mutable int64_t when; - }; - - class key_t { - friend int compare_type( - const key_value_pair_t&, - const key_value_pair_t&); - const AssemblyKeyBase* mKey; - public: - key_t() { }; - explicit key_t(const AssemblyKeyBase& k) : mKey(&k) { } - }; - - mutable pthread_mutex_t mLock; - mutable int64_t mWhen; - size_t mCacheSize; - size_t mCacheInUse; - KeyedVector mCacheData; - - friend int compare_type( - const key_value_pair_t&, - const key_value_pair_t&); -}; - -// KeyedVector uses compare_type(), which is more efficient, than -// just using operator < () -inline int compare_type( - const key_value_pair_t& lhs, - const key_value_pair_t& rhs) -{ - return lhs.key.mKey->compare_type(*(rhs.key.mKey)); -} - -// ---------------------------------------------------------------------------- - -}; // namespace android - -#endif //ANDROID_CODECACHE_H diff --git a/libpixelflinger/codeflinger/GGLAssembler.cpp b/libpixelflinger/codeflinger/GGLAssembler.cpp deleted file mode 100644 index 04e285d1b..000000000 --- a/libpixelflinger/codeflinger/GGLAssembler.cpp +++ /dev/null @@ -1,1195 +0,0 @@ -/* libs/pixelflinger/codeflinger/GGLAssembler.cpp -** -** Copyright 2006, 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 "GGLAssembler" - -#include -#include -#include -#include -#include - -#include - -#include "GGLAssembler.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -GGLAssembler::GGLAssembler(ARMAssemblerInterface* target) - : ARMAssemblerProxy(target), - RegisterAllocator(ARMAssemblerProxy::getCodegenArch()), mOptLevel(7) -{ -} - -GGLAssembler::~GGLAssembler() -{ -} - -void GGLAssembler::prolog() -{ - ARMAssemblerProxy::prolog(); -} - -void GGLAssembler::epilog(uint32_t touched) -{ - ARMAssemblerProxy::epilog(touched); -} - -void GGLAssembler::reset(int opt_level) -{ - ARMAssemblerProxy::reset(); - RegisterAllocator::reset(); - mOptLevel = opt_level; -} - -// --------------------------------------------------------------------------- - -int GGLAssembler::scanline(const needs_t& needs, context_t const* c) -{ - int err = 0; - int opt_level = mOptLevel; - while (opt_level >= 0) { - reset(opt_level); - err = scanline_core(needs, c); - if (err == 0) - break; - opt_level--; - } - - // XXX: in theory, pcForLabel is not valid before generate() - uint32_t* fragment_start_pc = pcForLabel("fragment_loop"); - uint32_t* fragment_end_pc = pcForLabel("epilog"); - const int per_fragment_ops = int(fragment_end_pc - fragment_start_pc); - - // build a name for our pipeline - char name[64]; - sprintf(name, - "scanline__%08X:%08X_%08X_%08X [%3d ipp]", - needs.p, needs.n, needs.t[0], needs.t[1], per_fragment_ops); - - if (err) { - ALOGE("Error while generating ""%s""\n", name); - disassemble(name); - return -1; - } - - return generate(name); -} - -int GGLAssembler::scanline_core(const needs_t& needs, context_t const* c) -{ - mBlendFactorCached = 0; - mBlending = 0; - mMasking = 0; - mAA = GGL_READ_NEEDS(P_AA, needs.p); - mDithering = GGL_READ_NEEDS(P_DITHER, needs.p); - mAlphaTest = GGL_READ_NEEDS(P_ALPHA_TEST, needs.p) + GGL_NEVER; - mDepthTest = GGL_READ_NEEDS(P_DEPTH_TEST, needs.p) + GGL_NEVER; - mFog = GGL_READ_NEEDS(P_FOG, needs.p) != 0; - mSmooth = GGL_READ_NEEDS(SHADE, needs.n) != 0; - mBuilderContext.needs = needs; - mBuilderContext.c = c; - mBuilderContext.Rctx = reserveReg(R0); // context always in R0 - mCbFormat = c->formats[ GGL_READ_NEEDS(CB_FORMAT, needs.n) ]; - - // ------------------------------------------------------------------------ - - decodeLogicOpNeeds(needs); - - decodeTMUNeeds(needs, c); - - mBlendSrc = ggl_needs_to_blendfactor(GGL_READ_NEEDS(BLEND_SRC, needs.n)); - mBlendDst = ggl_needs_to_blendfactor(GGL_READ_NEEDS(BLEND_DST, needs.n)); - mBlendSrcA = ggl_needs_to_blendfactor(GGL_READ_NEEDS(BLEND_SRCA, needs.n)); - mBlendDstA = ggl_needs_to_blendfactor(GGL_READ_NEEDS(BLEND_DSTA, needs.n)); - - if (!mCbFormat.c[GGLFormat::ALPHA].h) { - if ((mBlendSrc == GGL_ONE_MINUS_DST_ALPHA) || - (mBlendSrc == GGL_DST_ALPHA)) { - mBlendSrc = GGL_ONE; - } - if ((mBlendSrcA == GGL_ONE_MINUS_DST_ALPHA) || - (mBlendSrcA == GGL_DST_ALPHA)) { - mBlendSrcA = GGL_ONE; - } - if ((mBlendDst == GGL_ONE_MINUS_DST_ALPHA) || - (mBlendDst == GGL_DST_ALPHA)) { - mBlendDst = GGL_ONE; - } - if ((mBlendDstA == GGL_ONE_MINUS_DST_ALPHA) || - (mBlendDstA == GGL_DST_ALPHA)) { - mBlendDstA = GGL_ONE; - } - } - - // if we need the framebuffer, read it now - const int blending = blending_codes(mBlendSrc, mBlendDst) | - blending_codes(mBlendSrcA, mBlendDstA); - - // XXX: handle special cases, destination not modified... - if ((mBlendSrc==GGL_ZERO) && (mBlendSrcA==GGL_ZERO) && - (mBlendDst==GGL_ONE) && (mBlendDstA==GGL_ONE)) { - // Destination unmodified (beware of logic ops) - } else if ((mBlendSrc==GGL_ZERO) && (mBlendSrcA==GGL_ZERO) && - (mBlendDst==GGL_ZERO) && (mBlendDstA==GGL_ZERO)) { - // Destination is zero (beware of logic ops) - } - - int fbComponents = 0; - const int masking = GGL_READ_NEEDS(MASK_ARGB, needs.n); - for (int i=0 ; i<4 ; i++) { - const int mask = 1<= GGL_LUMINANCE && - (i==GGLFormat::GREEN || i==GGLFormat::BLUE)) { - info.inDest = false; - } - info.needed = (i==GGLFormat::ALPHA) && - (isAlphaSourceNeeded() || mAlphaTest != GGL_ALWAYS); - info.replaced = !!(mTextureMachine.replaced & mask); - info.iterated = (!info.replaced && (info.inDest || info.needed)); - info.smooth = mSmooth && info.iterated; - info.fog = mFog && info.inDest && (i != GGLFormat::ALPHA); - info.blend = (fs != int(GGL_ONE)) || (fd > int(GGL_ZERO)); - - mBlending |= (info.blend ? mask : 0); - mMasking |= (mCbFormat.c[i].h && info.masked) ? mask : 0; - fbComponents |= mCbFormat.c[i].h ? mask : 0; - } - - mAllMasked = (mMasking == fbComponents); - if (mAllMasked) { - mDithering = 0; - } - - fragment_parts_t parts; - - // ------------------------------------------------------------------------ - prolog(); - // ------------------------------------------------------------------------ - - build_scanline_prolog(parts, needs); - - if (registerFile().status()) - return registerFile().status(); - - // ------------------------------------------------------------------------ - label("fragment_loop"); - // ------------------------------------------------------------------------ - { - Scratch regs(registerFile()); - - if (mDithering) { - // update the dither index. - MOV(AL, 0, parts.count.reg, - reg_imm(parts.count.reg, ROR, GGL_DITHER_ORDER_SHIFT)); - ADD(AL, 0, parts.count.reg, parts.count.reg, - imm( 1 << (32 - GGL_DITHER_ORDER_SHIFT))); - MOV(AL, 0, parts.count.reg, - reg_imm(parts.count.reg, ROR, 32 - GGL_DITHER_ORDER_SHIFT)); - } - - // XXX: could we do an early alpha-test here in some cases? - // It would probaly be used only with smooth-alpha and no texture - // (or no alpha component in the texture). - - // Early z-test - if (mAlphaTest==GGL_ALWAYS) { - build_depth_test(parts, Z_TEST|Z_WRITE); - } else { - // we cannot do the z-write here, because - // it might be killed by the alpha-test later - build_depth_test(parts, Z_TEST); - } - - { // texture coordinates - Scratch scratches(registerFile()); - - // texel generation - build_textures(parts, regs); - if (registerFile().status()) - return registerFile().status(); - } - - if ((blending & (FACTOR_DST|BLEND_DST)) || - (mMasking && !mAllMasked) || - (mLogicOp & LOGIC_OP_DST)) - { - // blending / logic_op / masking need the framebuffer - mDstPixel.setTo(regs.obtain(), &mCbFormat); - - // load the framebuffer pixel - comment("fetch color-buffer"); - load(parts.cbPtr, mDstPixel); - } - - if (registerFile().status()) - return registerFile().status(); - - pixel_t pixel; - int directTex = mTextureMachine.directTexture; - if (directTex | parts.packed) { - // note: we can't have both here - // iterated color or direct texture - pixel = directTex ? parts.texel[directTex-1] : parts.iterated; - pixel.flags &= ~CORRUPTIBLE; - } else { - if (mDithering) { - const int ctxtReg = mBuilderContext.Rctx; - const int mask = GGL_DITHER_SIZE-1; - parts.dither = reg_t(regs.obtain()); - AND(AL, 0, parts.dither.reg, parts.count.reg, imm(mask)); - ADDR_ADD(AL, 0, parts.dither.reg, ctxtReg, parts.dither.reg); - LDRB(AL, parts.dither.reg, parts.dither.reg, - immed12_pre(GGL_OFFSETOF(ditherMatrix))); - } - - // allocate a register for the resulting pixel - pixel.setTo(regs.obtain(), &mCbFormat, FIRST); - - build_component(pixel, parts, GGLFormat::ALPHA, regs); - - if (mAlphaTest!=GGL_ALWAYS) { - // only handle the z-write part here. We know z-test - // was successful, as well as alpha-test. - build_depth_test(parts, Z_WRITE); - } - - build_component(pixel, parts, GGLFormat::RED, regs); - build_component(pixel, parts, GGLFormat::GREEN, regs); - build_component(pixel, parts, GGLFormat::BLUE, regs); - - pixel.flags |= CORRUPTIBLE; - } - - if (registerFile().status()) - return registerFile().status(); - - if (pixel.reg == -1) { - // be defensive here. if we're here it's probably - // that this whole fragment is a no-op. - pixel = mDstPixel; - } - - if (!mAllMasked) { - // logic operation - build_logic_op(pixel, regs); - - // masking - build_masking(pixel, regs); - - comment("store"); - store(parts.cbPtr, pixel, WRITE_BACK); - } - } - - if (registerFile().status()) - return registerFile().status(); - - // update the iterated color... - if (parts.reload != 3) { - build_smooth_shade(parts); - } - - // update iterated z - build_iterate_z(parts); - - // update iterated fog - build_iterate_f(parts); - - SUB(AL, S, parts.count.reg, parts.count.reg, imm(1<<16)); - B(PL, "fragment_loop"); - label("epilog"); - epilog(registerFile().touched()); - - if ((mAlphaTest!=GGL_ALWAYS) || (mDepthTest!=GGL_ALWAYS)) { - if (mDepthTest!=GGL_ALWAYS) { - label("discard_before_textures"); - build_iterate_texture_coordinates(parts); - } - label("discard_after_textures"); - build_smooth_shade(parts); - build_iterate_z(parts); - build_iterate_f(parts); - if (!mAllMasked) { - ADDR_ADD(AL, 0, parts.cbPtr.reg, parts.cbPtr.reg, imm(parts.cbPtr.size>>3)); - } - SUB(AL, S, parts.count.reg, parts.count.reg, imm(1<<16)); - B(PL, "fragment_loop"); - epilog(registerFile().touched()); - } - - return registerFile().status(); -} - -// --------------------------------------------------------------------------- - -void GGLAssembler::build_scanline_prolog( - fragment_parts_t& parts, const needs_t& needs) -{ - Scratch scratches(registerFile()); - - // compute count - comment("compute ct (# of pixels to process)"); - parts.count.setTo(obtainReg()); - int Rx = scratches.obtain(); - int Ry = scratches.obtain(); - CONTEXT_LOAD(Rx, iterators.xl); - CONTEXT_LOAD(parts.count.reg, iterators.xr); - CONTEXT_LOAD(Ry, iterators.y); - - // parts.count = iterators.xr - Rx - SUB(AL, 0, parts.count.reg, parts.count.reg, Rx); - SUB(AL, 0, parts.count.reg, parts.count.reg, imm(1)); - - if (mDithering) { - // parts.count.reg = 0xNNNNXXDD - // NNNN = count-1 - // DD = dither offset - // XX = 0xxxxxxx (x = garbage) - Scratch scratches(registerFile()); - int tx = scratches.obtain(); - int ty = scratches.obtain(); - AND(AL, 0, tx, Rx, imm(GGL_DITHER_MASK)); - AND(AL, 0, ty, Ry, imm(GGL_DITHER_MASK)); - ADD(AL, 0, tx, tx, reg_imm(ty, LSL, GGL_DITHER_ORDER_SHIFT)); - ORR(AL, 0, parts.count.reg, tx, reg_imm(parts.count.reg, LSL, 16)); - } else { - // parts.count.reg = 0xNNNN0000 - // NNNN = count-1 - MOV(AL, 0, parts.count.reg, reg_imm(parts.count.reg, LSL, 16)); - } - - if (!mAllMasked) { - // compute dst ptr - comment("compute color-buffer pointer"); - const int cb_bits = mCbFormat.size*8; - int Rs = scratches.obtain(); - parts.cbPtr.setTo(obtainReg(), cb_bits); - CONTEXT_LOAD(Rs, state.buffers.color.stride); - CONTEXT_ADDR_LOAD(parts.cbPtr.reg, state.buffers.color.data); - SMLABB(AL, Rs, Ry, Rs, Rx); // Rs = Rx + Ry*Rs - base_offset(parts.cbPtr, parts.cbPtr, Rs); - scratches.recycle(Rs); - } - - // init fog - const int need_fog = GGL_READ_NEEDS(P_FOG, needs.p); - if (need_fog) { - comment("compute initial fog coordinate"); - Scratch scratches(registerFile()); - int dfdx = scratches.obtain(); - int ydfdy = scratches.obtain(); - int f = ydfdy; - CONTEXT_LOAD(dfdx, generated_vars.dfdx); - CONTEXT_LOAD(ydfdy, iterators.ydfdy); - MLA(AL, 0, f, Rx, dfdx, ydfdy); - CONTEXT_STORE(f, generated_vars.f); - } - - // init Z coordinate - if ((mDepthTest != GGL_ALWAYS) || GGL_READ_NEEDS(P_MASK_Z, needs.p)) { - parts.z = reg_t(obtainReg()); - comment("compute initial Z coordinate"); - Scratch scratches(registerFile()); - int dzdx = scratches.obtain(); - int ydzdy = parts.z.reg; - CONTEXT_LOAD(dzdx, generated_vars.dzdx); // 1.31 fixed-point - CONTEXT_LOAD(ydzdy, iterators.ydzdy); // 1.31 fixed-point - MLA(AL, 0, parts.z.reg, Rx, dzdx, ydzdy); - - // we're going to index zbase of parts.count - // zbase = base + (xl-count + stride*y)*2 - int Rs = dzdx; - int zbase = scratches.obtain(); - CONTEXT_LOAD(Rs, state.buffers.depth.stride); - CONTEXT_ADDR_LOAD(zbase, state.buffers.depth.data); - SMLABB(AL, Rs, Ry, Rs, Rx); - ADD(AL, 0, Rs, Rs, reg_imm(parts.count.reg, LSR, 16)); - ADDR_ADD(AL, 0, zbase, zbase, reg_imm(Rs, LSL, 1)); - CONTEXT_ADDR_STORE(zbase, generated_vars.zbase); - } - - // init texture coordinates - init_textures(parts.coords, reg_t(Rx), reg_t(Ry)); - scratches.recycle(Ry); - - // iterated color - init_iterated_color(parts, reg_t(Rx)); - - // init coverage factor application (anti-aliasing) - if (mAA) { - parts.covPtr.setTo(obtainReg(), 16); - CONTEXT_ADDR_LOAD(parts.covPtr.reg, state.buffers.coverage); - ADDR_ADD(AL, 0, parts.covPtr.reg, parts.covPtr.reg, reg_imm(Rx, LSL, 1)); - } -} - -// --------------------------------------------------------------------------- - -void GGLAssembler::build_component( pixel_t& pixel, - const fragment_parts_t& parts, - int component, - Scratch& regs) -{ - static char const * comments[] = {"alpha", "red", "green", "blue"}; - comment(comments[component]); - - // local register file - Scratch scratches(registerFile()); - const int dst_component_size = pixel.component_size(component); - - component_t temp(-1); - build_incoming_component( temp, dst_component_size, - parts, component, scratches, regs); - - if (mInfo[component].inDest) { - - // blending... - build_blending( temp, mDstPixel, component, scratches ); - - // downshift component and rebuild pixel... - downshift(pixel, component, temp, parts.dither); - } -} - -void GGLAssembler::build_incoming_component( - component_t& temp, - int dst_size, - const fragment_parts_t& parts, - int component, - Scratch& scratches, - Scratch& global_regs) -{ - const uint32_t component_mask = 1< int(GGL_ZERO)); - - // expand the source if the destination has more bits - int need_expander = false; - for (int i=0 ; i 1; - const int blend_needs_alpha_source = (component==GGLFormat::ALPHA) && - (isAlphaSourceNeeded()); - int need_extract = mInfo[component].needed; - if (mInfo[component].inDest) - { - need_extract |= ((need_blending ? - (blending & (BLEND_SRC|FACTOR_SRC)) : need_expander)); - need_extract |= (mTextureMachine.mask != mTextureMachine.replaced); - need_extract |= mInfo[component].smooth; - need_extract |= mInfo[component].fog; - need_extract |= mDithering; - need_extract |= multiTexture; - } - - if (need_extract) { - Scratch& regs = blend_needs_alpha_source ? global_regs : scratches; - component_t fragment; - - // iterated color - build_iterated_color(fragment, parts, component, regs); - - // texture environement (decal, modulate, replace) - build_texture_environment(fragment, parts, component, regs); - - // expand the source if the destination has more bits - if (need_expander && (fragment.size() < dst_size)) { - // we're here only if we fetched a texel - // (so we know for sure fragment is CORRUPTIBLE) - expand(fragment, fragment, dst_size); - } - - // We have a few specific things to do for the alpha-channel - if ((component==GGLFormat::ALPHA) && - (mInfo[component].needed || fragment.size() 31) { - fragment.h--; - SMULWB(AL, fragment.reg, incoming.reg, cf); - } else { - MOV(AL, 0, fragment.reg, reg_imm(incoming.reg, LSL, 1)); - SMULWB(AL, fragment.reg, fragment.reg, cf); - } - } -} - -// --------------------------------------------------------------------------- - -void GGLAssembler::build_alpha_test(component_t& fragment, - const fragment_parts_t& /*parts*/) -{ - if (mAlphaTest != GGL_ALWAYS) { - comment("Alpha Test"); - Scratch scratches(registerFile()); - int ref = scratches.obtain(); - const int shift = GGL_COLOR_BITS-fragment.size(); - CONTEXT_LOAD(ref, state.alpha_test.ref); - if (shift) CMP(AL, fragment.reg, reg_imm(ref, LSR, shift)); - else CMP(AL, fragment.reg, ref); - int cc = NV; - switch (mAlphaTest) { - case GGL_NEVER: cc = NV; break; - case GGL_LESS: cc = LT; break; - case GGL_EQUAL: cc = EQ; break; - case GGL_LEQUAL: cc = LS; break; - case GGL_GREATER: cc = HI; break; - case GGL_NOTEQUAL: cc = NE; break; - case GGL_GEQUAL: cc = HS; break; - } - B(cc^1, "discard_after_textures"); - } -} - -// --------------------------------------------------------------------------- - -void GGLAssembler::build_depth_test( - const fragment_parts_t& parts, uint32_t mask) -{ - mask &= Z_TEST|Z_WRITE; - const needs_t& needs = mBuilderContext.needs; - const int zmask = GGL_READ_NEEDS(P_MASK_Z, needs.p); - Scratch scratches(registerFile()); - - if (mDepthTest != GGL_ALWAYS || zmask) { - int cc=AL, ic=AL; - switch (mDepthTest) { - case GGL_LESS: ic = HI; break; - case GGL_EQUAL: ic = EQ; break; - case GGL_LEQUAL: ic = HS; break; - case GGL_GREATER: ic = LT; break; - case GGL_NOTEQUAL: ic = NE; break; - case GGL_GEQUAL: ic = LS; break; - case GGL_NEVER: - // this never happens, because it's taken care of when - // computing the needs. but we keep it for completness. - comment("Depth Test (NEVER)"); - B(AL, "discard_before_textures"); - return; - case GGL_ALWAYS: - // we're here because zmask is enabled - mask &= ~Z_TEST; // test always passes. - break; - } - - // inverse the condition - cc = ic^1; - - if ((mask & Z_WRITE) && !zmask) { - mask &= ~Z_WRITE; - } - - if (!mask) - return; - - comment("Depth Test"); - - int zbase = scratches.obtain(); - int depth = scratches.obtain(); - int z = parts.z.reg; - - CONTEXT_ADDR_LOAD(zbase, generated_vars.zbase); // stall - ADDR_SUB(AL, 0, zbase, zbase, reg_imm(parts.count.reg, LSR, 15)); - // above does zbase = zbase + ((count >> 16) << 1) - - if (mask & Z_TEST) { - LDRH(AL, depth, zbase); // stall - CMP(AL, depth, reg_imm(z, LSR, 16)); - B(cc, "discard_before_textures"); - } - if (mask & Z_WRITE) { - if (mask == Z_WRITE) { - // only z-write asked, cc is meaningless - ic = AL; - } - MOV(AL, 0, depth, reg_imm(z, LSR, 16)); - STRH(ic, depth, zbase); - } - } -} - -void GGLAssembler::build_iterate_z(const fragment_parts_t& parts) -{ - const needs_t& needs = mBuilderContext.needs; - if ((mDepthTest != GGL_ALWAYS) || GGL_READ_NEEDS(P_MASK_Z, needs.p)) { - Scratch scratches(registerFile()); - int dzdx = scratches.obtain(); - CONTEXT_LOAD(dzdx, generated_vars.dzdx); // stall - ADD(AL, 0, parts.z.reg, parts.z.reg, dzdx); - } -} - -void GGLAssembler::build_iterate_f(const fragment_parts_t& /*parts*/) -{ - const needs_t& needs = mBuilderContext.needs; - if (GGL_READ_NEEDS(P_FOG, needs.p)) { - Scratch scratches(registerFile()); - int dfdx = scratches.obtain(); - int f = scratches.obtain(); - CONTEXT_LOAD(f, generated_vars.f); - CONTEXT_LOAD(dfdx, generated_vars.dfdx); // stall - ADD(AL, 0, f, f, dfdx); - CONTEXT_STORE(f, generated_vars.f); - } -} - -// --------------------------------------------------------------------------- - -void GGLAssembler::build_logic_op(pixel_t& pixel, Scratch& regs) -{ - const needs_t& needs = mBuilderContext.needs; - const int opcode = GGL_READ_NEEDS(LOGIC_OP, needs.n) | GGL_CLEAR; - if (opcode == GGL_COPY) - return; - - comment("logic operation"); - - pixel_t s(pixel); - if (!(pixel.flags & CORRUPTIBLE)) { - pixel.reg = regs.obtain(); - pixel.flags |= CORRUPTIBLE; - } - - pixel_t d(mDstPixel); - switch(opcode) { - case GGL_CLEAR: MOV(AL, 0, pixel.reg, imm(0)); break; - case GGL_AND: AND(AL, 0, pixel.reg, s.reg, d.reg); break; - case GGL_AND_REVERSE: BIC(AL, 0, pixel.reg, s.reg, d.reg); break; - case GGL_COPY: break; - case GGL_AND_INVERTED: BIC(AL, 0, pixel.reg, d.reg, s.reg); break; - case GGL_NOOP: MOV(AL, 0, pixel.reg, d.reg); break; - case GGL_XOR: EOR(AL, 0, pixel.reg, s.reg, d.reg); break; - case GGL_OR: ORR(AL, 0, pixel.reg, s.reg, d.reg); break; - case GGL_NOR: ORR(AL, 0, pixel.reg, s.reg, d.reg); - MVN(AL, 0, pixel.reg, pixel.reg); break; - case GGL_EQUIV: EOR(AL, 0, pixel.reg, s.reg, d.reg); - MVN(AL, 0, pixel.reg, pixel.reg); break; - case GGL_INVERT: MVN(AL, 0, pixel.reg, d.reg); break; - case GGL_OR_REVERSE: // s | ~d == ~(~s & d) - BIC(AL, 0, pixel.reg, d.reg, s.reg); - MVN(AL, 0, pixel.reg, pixel.reg); break; - case GGL_COPY_INVERTED: MVN(AL, 0, pixel.reg, s.reg); break; - case GGL_OR_INVERTED: // ~s | d == ~(s & ~d) - BIC(AL, 0, pixel.reg, s.reg, d.reg); - MVN(AL, 0, pixel.reg, pixel.reg); break; - case GGL_NAND: AND(AL, 0, pixel.reg, s.reg, d.reg); - MVN(AL, 0, pixel.reg, pixel.reg); break; - case GGL_SET: MVN(AL, 0, pixel.reg, imm(0)); break; - }; -} - -// --------------------------------------------------------------------------- - -static uint32_t find_bottom(uint32_t val) -{ - uint32_t i = 0; - while (!(val & (3<> 2; - newval |= (val&3) << 30; - val = newval; - rot += 2; - if (rot == 32) { - rot = 0; - break; - } - } -} - -void GGLAssembler::build_and_immediate(int d, int s, uint32_t mask, int bits) -{ - uint32_t rot; - uint32_t size = ((bits>=32) ? 0 : (1LU << bits)) - 1; - mask &= size; - - if (mask == size) { - if (d != s) - MOV( AL, 0, d, s); - return; - } - - if ((getCodegenArch() == CODEGEN_ARCH_MIPS) || - (getCodegenArch() == CODEGEN_ARCH_MIPS64)) { - // MIPS can do 16-bit imm in 1 instr, 32-bit in 3 instr - // the below ' while (mask)' code is buggy on mips - // since mips returns true on isValidImmediate() - // then we get multiple AND instr (positive logic) - AND( AL, 0, d, s, imm(mask) ); - return; - } - else if (getCodegenArch() == CODEGEN_ARCH_ARM64) { - AND( AL, 0, d, s, imm(mask) ); - return; - } - - int negative_logic = !isValidImmediate(mask); - if (negative_logic) { - mask = ~mask & size; - } - normalize(mask, rot); - - if (mask) { - while (mask) { - uint32_t bitpos = find_bottom(mask); - int shift = rot + bitpos; - uint32_t m = mask & (0xff << bitpos); - mask &= ~m; - m >>= bitpos; - int32_t newMask = (m<>(32-shift)); - if (!negative_logic) { - AND( AL, 0, d, s, imm(newMask) ); - } else { - BIC( AL, 0, d, s, imm(newMask) ); - } - s = d; - } - } else { - MOV( AL, 0, d, imm(0)); - } -} - -void GGLAssembler::build_masking(pixel_t& pixel, Scratch& regs) -{ - if (!mMasking || mAllMasked) { - return; - } - - comment("color mask"); - - pixel_t fb(mDstPixel); - pixel_t s(pixel); - if (!(pixel.flags & CORRUPTIBLE)) { - pixel.reg = regs.obtain(); - pixel.flags |= CORRUPTIBLE; - } - - int mask = 0; - for (int i=0 ; i<4 ; i++) { - const int component_mask = 1<=16+(int)mRegisterOffset, "invalid register %d", reg); - return mRegs & (1<= nbreg, "pixelflinger ran out of registers\n"); - if (i >= nbreg) { - mStatus |= OUT_OF_REGISTERS; - // we return SP so we can more easily debug things - // the code will never be run anyway. - return ARMAssemblerInterface::SP; - } - reg = reserve(r); // Param in Arm range 0-15, returns range 2-17 on Mips. - return reg; -} - -bool RegisterAllocator::RegisterFile::hasFreeRegs() const -{ - uint32_t regs = mRegs >> mRegisterOffset; // MIPS fix. - return ((regs & 0xFFFF) == 0xFFFF) ? false : true; -} - -int RegisterAllocator::RegisterFile::countFreeRegs() const -{ - uint32_t regs = mRegs >> mRegisterOffset; // MIPS fix. - int f = ~regs & 0xFFFF; - // now count number of 1 - f = (f & 0x5555) + ((f>>1) & 0x5555); - f = (f & 0x3333) + ((f>>2) & 0x3333); - f = (f & 0x0F0F) + ((f>>4) & 0x0F0F); - f = (f & 0x00FF) + ((f>>8) & 0x00FF); - return f; -} - -void RegisterAllocator::RegisterFile::recycle(int reg) -{ - // commented out, since common failure of running out of regs - // triggers this assertion. Since the code is not execectued - // in that case, it does not matter. No reason to FATAL err. - // LOG_FATAL_IF(!isUsed(reg), - // "recycling unallocated register %d", - // reg); - mRegs &= ~(1< -#include - -#include - -#include "ARMAssemblerProxy.h" - - -namespace android { - -// ---------------------------------------------------------------------------- - -#define CONTEXT_ADDR_LOAD(REG, FIELD) \ - ADDR_LDR(AL, REG, mBuilderContext.Rctx, immed12_pre(GGL_OFFSETOF(FIELD))) - -#define CONTEXT_ADDR_STORE(REG, FIELD) \ - ADDR_STR(AL, REG, mBuilderContext.Rctx, immed12_pre(GGL_OFFSETOF(FIELD))) - -#define CONTEXT_LOAD(REG, FIELD) \ - LDR(AL, REG, mBuilderContext.Rctx, immed12_pre(GGL_OFFSETOF(FIELD))) - -#define CONTEXT_STORE(REG, FIELD) \ - STR(AL, REG, mBuilderContext.Rctx, immed12_pre(GGL_OFFSETOF(FIELD))) - - -class RegisterAllocator -{ -public: - class RegisterFile; - - RegisterAllocator(int arch); // NOLINT, implicit - RegisterFile& registerFile(); - int reserveReg(int reg); - int obtainReg(); - void recycleReg(int reg); - void reset(); - - class RegisterFile - { - public: - RegisterFile(int arch); // NOLINT, implicit - RegisterFile(const RegisterFile& rhs, int arch); - ~RegisterFile(); - - void reset(); - - bool operator == (const RegisterFile& rhs) const; - bool operator != (const RegisterFile& rhs) const { - return !operator == (rhs); - } - - int reserve(int reg); - void reserveSeveral(uint32_t regMask); - - void recycle(int reg); - void recycleSeveral(uint32_t regMask); - - int obtain(); - inline int isUsed(int reg) const; - - bool hasFreeRegs() const; - int countFreeRegs() const; - - uint32_t touched() const; - inline uint32_t status() const { return mStatus; } - - enum { - OUT_OF_REGISTERS = 0x1 - }; - - private: - uint32_t mRegs; - uint32_t mTouched; - uint32_t mStatus; - int mArch; - uint32_t mRegisterOffset; // lets reg alloc use 2..17 for mips - // while arm uses 0..15 - }; - - class Scratch - { - public: - explicit Scratch(RegisterFile& regFile) - : mRegFile(regFile), mScratch(0) { - } - ~Scratch() { - mRegFile.recycleSeveral(mScratch); - } - int obtain() { - int reg = mRegFile.obtain(); - mScratch |= 1< - void modify(T& r, Scratch& regs) - { - if (!(r.flags & CORRUPTIBLE)) { - r.reg = regs.obtain(); - r.flags |= CORRUPTIBLE; - } - } - - // helpers - void base_offset(const pointer_t& d, const pointer_t& b, const reg_t& o); - - // texture environement - void modulate( component_t& dest, - const component_t& incoming, - const pixel_t& texel, int component); - - void decal( component_t& dest, - const component_t& incoming, - const pixel_t& texel, int component); - - void blend( component_t& dest, - const component_t& incoming, - const pixel_t& texel, int component, int tmu); - - void add( component_t& dest, - const component_t& incoming, - const pixel_t& texel, int component); - - // load/store stuff - void store(const pointer_t& addr, const pixel_t& src, uint32_t flags=0); - void load(const pointer_t& addr, const pixel_t& dest, uint32_t flags=0); - void extract(integer_t& d, const pixel_t& s, int component); - void extract(component_t& d, const pixel_t& s, int component); - void extract(integer_t& d, int s, int h, int l, int bits=32); - void expand(integer_t& d, const integer_t& s, int dbits); - void expand(integer_t& d, const component_t& s, int dbits); - void expand(component_t& d, const component_t& s, int dbits); - void downshift(pixel_t& d, int component, component_t s, const reg_t& dither); - - - void mul_factor( component_t& d, - const integer_t& v, - const integer_t& f); - - void mul_factor_add( component_t& d, - const integer_t& v, - const integer_t& f, - const component_t& a); - - void component_add( component_t& d, - const integer_t& dst, - const integer_t& src); - - void component_sat( const component_t& v); - - - void build_scanline_prolog( fragment_parts_t& parts, - const needs_t& needs); - - void build_smooth_shade(const fragment_parts_t& parts); - - void build_component( pixel_t& pixel, - const fragment_parts_t& parts, - int component, - Scratch& global_scratches); - - void build_incoming_component( - component_t& temp, - int dst_size, - const fragment_parts_t& parts, - int component, - Scratch& scratches, - Scratch& global_scratches); - - void init_iterated_color(fragment_parts_t& parts, const reg_t& x); - - void build_iterated_color( component_t& fragment, - const fragment_parts_t& parts, - int component, - Scratch& regs); - - void decodeLogicOpNeeds(const needs_t& needs); - - void decodeTMUNeeds(const needs_t& needs, context_t const* c); - - void init_textures( tex_coord_t* coords, - const reg_t& x, - const reg_t& y); - - void build_textures( fragment_parts_t& parts, - Scratch& regs); - - void filter8( const fragment_parts_t& parts, - pixel_t& texel, const texture_unit_t& tmu, - int U, int V, pointer_t& txPtr, - int FRAC_BITS); - - void filter16( const fragment_parts_t& parts, - pixel_t& texel, const texture_unit_t& tmu, - int U, int V, pointer_t& txPtr, - int FRAC_BITS); - - void filter24( const fragment_parts_t& parts, - pixel_t& texel, const texture_unit_t& tmu, - int U, int V, pointer_t& txPtr, - int FRAC_BITS); - - void filter32( const fragment_parts_t& parts, - pixel_t& texel, const texture_unit_t& tmu, - int U, int V, pointer_t& txPtr, - int FRAC_BITS); - - void build_texture_environment( component_t& fragment, - const fragment_parts_t& parts, - int component, - Scratch& regs); - - void wrapping( int d, - int coord, int size, - int tx_wrap, int tx_linear); - - void build_fog( component_t& temp, - int component, - Scratch& parent_scratches); - - void build_blending( component_t& in_out, - const pixel_t& pixel, - int component, - Scratch& parent_scratches); - - void build_blend_factor( - integer_t& factor, int f, int component, - const pixel_t& dst_pixel, - integer_t& fragment, - integer_t& fb, - Scratch& scratches); - - void build_blendFOneMinusF( component_t& temp, - const integer_t& factor, - const integer_t& fragment, - const integer_t& fb); - - void build_blendOneMinusFF( component_t& temp, - const integer_t& factor, - const integer_t& fragment, - const integer_t& fb); - - void build_coverage_application(component_t& fragment, - const fragment_parts_t& parts, - Scratch& regs); - - void build_alpha_test(component_t& fragment, const fragment_parts_t& parts); - - enum { Z_TEST=1, Z_WRITE=2 }; - void build_depth_test(const fragment_parts_t& parts, uint32_t mask); - void build_iterate_z(const fragment_parts_t& parts); - void build_iterate_f(const fragment_parts_t& parts); - void build_iterate_texture_coordinates(const fragment_parts_t& parts); - - void build_logic_op(pixel_t& pixel, Scratch& regs); - - void build_masking(pixel_t& pixel, Scratch& regs); - - void build_and_immediate(int d, int s, uint32_t mask, int bits); - - bool isAlphaSourceNeeded() const; - - enum { - FACTOR_SRC=1, FACTOR_DST=2, BLEND_SRC=4, BLEND_DST=8 - }; - - enum { - LOGIC_OP=1, LOGIC_OP_SRC=2, LOGIC_OP_DST=4 - }; - - static int blending_codes(int fs, int fd); - - builder_context_t mBuilderContext; - texture_machine_t mTextureMachine; - component_info_t mInfo[4]; - int mBlending; - int mMasking; - int mAllMasked; - int mLogicOp; - int mAlphaTest; - int mAA; - int mDithering; - int mDepthTest; - - int mSmooth; - int mFog; - pixel_t mDstPixel; - - GGLFormat mCbFormat; - - int mBlendFactorCached; - integer_t mAlphaSource; - - int mBaseRegister; - - int mBlendSrc; - int mBlendDst; - int mBlendSrcA; - int mBlendDstA; - - int mOptLevel; -}; - -// ---------------------------------------------------------------------------- - -}; // namespace android - -#endif // ANDROID_GGLASSEMBLER_H diff --git a/libpixelflinger/codeflinger/MIPS64Assembler.cpp b/libpixelflinger/codeflinger/MIPS64Assembler.cpp deleted file mode 100644 index d6d215679..000000000 --- a/libpixelflinger/codeflinger/MIPS64Assembler.cpp +++ /dev/null @@ -1,1447 +0,0 @@ -/* libs/pixelflinger/codeflinger/MIPS64Assembler.cpp -** -** Copyright 2015, 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. -*/ - - -/* MIPS64 assembler and ARM->MIPS64 assembly translator -** -** The approach is utilize MIPSAssembler generator, using inherited MIPS64Assembler -** that overrides just the specific MIPS64r6 instructions. -** For now ArmToMips64Assembler is copied over from ArmToMipsAssembler class, -** changing some MIPS64r6 related stuff. -** -*/ - -#define LOG_TAG "MIPS64Assembler" - -#include -#include - -#include -#include -#include - -#include "MIPS64Assembler.h" -#include "CodeCache.h" -#include "mips64_disassem.h" - -#define NOT_IMPLEMENTED() LOG_ALWAYS_FATAL("Arm instruction %s not yet implemented\n", __func__) -#define __unused __attribute__((__unused__)) - -// ---------------------------------------------------------------------------- - -namespace android { - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark ArmToMips64Assembler... -#endif - -ArmToMips64Assembler::ArmToMips64Assembler(const sp& assembly, - char *abuf, int linesz, int instr_count) - : ARMAssemblerInterface(), - mArmDisassemblyBuffer(abuf), - mArmLineLength(linesz), - mArmInstrCount(instr_count), - mInum(0), - mAssembly(assembly) -{ - mMips = new MIPS64Assembler(assembly, this); - mArmPC = (uint32_t **) malloc(ARM_MAX_INSTUCTIONS * sizeof(uint32_t *)); - init_conditional_labels(); -} - -ArmToMips64Assembler::ArmToMips64Assembler(void* assembly) - : ARMAssemblerInterface(), - mArmDisassemblyBuffer(NULL), - mInum(0), - mAssembly(NULL) -{ - mMips = new MIPS64Assembler(assembly, this); - mArmPC = (uint32_t **) malloc(ARM_MAX_INSTUCTIONS * sizeof(uint32_t *)); - init_conditional_labels(); -} - -ArmToMips64Assembler::~ArmToMips64Assembler() -{ - delete mMips; - free((void *) mArmPC); -} - -uint32_t* ArmToMips64Assembler::pc() const -{ - return mMips->pc(); -} - -uint32_t* ArmToMips64Assembler::base() const -{ - return mMips->base(); -} - -void ArmToMips64Assembler::reset() -{ - cond.labelnum = 0; - mInum = 0; - mMips->reset(); -} - -int ArmToMips64Assembler::getCodegenArch() -{ - return CODEGEN_ARCH_MIPS64; -} - -void ArmToMips64Assembler::comment(const char* string) -{ - mMips->comment(string); -} - -void ArmToMips64Assembler::label(const char* theLabel) -{ - mMips->label(theLabel); -} - -void ArmToMips64Assembler::disassemble(const char* name) -{ - mMips->disassemble(name); -} - -void ArmToMips64Assembler::init_conditional_labels() -{ - int i; - for (i=0;i<99; ++i) { - sprintf(cond.label[i], "cond_%d", i); - } -} - - - -#if 0 -#pragma mark - -#pragma mark Prolog/Epilog & Generate... -#endif - -void ArmToMips64Assembler::prolog() -{ - mArmPC[mInum++] = pc(); // save starting PC for this instr - - mMips->DADDIU(R_sp, R_sp, -(5 * 8)); - mMips->SD(R_s0, R_sp, 0); - mMips->SD(R_s1, R_sp, 8); - mMips->SD(R_s2, R_sp, 16); - mMips->SD(R_s3, R_sp, 24); - mMips->SD(R_s4, R_sp, 32); - mMips->MOVE(R_v0, R_a0); // move context * passed in a0 to v0 (arm r0) -} - -void ArmToMips64Assembler::epilog(uint32_t touched __unused) -{ - mArmPC[mInum++] = pc(); // save starting PC for this instr - - mMips->LD(R_s0, R_sp, 0); - mMips->LD(R_s1, R_sp, 8); - mMips->LD(R_s2, R_sp, 16); - mMips->LD(R_s3, R_sp, 24); - mMips->LD(R_s4, R_sp, 32); - mMips->DADDIU(R_sp, R_sp, (5 * 8)); - mMips->JR(R_ra); - -} - -int ArmToMips64Assembler::generate(const char* name) -{ - return mMips->generate(name); -} - -void ArmToMips64Assembler::fix_branches() -{ - mMips->fix_branches(); -} - -uint32_t* ArmToMips64Assembler::pcForLabel(const char* label) -{ - return mMips->pcForLabel(label); -} - -void ArmToMips64Assembler::set_condition(int mode, int R1, int R2) { - if (mode == 2) { - cond.type = SBIT_COND; - } else { - cond.type = CMP_COND; - } - cond.r1 = R1; - cond.r2 = R2; -} - -//---------------------------------------------------------- - -#if 0 -#pragma mark - -#pragma mark Addressing modes & shifters... -#endif - - -// do not need this for MIPS, but it is in the Interface (virtual) -int ArmToMips64Assembler::buildImmediate( - uint32_t immediate, uint32_t& rot, uint32_t& imm) -{ - // for MIPS, any 32-bit immediate is OK - rot = 0; - imm = immediate; - return 0; -} - -// shifters... - -bool ArmToMips64Assembler::isValidImmediate(uint32_t immediate __unused) -{ - // for MIPS, any 32-bit immediate is OK - return true; -} - -uint32_t ArmToMips64Assembler::imm(uint32_t immediate) -{ - amode.value = immediate; - return AMODE_IMM; -} - -uint32_t ArmToMips64Assembler::reg_imm(int Rm, int type, uint32_t shift) -{ - amode.reg = Rm; - amode.stype = type; - amode.value = shift; - return AMODE_REG_IMM; -} - -uint32_t ArmToMips64Assembler::reg_rrx(int Rm __unused) -{ - // reg_rrx mode is not used in the GLLAssember code at this time - return AMODE_UNSUPPORTED; -} - -uint32_t ArmToMips64Assembler::reg_reg(int Rm __unused, int type __unused, - int Rs __unused) -{ - // reg_reg mode is not used in the GLLAssember code at this time - return AMODE_UNSUPPORTED; -} - - -// addressing modes... -// LDR(B)/STR(B)/PLD (immediate and Rm can be negative, which indicate U=0) -uint32_t ArmToMips64Assembler::immed12_pre(int32_t immed12, int W) -{ - LOG_ALWAYS_FATAL_IF(abs(immed12) >= 0x800, - "LDR(B)/STR(B)/PLD immediate too big (%08x)", - immed12); - amode.value = immed12; - amode.writeback = W; - return AMODE_IMM_12_PRE; -} - -uint32_t ArmToMips64Assembler::immed12_post(int32_t immed12) -{ - LOG_ALWAYS_FATAL_IF(abs(immed12) >= 0x800, - "LDR(B)/STR(B)/PLD immediate too big (%08x)", - immed12); - - amode.value = immed12; - return AMODE_IMM_12_POST; -} - -uint32_t ArmToMips64Assembler::reg_scale_pre(int Rm, int type, - uint32_t shift, int W) -{ - LOG_ALWAYS_FATAL_IF(W | type | shift, "reg_scale_pre adv modes not yet implemented"); - - amode.reg = Rm; - // amode.stype = type; // more advanced modes not used in GGLAssembler yet - // amode.value = shift; - // amode.writeback = W; - return AMODE_REG_SCALE_PRE; -} - -uint32_t ArmToMips64Assembler::reg_scale_post(int Rm __unused, int type __unused, - uint32_t shift __unused) -{ - LOG_ALWAYS_FATAL("adr mode reg_scale_post not yet implemented\n"); - return AMODE_UNSUPPORTED; -} - -// LDRH/LDRSB/LDRSH/STRH (immediate and Rm can be negative, which indicate U=0) -uint32_t ArmToMips64Assembler::immed8_pre(int32_t immed8, int W __unused) -{ - LOG_ALWAYS_FATAL("adr mode immed8_pre not yet implemented\n"); - - LOG_ALWAYS_FATAL_IF(abs(immed8) >= 0x100, - "LDRH/LDRSB/LDRSH/STRH immediate too big (%08x)", - immed8); - return AMODE_IMM_8_PRE; -} - -uint32_t ArmToMips64Assembler::immed8_post(int32_t immed8) -{ - LOG_ALWAYS_FATAL_IF(abs(immed8) >= 0x100, - "LDRH/LDRSB/LDRSH/STRH immediate too big (%08x)", - immed8); - amode.value = immed8; - return AMODE_IMM_8_POST; -} - -uint32_t ArmToMips64Assembler::reg_pre(int Rm, int W) -{ - LOG_ALWAYS_FATAL_IF(W, "reg_pre writeback not yet implemented"); - amode.reg = Rm; - return AMODE_REG_PRE; -} - -uint32_t ArmToMips64Assembler::reg_post(int Rm __unused) -{ - LOG_ALWAYS_FATAL("adr mode reg_post not yet implemented\n"); - return AMODE_UNSUPPORTED; -} - - - -// ---------------------------------------------------------------------------- - -#if 0 -#pragma mark - -#pragma mark Data Processing... -#endif - -// check if the operand registers from a previous CMP or S-bit instruction -// would be overwritten by this instruction. If so, move the value to a -// safe register. -// Note that we cannot tell at _this_ instruction time if a future (conditional) -// instruction will _also_ use this value (a defect of the simple 1-pass, one- -// instruction-at-a-time translation). Therefore we must be conservative and -// save the value before it is overwritten. This costs an extra MOVE instr. - -void ArmToMips64Assembler::protectConditionalOperands(int Rd) -{ - if (Rd == cond.r1) { - mMips->MOVE(R_cmp, cond.r1); - cond.r1 = R_cmp; - } - if (cond.type == CMP_COND && Rd == cond.r2) { - mMips->MOVE(R_cmp2, cond.r2); - cond.r2 = R_cmp2; - } -} - - -// interprets the addressing mode, and generates the common code -// used by the majority of data-processing ops. Many MIPS instructions -// have a register-based form and a different immediate form. See -// opAND below for an example. (this could be inlined) -// -// this works with the imm(), reg_imm() methods above, which are directly -// called by the GLLAssembler. -// note: _signed parameter defaults to false (un-signed) -// note: tmpReg parameter defaults to 1, MIPS register AT -int ArmToMips64Assembler::dataProcAdrModes(int op, int& source, bool _signed, int tmpReg) -{ - if (op < AMODE_REG) { - source = op; - return SRC_REG; - } else if (op == AMODE_IMM) { - if ((!_signed && amode.value > 0xffff) - || (_signed && ((int)amode.value < -32768 || (int)amode.value > 32767) )) { - mMips->LUI(tmpReg, (amode.value >> 16)); - if (amode.value & 0x0000ffff) { - mMips->ORI(tmpReg, tmpReg, (amode.value & 0x0000ffff)); - } - source = tmpReg; - return SRC_REG; - } else { - source = amode.value; - return SRC_IMM; - } - } else if (op == AMODE_REG_IMM) { - switch (amode.stype) { - case LSL: mMips->SLL(tmpReg, amode.reg, amode.value); break; - case LSR: mMips->SRL(tmpReg, amode.reg, amode.value); break; - case ASR: mMips->SRA(tmpReg, amode.reg, amode.value); break; - case ROR: mMips->ROTR(tmpReg, amode.reg, amode.value); break; - } - source = tmpReg; - return SRC_REG; - } else { // adr mode RRX is not used in GGL Assembler at this time - // we are screwed, this should be exception, assert-fail or something - LOG_ALWAYS_FATAL("adr mode reg_rrx not yet implemented\n"); - return SRC_ERROR; - } -} - - -void ArmToMips64Assembler::dataProcessing(int opcode, int cc, - int s, int Rd, int Rn, uint32_t Op2) -{ - int src; // src is modified by dataProcAdrModes() - passed as int& - - if (cc != AL) { - protectConditionalOperands(Rd); - // the branch tests register(s) set by prev CMP or instr with 'S' bit set - // inverse the condition to jump past this conditional instruction - ArmToMips64Assembler::B(cc^1, cond.label[++cond.labelnum]); - } else { - mArmPC[mInum++] = pc(); // save starting PC for this instr - } - - switch (opcode) { - case opAND: - if (dataProcAdrModes(Op2, src) == SRC_REG) { - mMips->AND(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->ANDI(Rd, Rn, src); - } - break; - - case opADD: - // set "signed" to true for adr modes - if (dataProcAdrModes(Op2, src, true) == SRC_REG) { - mMips->ADDU(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->ADDIU(Rd, Rn, src); - } - break; - - case opSUB: - // set "signed" to true for adr modes - if (dataProcAdrModes(Op2, src, true) == SRC_REG) { - mMips->SUBU(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->SUBIU(Rd, Rn, src); - } - break; - - case opADD64: - // set "signed" to true for adr modes - if (dataProcAdrModes(Op2, src, true) == SRC_REG) { - mMips->DADDU(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->DADDIU(Rd, Rn, src); - } - break; - - case opSUB64: - // set "signed" to true for adr modes - if (dataProcAdrModes(Op2, src, true) == SRC_REG) { - mMips->DSUBU(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->DSUBIU(Rd, Rn, src); - } - break; - - case opEOR: - if (dataProcAdrModes(Op2, src) == SRC_REG) { - mMips->XOR(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->XORI(Rd, Rn, src); - } - break; - - case opORR: - if (dataProcAdrModes(Op2, src) == SRC_REG) { - mMips->OR(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->ORI(Rd, Rn, src); - } - break; - - case opBIC: - if (dataProcAdrModes(Op2, src) == SRC_IMM) { - // if we are 16-bit imnmediate, load to AT reg - mMips->ORI(R_at, 0, src); - src = R_at; - } - mMips->NOT(R_at, src); - mMips->AND(Rd, Rn, R_at); - break; - - case opRSB: - if (dataProcAdrModes(Op2, src) == SRC_IMM) { - // if we are 16-bit imnmediate, load to AT reg - mMips->ORI(R_at, 0, src); - src = R_at; - } - mMips->SUBU(Rd, src, Rn); // subu with the parameters reversed - break; - - case opMOV: - if (Op2 < AMODE_REG) { // op2 is reg # in this case - mMips->MOVE(Rd, Op2); - } else if (Op2 == AMODE_IMM) { - if (amode.value > 0xffff) { - mMips->LUI(Rd, (amode.value >> 16)); - if (amode.value & 0x0000ffff) { - mMips->ORI(Rd, Rd, (amode.value & 0x0000ffff)); - } - } else { - mMips->ORI(Rd, 0, amode.value); - } - } else if (Op2 == AMODE_REG_IMM) { - switch (amode.stype) { - case LSL: mMips->SLL(Rd, amode.reg, amode.value); break; - case LSR: mMips->SRL(Rd, amode.reg, amode.value); break; - case ASR: mMips->SRA(Rd, amode.reg, amode.value); break; - case ROR: mMips->ROTR(Rd, amode.reg, amode.value); break; - } - } - else { - // adr mode RRX is not used in GGL Assembler at this time - mMips->UNIMPL(); - } - break; - - case opMVN: // this is a 1's complement: NOT - if (Op2 < AMODE_REG) { // op2 is reg # in this case - mMips->NOR(Rd, Op2, 0); // NOT is NOR with 0 - break; - } else if (Op2 == AMODE_IMM) { - if (amode.value > 0xffff) { - mMips->LUI(Rd, (amode.value >> 16)); - if (amode.value & 0x0000ffff) { - mMips->ORI(Rd, Rd, (amode.value & 0x0000ffff)); - } - } else { - mMips->ORI(Rd, 0, amode.value); - } - } else if (Op2 == AMODE_REG_IMM) { - switch (amode.stype) { - case LSL: mMips->SLL(Rd, amode.reg, amode.value); break; - case LSR: mMips->SRL(Rd, amode.reg, amode.value); break; - case ASR: mMips->SRA(Rd, amode.reg, amode.value); break; - case ROR: mMips->ROTR(Rd, amode.reg, amode.value); break; - } - } - else { - // adr mode RRX is not used in GGL Assembler at this time - mMips->UNIMPL(); - } - mMips->NOR(Rd, Rd, 0); // NOT is NOR with 0 - break; - - case opCMP: - // Either operand of a CMP instr could get overwritten by a subsequent - // conditional instruction, which is ok, _UNLESS_ there is a _second_ - // conditional instruction. Under MIPS, this requires doing the comparison - // again (SLT), and the original operands must be available. (and this - // pattern of multiple conditional instructions from same CMP _is_ used - // in GGL-Assembler) - // - // For now, if a conditional instr overwrites the operands, we will - // move them to dedicated temp regs. This is ugly, and inefficient, - // and should be optimized. - // - // WARNING: making an _Assumption_ that CMP operand regs will NOT be - // trashed by intervening NON-conditional instructions. In the general - // case this is legal, but it is NOT currently done in GGL-Assembler. - - cond.type = CMP_COND; - cond.r1 = Rn; - if (dataProcAdrModes(Op2, src, false, R_cmp2) == SRC_REG) { - cond.r2 = src; - } else { // adr mode was SRC_IMM - mMips->ORI(R_cmp2, R_zero, src); - cond.r2 = R_cmp2; - } - - break; - - - case opTST: - case opTEQ: - case opCMN: - case opADC: - case opSBC: - case opRSC: - mMips->UNIMPL(); // currently unused in GGL Assembler code - break; - } - - if (cc != AL) { - mMips->label(cond.label[cond.labelnum]); - } - if (s && opcode != opCMP) { - cond.type = SBIT_COND; - cond.r1 = Rd; - } -} - - - -#if 0 -#pragma mark - -#pragma mark Multiply... -#endif - -// multiply, accumulate -void ArmToMips64Assembler::MLA(int cc __unused, int s, - int Rd, int Rm, int Rs, int Rn) { - - //ALOGW("MLA"); - mArmPC[mInum++] = pc(); // save starting PC for this instr - - mMips->MUL(R_at, Rm, Rs); - mMips->ADDU(Rd, R_at, Rn); - if (s) { - cond.type = SBIT_COND; - cond.r1 = Rd; - } -} - -void ArmToMips64Assembler::MUL(int cc __unused, int s, - int Rd, int Rm, int Rs) { - mArmPC[mInum++] = pc(); - mMips->MUL(Rd, Rm, Rs); - if (s) { - cond.type = SBIT_COND; - cond.r1 = Rd; - } -} - -void ArmToMips64Assembler::UMULL(int cc __unused, int s, - int RdLo, int RdHi, int Rm, int Rs) { - mArmPC[mInum++] = pc(); - mMips->MUH(RdHi, Rm, Rs); - mMips->MUL(RdLo, Rm, Rs); - - if (s) { - cond.type = SBIT_COND; - cond.r1 = RdHi; // BUG... - LOG_ALWAYS_FATAL("Condition on UMULL must be on 64-bit result\n"); - } -} - -void ArmToMips64Assembler::UMUAL(int cc __unused, int s, - int RdLo __unused, int RdHi, int Rm __unused, int Rs __unused) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "UMUAL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - // *mPC++ = (cc<<28) | (1<<23) | (1<<21) | (s<<20) | - // (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); - if (s) { - cond.type = SBIT_COND; - cond.r1 = RdHi; // BUG... - LOG_ALWAYS_FATAL("Condition on UMULL must be on 64-bit result\n"); - } -} - -void ArmToMips64Assembler::SMULL(int cc __unused, int s, - int RdLo __unused, int RdHi, int Rm __unused, int Rs __unused) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "SMULL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - // *mPC++ = (cc<<28) | (1<<23) | (1<<22) | (s<<20) | - // (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); - if (s) { - cond.type = SBIT_COND; - cond.r1 = RdHi; // BUG... - LOG_ALWAYS_FATAL("Condition on SMULL must be on 64-bit result\n"); - } -} -void ArmToMips64Assembler::SMUAL(int cc __unused, int s, - int RdLo __unused, int RdHi, int Rm __unused, int Rs __unused) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "SMUAL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - // *mPC++ = (cc<<28) | (1<<23) | (1<<22) | (1<<21) | (s<<20) | - // (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); - if (s) { - cond.type = SBIT_COND; - cond.r1 = RdHi; // BUG... - LOG_ALWAYS_FATAL("Condition on SMUAL must be on 64-bit result\n"); - } -} - - - -#if 0 -#pragma mark - -#pragma mark Branches... -#endif - -// branches... - -void ArmToMips64Assembler::B(int cc, const char* label) -{ - mArmPC[mInum++] = pc(); - if (cond.type == SBIT_COND) { cond.r2 = R_zero; } - - switch(cc) { - case EQ: mMips->BEQ(cond.r1, cond.r2, label); break; - case NE: mMips->BNE(cond.r1, cond.r2, label); break; - case HS: mMips->BGEU(cond.r1, cond.r2, label); break; - case LO: mMips->BLTU(cond.r1, cond.r2, label); break; - case MI: mMips->BLT(cond.r1, cond.r2, label); break; - case PL: mMips->BGE(cond.r1, cond.r2, label); break; - - case HI: mMips->BGTU(cond.r1, cond.r2, label); break; - case LS: mMips->BLEU(cond.r1, cond.r2, label); break; - case GE: mMips->BGE(cond.r1, cond.r2, label); break; - case LT: mMips->BLT(cond.r1, cond.r2, label); break; - case GT: mMips->BGT(cond.r1, cond.r2, label); break; - case LE: mMips->BLE(cond.r1, cond.r2, label); break; - case AL: mMips->B(label); break; - case NV: /* B Never - no instruction */ break; - - case VS: - case VC: - default: - LOG_ALWAYS_FATAL("Unsupported cc: %02x\n", cc); - break; - } -} - -void ArmToMips64Assembler::BL(int cc __unused, const char* label __unused) -{ - LOG_ALWAYS_FATAL("branch-and-link not supported yet\n"); - mArmPC[mInum++] = pc(); -} - -// no use for Branches with integer PC, but they're in the Interface class .... -void ArmToMips64Assembler::B(int cc __unused, uint32_t* to_pc __unused) -{ - LOG_ALWAYS_FATAL("branch to absolute PC not supported, use Label\n"); - mArmPC[mInum++] = pc(); -} - -void ArmToMips64Assembler::BL(int cc __unused, uint32_t* to_pc __unused) -{ - LOG_ALWAYS_FATAL("branch to absolute PC not supported, use Label\n"); - mArmPC[mInum++] = pc(); -} - -void ArmToMips64Assembler::BX(int cc __unused, int Rn __unused) -{ - LOG_ALWAYS_FATAL("branch to absolute PC not supported, use Label\n"); - mArmPC[mInum++] = pc(); -} - - - -#if 0 -#pragma mark - -#pragma mark Data Transfer... -#endif - -// data transfer... -void ArmToMips64Assembler::LDR(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - if (Rn == ARMAssemblerInterface::SP) { - Rn = R_sp; // convert LDR via Arm SP to LW via Mips SP - } - mMips->LW(Rd, Rn, amode.value); - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - mMips->DADDIU(Rn, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - if (Rn == ARMAssemblerInterface::SP) { - Rn = R_sp; // convert STR thru Arm SP to STR thru Mips SP - } - mMips->LW(Rd, Rn, 0); - mMips->DADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->DADDU(R_at, Rn, amode.reg); - mMips->LW(Rd, R_at, 0); - break; - } -} - -void ArmToMips64Assembler::LDRB(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - mMips->LBU(Rd, Rn, amode.value); - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - mMips->DADDIU(Rn, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - mMips->LBU(Rd, Rn, 0); - mMips->DADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->DADDU(R_at, Rn, amode.reg); - mMips->LBU(Rd, R_at, 0); - break; - } - -} - -void ArmToMips64Assembler::STR(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - if (Rn == ARMAssemblerInterface::SP) { - Rn = R_sp; // convert STR thru Arm SP to SW thru Mips SP - } - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - // If we will writeback, then update the index reg, then store. - // This correctly handles stack-push case. - mMips->DADDIU(Rn, Rn, amode.value); - mMips->SW(Rd, Rn, 0); - } else { - // No writeback so store offset by value - mMips->SW(Rd, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - mMips->SW(Rd, Rn, 0); - mMips->DADDIU(Rn, Rn, amode.value); // post index always writes back - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->DADDU(R_at, Rn, amode.reg); - mMips->SW(Rd, R_at, 0); - break; - } -} - -void ArmToMips64Assembler::STRB(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - mMips->SB(Rd, Rn, amode.value); - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - mMips->DADDIU(Rn, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - mMips->SB(Rd, Rn, 0); - mMips->DADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->DADDU(R_at, Rn, amode.reg); - mMips->SB(Rd, R_at, 0); - break; - } -} - -void ArmToMips64Assembler::LDRH(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed8_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - // fall thru to next case .... - case AMODE_IMM_8_PRE: // no support yet for writeback - mMips->LHU(Rd, Rn, amode.value); - break; - case AMODE_IMM_8_POST: - mMips->LHU(Rd, Rn, 0); - mMips->DADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_PRE: - // we only support simple base +/- index - if (amode.reg >= 0) { - mMips->DADDU(R_at, Rn, amode.reg); - } else { - mMips->DSUBU(R_at, Rn, abs(amode.reg)); - } - mMips->LHU(Rd, R_at, 0); - break; - } -} - -void ArmToMips64Assembler::LDRSB(int cc __unused, int Rd __unused, - int Rn __unused, uint32_t offset __unused) -{ - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::LDRSH(int cc __unused, int Rd __unused, - int Rn __unused, uint32_t offset __unused) -{ - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::STRH(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed8_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - // fall thru to next case .... - case AMODE_IMM_8_PRE: // no support yet for writeback - mMips->SH(Rd, Rn, amode.value); - break; - case AMODE_IMM_8_POST: - mMips->SH(Rd, Rn, 0); - mMips->DADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_PRE: - // we only support simple base +/- index - if (amode.reg >= 0) { - mMips->DADDU(R_at, Rn, amode.reg); - } else { - mMips->DSUBU(R_at, Rn, abs(amode.reg)); - } - mMips->SH(Rd, R_at, 0); - break; - } -} - - - -#if 0 -#pragma mark - -#pragma mark Block Data Transfer... -#endif - -// block data transfer... -void ArmToMips64Assembler::LDM(int cc __unused, int dir __unused, - int Rn __unused, int W __unused, uint32_t reg_list __unused) -{ // ED FD EA FA IB IA DB DA - // const uint8_t P[8] = { 1, 0, 1, 0, 1, 0, 1, 0 }; - // const uint8_t U[8] = { 1, 1, 0, 0, 1, 1, 0, 0 }; - // *mPC++ = (cc<<28) | (4<<25) | (uint32_t(P[dir])<<24) | - // (uint32_t(U[dir])<<23) | (1<<20) | (W<<21) | (Rn<<16) | reg_list; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::STM(int cc __unused, int dir __unused, - int Rn __unused, int W __unused, uint32_t reg_list __unused) -{ // FA EA FD ED IB IA DB DA - // const uint8_t P[8] = { 0, 1, 0, 1, 1, 0, 1, 0 }; - // const uint8_t U[8] = { 0, 0, 1, 1, 1, 1, 0, 0 }; - // *mPC++ = (cc<<28) | (4<<25) | (uint32_t(P[dir])<<24) | - // (uint32_t(U[dir])<<23) | (0<<20) | (W<<21) | (Rn<<16) | reg_list; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - - - -#if 0 -#pragma mark - -#pragma mark Special... -#endif - -// special... -void ArmToMips64Assembler::SWP(int cc __unused, int Rn __unused, - int Rd __unused, int Rm __unused) { - // *mPC++ = (cc<<28) | (2<<23) | (Rn<<16) | (Rd << 12) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::SWPB(int cc __unused, int Rn __unused, - int Rd __unused, int Rm __unused) { - // *mPC++ = (cc<<28) | (2<<23) | (1<<22) | (Rn<<16) | (Rd << 12) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::SWI(int cc __unused, uint32_t comment __unused) { - // *mPC++ = (cc<<28) | (0xF<<24) | comment; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - - -#if 0 -#pragma mark - -#pragma mark DSP instructions... -#endif - -// DSP instructions... -void ArmToMips64Assembler::PLD(int Rn __unused, uint32_t offset) { - LOG_ALWAYS_FATAL_IF(!((offset&(1<<24)) && !(offset&(1<<21))), - "PLD only P=1, W=0"); - // *mPC++ = 0xF550F000 | (Rn<<16) | offset; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::CLZ(int cc __unused, int Rd, int Rm) -{ - mArmPC[mInum++] = pc(); - mMips->CLZ(Rd, Rm); -} - -void ArmToMips64Assembler::QADD(int cc __unused, int Rd __unused, - int Rm __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1000050 | (Rn<<16) | (Rd<<12) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::QDADD(int cc __unused, int Rd __unused, - int Rm __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1400050 | (Rn<<16) | (Rd<<12) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::QSUB(int cc __unused, int Rd __unused, - int Rm __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1200050 | (Rn<<16) | (Rd<<12) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::QDSUB(int cc __unused, int Rd __unused, - int Rm __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1600050 | (Rn<<16) | (Rd<<12) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -// 16 x 16 signed multiply (like SMLAxx without the accumulate) -void ArmToMips64Assembler::SMUL(int cc __unused, int xy, - int Rd, int Rm, int Rs) -{ - mArmPC[mInum++] = pc(); - - // the 16 bits may be in the top or bottom half of 32-bit source reg, - // as defined by the codes BB, BT, TB, TT (compressed param xy) - // where x corresponds to Rm and y to Rs - - // select half-reg for Rm - if (xy & xyTB) { - // use top 16-bits - mMips->SRA(R_at, Rm, 16); - } else { - // use bottom 16, but sign-extend to 32 - mMips->SEH(R_at, Rm); - } - // select half-reg for Rs - if (xy & xyBT) { - // use top 16-bits - mMips->SRA(R_at2, Rs, 16); - } else { - // use bottom 16, but sign-extend to 32 - mMips->SEH(R_at2, Rs); - } - mMips->MUL(Rd, R_at, R_at2); -} - -// signed 32b x 16b multiple, save top 32-bits of 48-bit result -void ArmToMips64Assembler::SMULW(int cc __unused, int y, - int Rd, int Rm, int Rs) -{ - mArmPC[mInum++] = pc(); - - // the selector yT or yB refers to reg Rs - if (y & yT) { - // zero the bottom 16-bits, with 2 shifts, it can affect result - mMips->SRL(R_at, Rs, 16); - mMips->SLL(R_at, R_at, 16); - - } else { - // move low 16-bit half, to high half - mMips->SLL(R_at, Rs, 16); - } - mMips->MUH(Rd, Rm, R_at); -} - -// 16 x 16 signed multiply, accumulate: Rd = Rm{16} * Rs{16} + Rn -void ArmToMips64Assembler::SMLA(int cc __unused, int xy, - int Rd, int Rm, int Rs, int Rn) -{ - mArmPC[mInum++] = pc(); - - // the 16 bits may be in the top or bottom half of 32-bit source reg, - // as defined by the codes BB, BT, TB, TT (compressed param xy) - // where x corresponds to Rm and y to Rs - - // select half-reg for Rm - if (xy & xyTB) { - // use top 16-bits - mMips->SRA(R_at, Rm, 16); - } else { - // use bottom 16, but sign-extend to 32 - mMips->SEH(R_at, Rm); - } - // select half-reg for Rs - if (xy & xyBT) { - // use top 16-bits - mMips->SRA(R_at2, Rs, 16); - } else { - // use bottom 16, but sign-extend to 32 - mMips->SEH(R_at2, Rs); - } - - mMips->MUL(R_at, R_at, R_at2); - mMips->ADDU(Rd, R_at, Rn); -} - -void ArmToMips64Assembler::SMLAL(int cc __unused, int xy __unused, - int RdHi __unused, int RdLo __unused, - int Rs __unused, int Rm __unused) -{ - // *mPC++ = (cc<<28) | 0x1400080 | (RdHi<<16) | (RdLo<<12) | (Rs<<8) | (xy<<4) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMips64Assembler::SMLAW(int cc __unused, int y __unused, - int Rd __unused, int Rm __unused, - int Rs __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1200080 | (Rd<<16) | (Rn<<12) | (Rs<<8) | (y<<4) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -// used by ARMv6 version of GGLAssembler::filter32 -void ArmToMips64Assembler::UXTB16(int cc __unused, int Rd, int Rm, int rotate) -{ - mArmPC[mInum++] = pc(); - - //Rd[31:16] := ZeroExtend((Rm ROR (8 * sh))[23:16]), - //Rd[15:0] := ZeroExtend((Rm ROR (8 * sh))[7:0]). sh 0-3. - - mMips->ROTR(R_at2, Rm, rotate * 8); - mMips->LUI(R_at, 0xFF); - mMips->ORI(R_at, R_at, 0xFF); - mMips->AND(Rd, R_at2, R_at); -} - -void ArmToMips64Assembler::UBFX(int cc __unused, int Rd __unused, int Rn __unused, - int lsb __unused, int width __unused) -{ - /* Placeholder for UBFX */ - mArmPC[mInum++] = pc(); - - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -// ---------------------------------------------------------------------------- -// Address Processing... -// ---------------------------------------------------------------------------- - -void ArmToMips64Assembler::ADDR_ADD(int cc, - int s, int Rd, int Rn, uint32_t Op2) -{ -// if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required -// if(s != 0) { NOT_IMPLEMENTED(); return;} //Not required - dataProcessing(opADD64, cc, s, Rd, Rn, Op2); -} - -void ArmToMips64Assembler::ADDR_SUB(int cc, - int s, int Rd, int Rn, uint32_t Op2) -{ -// if(cc != AL){ NOT_IMPLEMENTED(); return;} //Not required -// if(s != 0) { NOT_IMPLEMENTED(); return;} //Not required - dataProcessing(opSUB64, cc, s, Rd, Rn, Op2); -} - -void ArmToMips64Assembler::ADDR_LDR(int cc __unused, int Rd, - int Rn, uint32_t offset) { - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - if (Rn == ARMAssemblerInterface::SP) { - Rn = R_sp; // convert LDR via Arm SP to LW via Mips SP - } - mMips->LD(Rd, Rn, amode.value); - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - mMips->DADDIU(Rn, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - if (Rn == ARMAssemblerInterface::SP) { - Rn = R_sp; // convert STR thru Arm SP to STR thru Mips SP - } - mMips->LD(Rd, Rn, 0); - mMips->DADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->DADDU(R_at, Rn, amode.reg); - mMips->LD(Rd, R_at, 0); - break; - } -} - -void ArmToMips64Assembler::ADDR_STR(int cc __unused, int Rd, - int Rn, uint32_t offset) { - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - if (Rn == ARMAssemblerInterface::SP) { - Rn = R_sp; // convert STR thru Arm SP to SW thru Mips SP - } - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - // If we will writeback, then update the index reg, then store. - // This correctly handles stack-push case. - mMips->DADDIU(Rn, Rn, amode.value); - mMips->SD(Rd, Rn, 0); - } else { - // No writeback so store offset by value - mMips->SD(Rd, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - mMips->SD(Rd, Rn, 0); - mMips->DADDIU(Rn, Rn, amode.value); // post index always writes back - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->DADDU(R_at, Rn, amode.reg); - mMips->SD(Rd, R_at, 0); - break; - } -} - -#if 0 -#pragma mark - -#pragma mark MIPS Assembler... -#endif - - -//************************************************************************** -//************************************************************************** -//************************************************************************** - - -/* MIPS64 assembler -** this is a subset of mips64r6, targeted specifically at ARM instruction -** replacement in the pixelflinger/codeflinger code. -** -** This class is extended from MIPSAssembler class and overrides only -** MIPS64r6 specific stuff. -*/ - -MIPS64Assembler::MIPS64Assembler(const sp& assembly, ArmToMips64Assembler *parent) - : MIPSAssembler::MIPSAssembler(assembly, NULL), mParent(parent) -{ -} - -MIPS64Assembler::MIPS64Assembler(void* assembly, ArmToMips64Assembler *parent) - : MIPSAssembler::MIPSAssembler(assembly), mParent(parent) -{ -} - -MIPS64Assembler::~MIPS64Assembler() -{ -} - -void MIPS64Assembler::reset() -{ - if (mAssembly != NULL) { - mBase = mPC = (uint32_t *)mAssembly->base(); - } else { - mPC = mBase = base(); - } - mBranchTargets.clear(); - mLabels.clear(); - mLabelsInverseMapping.clear(); - mComments.clear(); -} - - -void MIPS64Assembler::disassemble(const char* name __unused) -{ - char di_buf[140]; - - bool arm_disasm_fmt = (mParent->mArmDisassemblyBuffer == NULL) ? false : true; - - typedef char dstr[40]; - dstr *lines = (dstr *)mParent->mArmDisassemblyBuffer; - - if (mParent->mArmDisassemblyBuffer != NULL) { - for (int i=0; imArmInstrCount; ++i) { - string_detab(lines[i]); - } - } - - size_t count = pc()-base(); - uint32_t* mipsPC = base(); - - while (count--) { - ssize_t label = mLabelsInverseMapping.indexOfKey(mipsPC); - if (label >= 0) { - ALOGW("%s:\n", mLabelsInverseMapping.valueAt(label)); - } - ssize_t comment = mComments.indexOfKey(mipsPC); - if (comment >= 0) { - ALOGW("; %s\n", mComments.valueAt(comment)); - } - ::mips_disassem(mipsPC, di_buf, arm_disasm_fmt); - string_detab(di_buf); - string_pad(di_buf, 30); - ALOGW("%08lx: %08x %s", uintptr_t(mipsPC), uint32_t(*mipsPC), di_buf); - mipsPC++; - } -} - -void MIPS64Assembler::fix_branches() -{ - // fixup all the branches - size_t count = mBranchTargets.size(); - while (count--) { - const branch_target_t& bt = mBranchTargets[count]; - uint32_t* target_pc = mLabels.valueFor(bt.label); - LOG_ALWAYS_FATAL_IF(!target_pc, - "error resolving branch targets, target_pc is null"); - int32_t offset = int32_t(target_pc - (bt.pc+1)); - *bt.pc |= offset & 0x00FFFF; - } -} - -void MIPS64Assembler::DADDU(int Rd, int Rs, int Rt) -{ - *mPC++ = (spec_op< -#include - -#include "utils/KeyedVector.h" -#include "utils/Vector.h" -#include "tinyutils/smartpointer.h" - -#include "ARMAssemblerInterface.h" -#include "MIPSAssembler.h" -#include "CodeCache.h" - -namespace android { - -class MIPS64Assembler; // forward reference - -// this class mimics ARMAssembler interface -// intent is to translate each ARM instruction to 1 or more MIPS instr -// implementation calls MIPS64Assembler class to generate mips code -class ArmToMips64Assembler : public ARMAssemblerInterface -{ -public: - ArmToMips64Assembler(const sp& assembly, - char *abuf = 0, int linesz = 0, int instr_count = 0); - ArmToMips64Assembler(void* assembly); - virtual ~ArmToMips64Assembler(); - - uint32_t* base() const; - uint32_t* pc() const; - void disassemble(const char* name); - - virtual void reset(); - - virtual int generate(const char* name); - virtual int getCodegenArch(); - - virtual void prolog(); - virtual void epilog(uint32_t touched); - virtual void comment(const char* string); - // for testing purposes - void fix_branches(); - void set_condition(int mode, int R1, int R2); - - - // ----------------------------------------------------------------------- - // shifters and addressing modes - // ----------------------------------------------------------------------- - - // shifters... - virtual bool isValidImmediate(uint32_t immed); - virtual int buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm); - - virtual uint32_t imm(uint32_t immediate); - virtual uint32_t reg_imm(int Rm, int type, uint32_t shift); - virtual uint32_t reg_rrx(int Rm); - virtual uint32_t reg_reg(int Rm, int type, int Rs); - - // addressing modes... - // LDR(B)/STR(B)/PLD - // (immediate and Rm can be negative, which indicates U=0) - virtual uint32_t immed12_pre(int32_t immed12, int W=0); - virtual uint32_t immed12_post(int32_t immed12); - virtual uint32_t reg_scale_pre(int Rm, int type=0, uint32_t shift=0, int W=0); - virtual uint32_t reg_scale_post(int Rm, int type=0, uint32_t shift=0); - - // LDRH/LDRSB/LDRSH/STRH - // (immediate and Rm can be negative, which indicates U=0) - virtual uint32_t immed8_pre(int32_t immed8, int W=0); - virtual uint32_t immed8_post(int32_t immed8); - virtual uint32_t reg_pre(int Rm, int W=0); - virtual uint32_t reg_post(int Rm); - - - - - virtual void dataProcessing(int opcode, int cc, int s, - int Rd, int Rn, - uint32_t Op2); - virtual void MLA(int cc, int s, - int Rd, int Rm, int Rs, int Rn); - virtual void MUL(int cc, int s, - int Rd, int Rm, int Rs); - virtual void UMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void UMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - - virtual void B(int cc, uint32_t* pc); - virtual void BL(int cc, uint32_t* pc); - virtual void BX(int cc, int Rn); - virtual void label(const char* theLabel); - virtual void B(int cc, const char* label); - virtual void BL(int cc, const char* label); - - virtual uint32_t* pcForLabel(const char* label); - - virtual void LDR (int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRB(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void STR (int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void STRB(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRH (int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRSB(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRSH(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void STRH (int cc, int Rd, - int Rn, uint32_t offset = 0); - - virtual void LDM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - virtual void STM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - - virtual void SWP(int cc, int Rn, int Rd, int Rm); - virtual void SWPB(int cc, int Rn, int Rd, int Rm); - virtual void SWI(int cc, uint32_t comment); - - virtual void PLD(int Rn, uint32_t offset); - virtual void CLZ(int cc, int Rd, int Rm); - virtual void QADD(int cc, int Rd, int Rm, int Rn); - virtual void QDADD(int cc, int Rd, int Rm, int Rn); - virtual void QSUB(int cc, int Rd, int Rm, int Rn); - virtual void QDSUB(int cc, int Rd, int Rm, int Rn); - virtual void SMUL(int cc, int xy, - int Rd, int Rm, int Rs); - virtual void SMULW(int cc, int y, - int Rd, int Rm, int Rs); - virtual void SMLA(int cc, int xy, - int Rd, int Rm, int Rs, int Rn); - virtual void SMLAL(int cc, int xy, - int RdHi, int RdLo, int Rs, int Rm); - virtual void SMLAW(int cc, int y, - int Rd, int Rm, int Rs, int Rn); - - // byte/half word extract... - virtual void UXTB16(int cc, int Rd, int Rm, int rotate); - - // bit manipulation... - virtual void UBFX(int cc, int Rd, int Rn, int lsb, int width); - - // Address loading/storing/manipulation - virtual void ADDR_LDR(int cc, int Rd, int Rn, uint32_t offset = __immed12_pre(0)); - virtual void ADDR_STR(int cc, int Rd, int Rn, uint32_t offset = __immed12_pre(0)); - virtual void ADDR_ADD(int cc, int s, int Rd, int Rn, uint32_t Op2); - virtual void ADDR_SUB(int cc, int s, int Rd, int Rn, uint32_t Op2); - - // this is some crap to share is MIPS64Assembler class for debug - char * mArmDisassemblyBuffer; - int mArmLineLength; - int mArmInstrCount; - - int mInum; // current arm instuction number (0..n) - uint32_t** mArmPC; // array: PC for 1st mips instr of - // each translated ARM instr - - -private: - ArmToMips64Assembler(const ArmToMips64Assembler& rhs); - ArmToMips64Assembler& operator = (const ArmToMips64Assembler& rhs); - - void init_conditional_labels(void); - - void protectConditionalOperands(int Rd); - - // reg__tmp set to MIPS AT, reg 1 - int dataProcAdrModes(int op, int& source, bool sign = false, int reg_tmp = 1); - - sp mAssembly; - MIPS64Assembler* mMips; - - - enum misc_constants_t { - ARM_MAX_INSTUCTIONS = 512 // based on ASSEMBLY_SCRATCH_SIZE - }; - - enum { - SRC_REG = 0, - SRC_IMM, - SRC_ERROR = -1 - }; - - enum addr_modes { - // start above the range of legal mips reg #'s (0-31) - AMODE_REG = 0x20, - AMODE_IMM, AMODE_REG_IMM, // for data processing - AMODE_IMM_12_PRE, AMODE_IMM_12_POST, // for load/store - AMODE_REG_SCALE_PRE, AMODE_IMM_8_PRE, - AMODE_IMM_8_POST, AMODE_REG_PRE, - AMODE_UNSUPPORTED - }; - - struct addr_mode_t { // address modes for current ARM instruction - int reg; - int stype; - uint32_t value; - bool writeback; // writeback the adr reg after modification - } amode; - - enum cond_types { - CMP_COND = 1, - SBIT_COND - }; - - struct cond_mode_t { // conditional-execution info for current ARM instruction - cond_types type; - int r1; - int r2; - int labelnum; - char label[100][10]; - } cond; -}; - - - - -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- - -// This is the basic MIPS64 assembler, which just creates the opcodes in memory. -// All the more complicated work is done in ArmToMips64Assember above. -// Inherits MIPSAssembler class, and overrides only MIPS64r6 specific stuff - -class MIPS64Assembler : public MIPSAssembler -{ -public: - MIPS64Assembler(const sp& assembly, ArmToMips64Assembler *parent); - MIPS64Assembler(void* assembly, ArmToMips64Assembler *parent); - virtual ~MIPS64Assembler(); - - virtual void reset(); - virtual void disassemble(const char* name); - - void fix_branches(); - - // ------------------------------------------------------------------------ - // MIPS64AssemblerInterface... - // ------------------------------------------------------------------------ - -#if 0 -#pragma mark - -#pragma mark Arithmetic... -#endif - - void DADDU(int Rd, int Rs, int Rt); - void DADDIU(int Rt, int Rs, int16_t imm); - void DSUBU(int Rd, int Rs, int Rt); - void DSUBIU(int Rt, int Rs, int16_t imm); - virtual void MUL(int Rd, int Rs, int Rt); - void MUH(int Rd, int Rs, int Rt); - -#if 0 -#pragma mark - -#pragma mark Logical... -#endif - - virtual void CLO(int Rd, int Rs); - virtual void CLZ(int Rd, int Rs); - -#if 0 -#pragma mark - -#pragma mark Load/store... -#endif - - void LD(int Rt, int Rbase, int16_t offset); - void SD(int Rt, int Rbase, int16_t offset); - virtual void LUI(int Rt, int16_t offset); - -#if 0 -#pragma mark - -#pragma mark Branch... -#endif - - void JR(int Rs); - - -protected: - ArmToMips64Assembler *mParent; - - // opcode field of all instructions - enum opcode_field { - spec_op, regimm_op, j_op, jal_op, // 0x00 - 0x03 - beq_op, bne_op, pop06_op, pop07_op, // 0x04 - 0x07 - pop10_op, addiu_op, slti_op, sltiu_op, // 0x08 - 0x0b - andi_op, ori_op, xori_op, aui_op, // 0x0c - 0x0f - cop0_op, cop1_op, cop2_op, rsrv_opc_0, // 0x10 - 0x13 - rsrv_opc_1, rsrv_opc_2, pop26_op, pop27_op, // 0x14 - 0x17 - pop30_op, daddiu_op, rsrv_opc_3, rsrv_opc_4, // 0x18 - 0x1b - rsrv_opc_5, daui_op, msa_op, spec3_op, // 0x1c - 0x1f - lb_op, lh_op, rsrv_opc_6, lw_op, // 0x20 - 0x23 - lbu_op, lhu_op, rsrv_opc_7, lwu_op, // 0x24 - 0x27 - sb_op, sh_op, rsrv_opc_8, sw_op, // 0x28 - 0x2b - rsrv_opc_9, rsrv_opc_10, rsrv_opc_11, rsrv_opc_12, // 0x2c - 0x2f - rsrv_opc_13, lwc1_op, bc_op, rsrv_opc_14, // 0x2c - 0x2f - rsrv_opc_15, ldc1_op, pop66_op, ld_op, // 0x30 - 0x33 - rsrv_opc_16, swc1_op, balc_op, pcrel_op, // 0x34 - 0x37 - rsrv_opc_17, sdc1_op, pop76_op, sd_op // 0x38 - 0x3b - }; - - - // func field for special opcode - enum func_spec_op { - sll_fn, rsrv_spec_0, srl_fn, sra_fn, - sllv_fn, lsa_fn, srlv_fn, srav_fn, - rsrv_spec_1, jalr_fn, rsrv_spec_2, rsrv_spec_3, - syscall_fn, break_fn, sdbbp_fn, sync_fn, - clz_fn, clo_fn, dclz_fn, dclo_fn, - dsllv_fn, dlsa_fn, dsrlv_fn, dsrav_fn, - sop30_fn, sop31_fn, sop32_fn, sop33_fn, - sop34_fn, sop35_fn, sop36_fn, sop37_fn, - add_fn, addu_fn, sub_fn, subu_fn, - and_fn, or_fn, xor_fn, nor_fn, - rsrv_spec_4, rsrv_spec_5, slt_fn, sltu_fn, - dadd_fn, daddu_fn, dsub_fn, dsubu_fn, - tge_fn, tgeu_fn, tlt_fn, tltu_fn, - teq_fn, seleqz_fn, tne_fn, selnez_fn, - dsll_fn, rsrv_spec_6, dsrl_fn, dsra_fn, - dsll32_fn, rsrv_spec_7, dsrl32_fn, dsra32_fn - }; - - // func field for spec3 opcode - enum func_spec3_op { - ext_fn, dextm_fn, dextu_fn, dext_fn, - ins_fn, dinsm_fn, dinsu_fn, dins_fn, - cachee_fn = 0x1b, sbe_fn, she_fn, sce_fn, swe_fn, - bshfl_fn, prefe_fn = 0x23, dbshfl_fn, cache_fn, sc_fn, scd_fn, - lbue_fn, lhue_fn, lbe_fn = 0x2c, lhe_fn, lle_fn, lwe_fn, - pref_fn = 0x35, ll_fn, lld_fn, rdhwr_fn = 0x3b - }; - - // sa field for spec3 opcodes, with BSHFL function - enum func_spec3_bshfl { - bitswap_fn, - wsbh_fn = 0x02, - dshd_fn = 0x05, - seb_fn = 0x10, - seh_fn = 0x18 - }; - - // rt field of regimm opcodes. - enum regimm_fn { - bltz_fn, bgez_fn, - dahi_fn = 0x6, - nal_fn = 0x10, bal_fn, bltzall_fn, bgezall_fn, - sigrie_fn = 0x17, - dati_fn = 0x1e, synci_fn - }; - - enum muldiv_fn { - mul_fn = 0x02, muh_fn - }; - - enum mips_inst_shifts { - OP_SHF = 26, - JTARGET_SHF = 0, - RS_SHF = 21, - RT_SHF = 16, - RD_SHF = 11, - RE_SHF = 6, - SA_SHF = RE_SHF, // synonym - IMM_SHF = 0, - FUNC_SHF = 0, - - // mask values - MSK_16 = 0xffff, - - - CACHEOP_SHF = 18, - CACHESEL_SHF = 16, - }; -}; - - -}; // namespace android - -#endif //ANDROID_MIPS64ASSEMBLER_H diff --git a/libpixelflinger/codeflinger/MIPSAssembler.cpp b/libpixelflinger/codeflinger/MIPSAssembler.cpp deleted file mode 100644 index 7de8cc11e..000000000 --- a/libpixelflinger/codeflinger/MIPSAssembler.cpp +++ /dev/null @@ -1,1955 +0,0 @@ -/* libs/pixelflinger/codeflinger/MIPSAssembler.cpp -** -** Copyright 2012, 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. -*/ - - -/* MIPS assembler and ARM->MIPS assembly translator -** -** The approach is to leave the GGLAssembler and associated files largely -** un-changed, still utilizing all Arm instruction generation. Via the -** ArmToMipsAssembler (subclassed from ArmAssemblerInterface) each Arm -** instruction is translated to one or more Mips instructions as necessary. This -** is clearly less efficient than a direct implementation within the -** GGLAssembler, but is far cleaner, more maintainable, and has yielded very -** significant performance gains on Mips compared to the generic pixel pipeline. -** -** -** GGLAssembler changes -** -** - The register allocator has been modified to re-map Arm registers 0-15 to mips -** registers 2-17. Mips register 0 cannot be used as general-purpose register, -** and register 1 has traditional uses as a short-term temporary. -** -** - Added some early bailouts for OUT_OF_REGISTERS in texturing.cpp and -** GGLAssembler.cpp, since this is not fatal, and can be retried at lower -** optimization level. -** -** -** ARMAssembler and ARMAssemblerInterface changes -** -** Refactored ARM address-mode static functions (imm(), reg_imm(), imm12_pre(), etc.) -** to virtual, so they can be overridden in MIPSAssembler. The implementation of these -** functions on ARM is moved from ARMAssemblerInterface.cpp to ARMAssembler.cpp, and -** is unchanged from the original. (This required duplicating 2 of these as static -** functions in ARMAssemblerInterface.cpp so they could be used as static initializers). -*/ - -#define LOG_TAG "MIPSAssembler" - -#include -#include -#include - -#include -#include -#include - -#include "CodeCache.h" -#include "MIPSAssembler.h" -#include "mips_disassem.h" - -#define __unused __attribute__((__unused__)) - -// Choose MIPS arch variant following gcc flags -#if defined(__mips__) && __mips==32 && __mips_isa_rev>=2 -#define mips32r2 1 -#else -#define mips32r2 0 -#endif - - -#define NOT_IMPLEMENTED() LOG_ALWAYS_FATAL("Arm instruction %s not yet implemented\n", __func__) - - - -// ---------------------------------------------------------------------------- - -namespace android { - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark ArmToMipsAssembler... -#endif - -ArmToMipsAssembler::ArmToMipsAssembler(const sp& assembly, - char *abuf, int linesz, int instr_count) - : ARMAssemblerInterface(), - mArmDisassemblyBuffer(abuf), - mArmLineLength(linesz), - mArmInstrCount(instr_count), - mInum(0), - mAssembly(assembly) -{ - mMips = new MIPSAssembler(assembly, this); - mArmPC = (uint32_t **) malloc(ARM_MAX_INSTUCTIONS * sizeof(uint32_t *)); - init_conditional_labels(); -} - -ArmToMipsAssembler::~ArmToMipsAssembler() -{ - delete mMips; - free((void *) mArmPC); -} - -uint32_t* ArmToMipsAssembler::pc() const -{ - return mMips->pc(); -} - -uint32_t* ArmToMipsAssembler::base() const -{ - return mMips->base(); -} - -void ArmToMipsAssembler::reset() -{ - cond.labelnum = 0; - mInum = 0; - mMips->reset(); -} - -int ArmToMipsAssembler::getCodegenArch() -{ - return CODEGEN_ARCH_MIPS; -} - -void ArmToMipsAssembler::comment(const char* string) -{ - mMips->comment(string); -} - -void ArmToMipsAssembler::label(const char* theLabel) -{ - mMips->label(theLabel); -} - -void ArmToMipsAssembler::disassemble(const char* name) -{ - mMips->disassemble(name); -} - -void ArmToMipsAssembler::init_conditional_labels() -{ - int i; - for (i=0;i<99; ++i) { - sprintf(cond.label[i], "cond_%d", i); - } -} - - - -#if 0 -#pragma mark - -#pragma mark Prolog/Epilog & Generate... -#endif - -void ArmToMipsAssembler::prolog() -{ - mArmPC[mInum++] = pc(); // save starting PC for this instr - - mMips->ADDIU(R_sp, R_sp, -(5 * 4)); - mMips->SW(R_s0, R_sp, 0); - mMips->SW(R_s1, R_sp, 4); - mMips->SW(R_s2, R_sp, 8); - mMips->SW(R_s3, R_sp, 12); - mMips->SW(R_s4, R_sp, 16); - mMips->MOVE(R_v0, R_a0); // move context * passed in a0 to v0 (arm r0) -} - -void ArmToMipsAssembler::epilog(uint32_t touched __unused) -{ - mArmPC[mInum++] = pc(); // save starting PC for this instr - - mMips->LW(R_s0, R_sp, 0); - mMips->LW(R_s1, R_sp, 4); - mMips->LW(R_s2, R_sp, 8); - mMips->LW(R_s3, R_sp, 12); - mMips->LW(R_s4, R_sp, 16); - mMips->ADDIU(R_sp, R_sp, (5 * 4)); - mMips->JR(R_ra); - -} - -int ArmToMipsAssembler::generate(const char* name) -{ - return mMips->generate(name); -} - -uint32_t* ArmToMipsAssembler::pcForLabel(const char* label) -{ - return mMips->pcForLabel(label); -} - - - -//---------------------------------------------------------- - -#if 0 -#pragma mark - -#pragma mark Addressing modes & shifters... -#endif - - -// do not need this for MIPS, but it is in the Interface (virtual) -int ArmToMipsAssembler::buildImmediate( - uint32_t immediate, uint32_t& rot, uint32_t& imm) -{ - // for MIPS, any 32-bit immediate is OK - rot = 0; - imm = immediate; - return 0; -} - -// shifters... - -bool ArmToMipsAssembler::isValidImmediate(uint32_t immediate __unused) -{ - // for MIPS, any 32-bit immediate is OK - return true; -} - -uint32_t ArmToMipsAssembler::imm(uint32_t immediate) -{ - // ALOGW("immediate value %08x at pc %08x\n", immediate, (int)pc()); - amode.value = immediate; - return AMODE_IMM; -} - -uint32_t ArmToMipsAssembler::reg_imm(int Rm, int type, uint32_t shift) -{ - amode.reg = Rm; - amode.stype = type; - amode.value = shift; - return AMODE_REG_IMM; -} - -uint32_t ArmToMipsAssembler::reg_rrx(int Rm __unused) -{ - // reg_rrx mode is not used in the GLLAssember code at this time - return AMODE_UNSUPPORTED; -} - -uint32_t ArmToMipsAssembler::reg_reg(int Rm __unused, int type __unused, - int Rs __unused) -{ - // reg_reg mode is not used in the GLLAssember code at this time - return AMODE_UNSUPPORTED; -} - - -// addressing modes... -// LDR(B)/STR(B)/PLD (immediate and Rm can be negative, which indicate U=0) -uint32_t ArmToMipsAssembler::immed12_pre(int32_t immed12, int W) -{ - LOG_ALWAYS_FATAL_IF(abs(immed12) >= 0x800, - "LDR(B)/STR(B)/PLD immediate too big (%08x)", - immed12); - amode.value = immed12; - amode.writeback = W; - return AMODE_IMM_12_PRE; -} - -uint32_t ArmToMipsAssembler::immed12_post(int32_t immed12) -{ - LOG_ALWAYS_FATAL_IF(abs(immed12) >= 0x800, - "LDR(B)/STR(B)/PLD immediate too big (%08x)", - immed12); - - amode.value = immed12; - return AMODE_IMM_12_POST; -} - -uint32_t ArmToMipsAssembler::reg_scale_pre(int Rm, int type, - uint32_t shift, int W) -{ - LOG_ALWAYS_FATAL_IF(W | type | shift, "reg_scale_pre adv modes not yet implemented"); - - amode.reg = Rm; - // amode.stype = type; // more advanced modes not used in GGLAssembler yet - // amode.value = shift; - // amode.writeback = W; - return AMODE_REG_SCALE_PRE; -} - -uint32_t ArmToMipsAssembler::reg_scale_post(int Rm __unused, int type __unused, - uint32_t shift __unused) -{ - LOG_ALWAYS_FATAL("adr mode reg_scale_post not yet implemented\n"); - return AMODE_UNSUPPORTED; -} - -// LDRH/LDRSB/LDRSH/STRH (immediate and Rm can be negative, which indicate U=0) -uint32_t ArmToMipsAssembler::immed8_pre(int32_t immed8, int W __unused) -{ - // uint32_t offset = abs(immed8); - - LOG_ALWAYS_FATAL("adr mode immed8_pre not yet implemented\n"); - - LOG_ALWAYS_FATAL_IF(abs(immed8) >= 0x100, - "LDRH/LDRSB/LDRSH/STRH immediate too big (%08x)", - immed8); - return AMODE_IMM_8_PRE; -} - -uint32_t ArmToMipsAssembler::immed8_post(int32_t immed8) -{ - // uint32_t offset = abs(immed8); - - LOG_ALWAYS_FATAL_IF(abs(immed8) >= 0x100, - "LDRH/LDRSB/LDRSH/STRH immediate too big (%08x)", - immed8); - amode.value = immed8; - return AMODE_IMM_8_POST; -} - -uint32_t ArmToMipsAssembler::reg_pre(int Rm, int W) -{ - LOG_ALWAYS_FATAL_IF(W, "reg_pre writeback not yet implemented"); - amode.reg = Rm; - return AMODE_REG_PRE; -} - -uint32_t ArmToMipsAssembler::reg_post(int Rm __unused) -{ - LOG_ALWAYS_FATAL("adr mode reg_post not yet implemented\n"); - return AMODE_UNSUPPORTED; -} - - - -// ---------------------------------------------------------------------------- - -#if 0 -#pragma mark - -#pragma mark Data Processing... -#endif - -// check if the operand registers from a previous CMP or S-bit instruction -// would be overwritten by this instruction. If so, move the value to a -// safe register. -// Note that we cannot tell at _this_ instruction time if a future (conditional) -// instruction will _also_ use this value (a defect of the simple 1-pass, one- -// instruction-at-a-time translation). Therefore we must be conservative and -// save the value before it is overwritten. This costs an extra MOVE instr. - -void ArmToMipsAssembler::protectConditionalOperands(int Rd) -{ - if (Rd == cond.r1) { - mMips->MOVE(R_cmp, cond.r1); - cond.r1 = R_cmp; - } - if (cond.type == CMP_COND && Rd == cond.r2) { - mMips->MOVE(R_cmp2, cond.r2); - cond.r2 = R_cmp2; - } -} - - -// interprets the addressing mode, and generates the common code -// used by the majority of data-processing ops. Many MIPS instructions -// have a register-based form and a different immediate form. See -// opAND below for an example. (this could be inlined) -// -// this works with the imm(), reg_imm() methods above, which are directly -// called by the GLLAssembler. -// note: _signed parameter defaults to false (un-signed) -// note: tmpReg parameter defaults to 1, MIPS register AT -int ArmToMipsAssembler::dataProcAdrModes(int op, int& source, bool _signed, int tmpReg) -{ - if (op < AMODE_REG) { - source = op; - return SRC_REG; - } else if (op == AMODE_IMM) { - if ((!_signed && amode.value > 0xffff) - || (_signed && ((int)amode.value < -32768 || (int)amode.value > 32767) )) { - mMips->LUI(tmpReg, (amode.value >> 16)); - if (amode.value & 0x0000ffff) { - mMips->ORI(tmpReg, tmpReg, (amode.value & 0x0000ffff)); - } - source = tmpReg; - return SRC_REG; - } else { - source = amode.value; - return SRC_IMM; - } - } else if (op == AMODE_REG_IMM) { - switch (amode.stype) { - case LSL: mMips->SLL(tmpReg, amode.reg, amode.value); break; - case LSR: mMips->SRL(tmpReg, amode.reg, amode.value); break; - case ASR: mMips->SRA(tmpReg, amode.reg, amode.value); break; - case ROR: if (mips32r2) { - mMips->ROTR(tmpReg, amode.reg, amode.value); - } else { - mMips->RORIsyn(tmpReg, amode.reg, amode.value); - } - break; - } - source = tmpReg; - return SRC_REG; - } else { // adr mode RRX is not used in GGL Assembler at this time - // we are screwed, this should be exception, assert-fail or something - LOG_ALWAYS_FATAL("adr mode reg_rrx not yet implemented\n"); - return SRC_ERROR; - } -} - - -void ArmToMipsAssembler::dataProcessing(int opcode, int cc, - int s, int Rd, int Rn, uint32_t Op2) -{ - int src; // src is modified by dataProcAdrModes() - passed as int& - - - if (cc != AL) { - protectConditionalOperands(Rd); - // the branch tests register(s) set by prev CMP or instr with 'S' bit set - // inverse the condition to jump past this conditional instruction - ArmToMipsAssembler::B(cc^1, cond.label[++cond.labelnum]); - } else { - mArmPC[mInum++] = pc(); // save starting PC for this instr - } - - switch (opcode) { - case opAND: - if (dataProcAdrModes(Op2, src) == SRC_REG) { - mMips->AND(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->ANDI(Rd, Rn, src); - } - break; - - case opADD: - // set "signed" to true for adr modes - if (dataProcAdrModes(Op2, src, true) == SRC_REG) { - mMips->ADDU(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->ADDIU(Rd, Rn, src); - } - break; - - case opSUB: - // set "signed" to true for adr modes - if (dataProcAdrModes(Op2, src, true) == SRC_REG) { - mMips->SUBU(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->SUBIU(Rd, Rn, src); - } - break; - - case opEOR: - if (dataProcAdrModes(Op2, src) == SRC_REG) { - mMips->XOR(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->XORI(Rd, Rn, src); - } - break; - - case opORR: - if (dataProcAdrModes(Op2, src) == SRC_REG) { - mMips->OR(Rd, Rn, src); - } else { // adr mode was SRC_IMM - mMips->ORI(Rd, Rn, src); - } - break; - - case opBIC: - if (dataProcAdrModes(Op2, src) == SRC_IMM) { - // if we are 16-bit imnmediate, load to AT reg - mMips->ORI(R_at, 0, src); - src = R_at; - } - mMips->NOT(R_at, src); - mMips->AND(Rd, Rn, R_at); - break; - - case opRSB: - if (dataProcAdrModes(Op2, src) == SRC_IMM) { - // if we are 16-bit imnmediate, load to AT reg - mMips->ORI(R_at, 0, src); - src = R_at; - } - mMips->SUBU(Rd, src, Rn); // subu with the parameters reversed - break; - - case opMOV: - if (Op2 < AMODE_REG) { // op2 is reg # in this case - mMips->MOVE(Rd, Op2); - } else if (Op2 == AMODE_IMM) { - if (amode.value > 0xffff) { - mMips->LUI(Rd, (amode.value >> 16)); - if (amode.value & 0x0000ffff) { - mMips->ORI(Rd, Rd, (amode.value & 0x0000ffff)); - } - } else { - mMips->ORI(Rd, 0, amode.value); - } - } else if (Op2 == AMODE_REG_IMM) { - switch (amode.stype) { - case LSL: mMips->SLL(Rd, amode.reg, amode.value); break; - case LSR: mMips->SRL(Rd, amode.reg, amode.value); break; - case ASR: mMips->SRA(Rd, amode.reg, amode.value); break; - case ROR: if (mips32r2) { - mMips->ROTR(Rd, amode.reg, amode.value); - } else { - mMips->RORIsyn(Rd, amode.reg, amode.value); - } - break; - } - } - else { - // adr mode RRX is not used in GGL Assembler at this time - mMips->UNIMPL(); - } - break; - - case opMVN: // this is a 1's complement: NOT - if (Op2 < AMODE_REG) { // op2 is reg # in this case - mMips->NOR(Rd, Op2, 0); // NOT is NOR with 0 - break; - } else if (Op2 == AMODE_IMM) { - if (amode.value > 0xffff) { - mMips->LUI(Rd, (amode.value >> 16)); - if (amode.value & 0x0000ffff) { - mMips->ORI(Rd, Rd, (amode.value & 0x0000ffff)); - } - } else { - mMips->ORI(Rd, 0, amode.value); - } - } else if (Op2 == AMODE_REG_IMM) { - switch (amode.stype) { - case LSL: mMips->SLL(Rd, amode.reg, amode.value); break; - case LSR: mMips->SRL(Rd, amode.reg, amode.value); break; - case ASR: mMips->SRA(Rd, amode.reg, amode.value); break; - case ROR: if (mips32r2) { - mMips->ROTR(Rd, amode.reg, amode.value); - } else { - mMips->RORIsyn(Rd, amode.reg, amode.value); - } - break; - } - } - else { - // adr mode RRX is not used in GGL Assembler at this time - mMips->UNIMPL(); - } - mMips->NOR(Rd, Rd, 0); // NOT is NOR with 0 - break; - - case opCMP: - // Either operand of a CMP instr could get overwritten by a subsequent - // conditional instruction, which is ok, _UNLESS_ there is a _second_ - // conditional instruction. Under MIPS, this requires doing the comparison - // again (SLT), and the original operands must be available. (and this - // pattern of multiple conditional instructions from same CMP _is_ used - // in GGL-Assembler) - // - // For now, if a conditional instr overwrites the operands, we will - // move them to dedicated temp regs. This is ugly, and inefficient, - // and should be optimized. - // - // WARNING: making an _Assumption_ that CMP operand regs will NOT be - // trashed by intervening NON-conditional instructions. In the general - // case this is legal, but it is NOT currently done in GGL-Assembler. - - cond.type = CMP_COND; - cond.r1 = Rn; - if (dataProcAdrModes(Op2, src, false, R_cmp2) == SRC_REG) { - cond.r2 = src; - } else { // adr mode was SRC_IMM - mMips->ORI(R_cmp2, R_zero, src); - cond.r2 = R_cmp2; - } - - break; - - - case opTST: - case opTEQ: - case opCMN: - case opADC: - case opSBC: - case opRSC: - mMips->UNIMPL(); // currently unused in GGL Assembler code - break; - } - - if (cc != AL) { - mMips->label(cond.label[cond.labelnum]); - } - if (s && opcode != opCMP) { - cond.type = SBIT_COND; - cond.r1 = Rd; - } -} - - - -#if 0 -#pragma mark - -#pragma mark Multiply... -#endif - -// multiply, accumulate -void ArmToMipsAssembler::MLA(int cc __unused, int s, - int Rd, int Rm, int Rs, int Rn) { - - mArmPC[mInum++] = pc(); // save starting PC for this instr - - mMips->MUL(R_at, Rm, Rs); - mMips->ADDU(Rd, R_at, Rn); - if (s) { - cond.type = SBIT_COND; - cond.r1 = Rd; - } -} - -void ArmToMipsAssembler::MUL(int cc __unused, int s, - int Rd, int Rm, int Rs) { - mArmPC[mInum++] = pc(); - mMips->MUL(Rd, Rm, Rs); - if (s) { - cond.type = SBIT_COND; - cond.r1 = Rd; - } -} - -void ArmToMipsAssembler::UMULL(int cc __unused, int s, - int RdLo, int RdHi, int Rm, int Rs) { - mArmPC[mInum++] = pc(); - mMips->MULT(Rm, Rs); - mMips->MFHI(RdHi); - mMips->MFLO(RdLo); - if (s) { - cond.type = SBIT_COND; - cond.r1 = RdHi; // BUG... - LOG_ALWAYS_FATAL("Condition on UMULL must be on 64-bit result\n"); - } -} - -void ArmToMipsAssembler::UMUAL(int cc __unused, int s, - int RdLo __unused, int RdHi, int Rm __unused, int Rs __unused) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "UMUAL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - // *mPC++ = (cc<<28) | (1<<23) | (1<<21) | (s<<20) | - // (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); - if (s) { - cond.type = SBIT_COND; - cond.r1 = RdHi; // BUG... - LOG_ALWAYS_FATAL("Condition on UMULL must be on 64-bit result\n"); - } -} - -void ArmToMipsAssembler::SMULL(int cc __unused, int s, - int RdLo __unused, int RdHi, int Rm __unused, int Rs __unused) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "SMULL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - // *mPC++ = (cc<<28) | (1<<23) | (1<<22) | (s<<20) | - // (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); - if (s) { - cond.type = SBIT_COND; - cond.r1 = RdHi; // BUG... - LOG_ALWAYS_FATAL("Condition on SMULL must be on 64-bit result\n"); - } -} -void ArmToMipsAssembler::SMUAL(int cc __unused, int s, - int RdLo __unused, int RdHi, int Rm __unused, int Rs __unused) { - LOG_FATAL_IF(RdLo==Rm || RdHi==Rm || RdLo==RdHi, - "SMUAL(r%u,r%u,r%u,r%u)", RdLo,RdHi,Rm,Rs); - // *mPC++ = (cc<<28) | (1<<23) | (1<<22) | (1<<21) | (s<<20) | - // (RdHi<<16) | (RdLo<<12) | (Rs<<8) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); - if (s) { - cond.type = SBIT_COND; - cond.r1 = RdHi; // BUG... - LOG_ALWAYS_FATAL("Condition on SMUAL must be on 64-bit result\n"); - } -} - - - -#if 0 -#pragma mark - -#pragma mark Branches... -#endif - -// branches... - -void ArmToMipsAssembler::B(int cc, const char* label) -{ - mArmPC[mInum++] = pc(); - if (cond.type == SBIT_COND) { cond.r2 = R_zero; } - - switch(cc) { - case EQ: mMips->BEQ(cond.r1, cond.r2, label); break; - case NE: mMips->BNE(cond.r1, cond.r2, label); break; - case HS: mMips->BGEU(cond.r1, cond.r2, label); break; - case LO: mMips->BLTU(cond.r1, cond.r2, label); break; - case MI: mMips->BLT(cond.r1, cond.r2, label); break; - case PL: mMips->BGE(cond.r1, cond.r2, label); break; - - case HI: mMips->BGTU(cond.r1, cond.r2, label); break; - case LS: mMips->BLEU(cond.r1, cond.r2, label); break; - case GE: mMips->BGE(cond.r1, cond.r2, label); break; - case LT: mMips->BLT(cond.r1, cond.r2, label); break; - case GT: mMips->BGT(cond.r1, cond.r2, label); break; - case LE: mMips->BLE(cond.r1, cond.r2, label); break; - case AL: mMips->B(label); break; - case NV: /* B Never - no instruction */ break; - - case VS: - case VC: - default: - LOG_ALWAYS_FATAL("Unsupported cc: %02x\n", cc); - break; - } -} - -void ArmToMipsAssembler::BL(int cc __unused, const char* label __unused) -{ - LOG_ALWAYS_FATAL("branch-and-link not supported yet\n"); - mArmPC[mInum++] = pc(); -} - -// no use for Branches with integer PC, but they're in the Interface class .... -void ArmToMipsAssembler::B(int cc __unused, uint32_t* to_pc __unused) -{ - LOG_ALWAYS_FATAL("branch to absolute PC not supported, use Label\n"); - mArmPC[mInum++] = pc(); -} - -void ArmToMipsAssembler::BL(int cc __unused, uint32_t* to_pc __unused) -{ - LOG_ALWAYS_FATAL("branch to absolute PC not supported, use Label\n"); - mArmPC[mInum++] = pc(); -} - -void ArmToMipsAssembler::BX(int cc __unused, int Rn __unused) -{ - LOG_ALWAYS_FATAL("branch to absolute PC not supported, use Label\n"); - mArmPC[mInum++] = pc(); -} - - - -#if 0 -#pragma mark - -#pragma mark Data Transfer... -#endif - -// data transfer... -void ArmToMipsAssembler::LDR(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - if (Rn == ARMAssemblerInterface::SP) { - Rn = R_sp; // convert LDR via Arm SP to LW via Mips SP - } - mMips->LW(Rd, Rn, amode.value); - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - mMips->ADDIU(Rn, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - if (Rn == ARMAssemblerInterface::SP) { - Rn = R_sp; // convert STR thru Arm SP to STR thru Mips SP - } - mMips->LW(Rd, Rn, 0); - mMips->ADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->ADDU(R_at, Rn, amode.reg); - mMips->LW(Rd, R_at, 0); - break; - } -} - -void ArmToMipsAssembler::LDRB(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - mMips->LBU(Rd, Rn, amode.value); - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - mMips->ADDIU(Rn, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - mMips->LBU(Rd, Rn, 0); - mMips->ADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->ADDU(R_at, Rn, amode.reg); - mMips->LBU(Rd, R_at, 0); - break; - } - -} - -void ArmToMipsAssembler::STR(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - if (Rn == ARMAssemblerInterface::SP) { - Rn = R_sp; // convert STR thru Arm SP to SW thru Mips SP - } - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - // If we will writeback, then update the index reg, then store. - // This correctly handles stack-push case. - mMips->ADDIU(Rn, Rn, amode.value); - mMips->SW(Rd, Rn, 0); - } else { - // No writeback so store offset by value - mMips->SW(Rd, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - mMips->SW(Rd, Rn, 0); - mMips->ADDIU(Rn, Rn, amode.value); // post index always writes back - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->ADDU(R_at, Rn, amode.reg); - mMips->SW(Rd, R_at, 0); - break; - } -} - -void ArmToMipsAssembler::STRB(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed12_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - amode.writeback = 0; - // fall thru to next case .... - case AMODE_IMM_12_PRE: - mMips->SB(Rd, Rn, amode.value); - if (amode.writeback) { // OPTIONAL writeback on pre-index mode - mMips->ADDIU(Rn, Rn, amode.value); - } - break; - case AMODE_IMM_12_POST: - mMips->SB(Rd, Rn, 0); - mMips->ADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_SCALE_PRE: - // we only support simple base + index, no advanced modes for this one yet - mMips->ADDU(R_at, Rn, amode.reg); - mMips->SB(Rd, R_at, 0); - break; - } -} - -void ArmToMipsAssembler::LDRH(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed8_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - // fall thru to next case .... - case AMODE_IMM_8_PRE: // no support yet for writeback - mMips->LHU(Rd, Rn, amode.value); - break; - case AMODE_IMM_8_POST: - mMips->LHU(Rd, Rn, 0); - mMips->ADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_PRE: - // we only support simple base +/- index - if (amode.reg >= 0) { - mMips->ADDU(R_at, Rn, amode.reg); - } else { - mMips->SUBU(R_at, Rn, abs(amode.reg)); - } - mMips->LHU(Rd, R_at, 0); - break; - } -} - -void ArmToMipsAssembler::LDRSB(int cc __unused, int Rd __unused, - int Rn __unused, uint32_t offset __unused) -{ - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::LDRSH(int cc __unused, int Rd __unused, - int Rn __unused, uint32_t offset __unused) -{ - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::STRH(int cc __unused, int Rd, int Rn, uint32_t offset) -{ - mArmPC[mInum++] = pc(); - // work-around for ARM default address mode of immed8_pre(0) - if (offset > AMODE_UNSUPPORTED) offset = 0; - switch (offset) { - case 0: - amode.value = 0; - // fall thru to next case .... - case AMODE_IMM_8_PRE: // no support yet for writeback - mMips->SH(Rd, Rn, amode.value); - break; - case AMODE_IMM_8_POST: - mMips->SH(Rd, Rn, 0); - mMips->ADDIU(Rn, Rn, amode.value); - break; - case AMODE_REG_PRE: - // we only support simple base +/- index - if (amode.reg >= 0) { - mMips->ADDU(R_at, Rn, amode.reg); - } else { - mMips->SUBU(R_at, Rn, abs(amode.reg)); - } - mMips->SH(Rd, R_at, 0); - break; - } -} - - - -#if 0 -#pragma mark - -#pragma mark Block Data Transfer... -#endif - -// block data transfer... -void ArmToMipsAssembler::LDM(int cc __unused, int dir __unused, - int Rn __unused, int W __unused, uint32_t reg_list __unused) -{ // ED FD EA FA IB IA DB DA - // const uint8_t P[8] = { 1, 0, 1, 0, 1, 0, 1, 0 }; - // const uint8_t U[8] = { 1, 1, 0, 0, 1, 1, 0, 0 }; - // *mPC++ = (cc<<28) | (4<<25) | (uint32_t(P[dir])<<24) | - // (uint32_t(U[dir])<<23) | (1<<20) | (W<<21) | (Rn<<16) | reg_list; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::STM(int cc __unused, int dir __unused, - int Rn __unused, int W __unused, uint32_t reg_list __unused) -{ // FA EA FD ED IB IA DB DA - // const uint8_t P[8] = { 0, 1, 0, 1, 1, 0, 1, 0 }; - // const uint8_t U[8] = { 0, 0, 1, 1, 1, 1, 0, 0 }; - // *mPC++ = (cc<<28) | (4<<25) | (uint32_t(P[dir])<<24) | - // (uint32_t(U[dir])<<23) | (0<<20) | (W<<21) | (Rn<<16) | reg_list; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - - - -#if 0 -#pragma mark - -#pragma mark Special... -#endif - -// special... -void ArmToMipsAssembler::SWP(int cc __unused, int Rn __unused, - int Rd __unused, int Rm __unused) { - // *mPC++ = (cc<<28) | (2<<23) | (Rn<<16) | (Rd << 12) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::SWPB(int cc __unused, int Rn __unused, - int Rd __unused, int Rm __unused) { - // *mPC++ = (cc<<28) | (2<<23) | (1<<22) | (Rn<<16) | (Rd << 12) | 0x90 | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::SWI(int cc __unused, uint32_t comment __unused) { - // *mPC++ = (cc<<28) | (0xF<<24) | comment; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - - -#if 0 -#pragma mark - -#pragma mark DSP instructions... -#endif - -// DSP instructions... -void ArmToMipsAssembler::PLD(int Rn __unused, uint32_t offset) { - LOG_ALWAYS_FATAL_IF(!((offset&(1<<24)) && !(offset&(1<<21))), - "PLD only P=1, W=0"); - // *mPC++ = 0xF550F000 | (Rn<<16) | offset; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::CLZ(int cc __unused, int Rd, int Rm) -{ - mArmPC[mInum++] = pc(); - mMips->CLZ(Rd, Rm); -} - -void ArmToMipsAssembler::QADD(int cc __unused, int Rd __unused, - int Rm __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1000050 | (Rn<<16) | (Rd<<12) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::QDADD(int cc __unused, int Rd __unused, - int Rm __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1400050 | (Rn<<16) | (Rd<<12) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::QSUB(int cc __unused, int Rd __unused, - int Rm __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1200050 | (Rn<<16) | (Rd<<12) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::QDSUB(int cc __unused, int Rd __unused, - int Rm __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1600050 | (Rn<<16) | (Rd<<12) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -// 16 x 16 signed multiply (like SMLAxx without the accumulate) -void ArmToMipsAssembler::SMUL(int cc __unused, int xy, - int Rd, int Rm, int Rs) -{ - mArmPC[mInum++] = pc(); - - // the 16 bits may be in the top or bottom half of 32-bit source reg, - // as defined by the codes BB, BT, TB, TT (compressed param xy) - // where x corresponds to Rm and y to Rs - - // select half-reg for Rm - if (xy & xyTB) { - // use top 16-bits - mMips->SRA(R_at, Rm, 16); - } else { - // use bottom 16, but sign-extend to 32 - if (mips32r2) { - mMips->SEH(R_at, Rm); - } else { - mMips->SLL(R_at, Rm, 16); - mMips->SRA(R_at, R_at, 16); - } - } - // select half-reg for Rs - if (xy & xyBT) { - // use top 16-bits - mMips->SRA(R_at2, Rs, 16); - } else { - // use bottom 16, but sign-extend to 32 - if (mips32r2) { - mMips->SEH(R_at2, Rs); - } else { - mMips->SLL(R_at2, Rs, 16); - mMips->SRA(R_at2, R_at2, 16); - } - } - mMips->MUL(Rd, R_at, R_at2); -} - -// signed 32b x 16b multiple, save top 32-bits of 48-bit result -void ArmToMipsAssembler::SMULW(int cc __unused, int y, - int Rd, int Rm, int Rs) -{ - mArmPC[mInum++] = pc(); - - // the selector yT or yB refers to reg Rs - if (y & yT) { - // zero the bottom 16-bits, with 2 shifts, it can affect result - mMips->SRL(R_at, Rs, 16); - mMips->SLL(R_at, R_at, 16); - - } else { - // move low 16-bit half, to high half - mMips->SLL(R_at, Rs, 16); - } - mMips->MULT(Rm, R_at); - mMips->MFHI(Rd); -} - -// 16 x 16 signed multiply, accumulate: Rd = Rm{16} * Rs{16} + Rn -void ArmToMipsAssembler::SMLA(int cc __unused, int xy, - int Rd, int Rm, int Rs, int Rn) -{ - mArmPC[mInum++] = pc(); - - // the 16 bits may be in the top or bottom half of 32-bit source reg, - // as defined by the codes BB, BT, TB, TT (compressed param xy) - // where x corresponds to Rm and y to Rs - - // select half-reg for Rm - if (xy & xyTB) { - // use top 16-bits - mMips->SRA(R_at, Rm, 16); - } else { - // use bottom 16, but sign-extend to 32 - if (mips32r2) { - mMips->SEH(R_at, Rm); - } else { - mMips->SLL(R_at, Rm, 16); - mMips->SRA(R_at, R_at, 16); - } - } - // select half-reg for Rs - if (xy & xyBT) { - // use top 16-bits - mMips->SRA(R_at2, Rs, 16); - } else { - // use bottom 16, but sign-extend to 32 - if (mips32r2) { - mMips->SEH(R_at2, Rs); - } else { - mMips->SLL(R_at2, Rs, 16); - mMips->SRA(R_at2, R_at2, 16); - } - } - - mMips->MUL(R_at, R_at, R_at2); - mMips->ADDU(Rd, R_at, Rn); -} - -void ArmToMipsAssembler::SMLAL(int cc __unused, int xy __unused, - int RdHi __unused, int RdLo __unused, - int Rs __unused, int Rm __unused) -{ - // *mPC++ = (cc<<28) | 0x1400080 | (RdHi<<16) | (RdLo<<12) | (Rs<<8) | (xy<<4) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -void ArmToMipsAssembler::SMLAW(int cc __unused, int y __unused, - int Rd __unused, int Rm __unused, - int Rs __unused, int Rn __unused) -{ - // *mPC++ = (cc<<28) | 0x1200080 | (Rd<<16) | (Rn<<12) | (Rs<<8) | (y<<4) | Rm; - mArmPC[mInum++] = pc(); - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - -// used by ARMv6 version of GGLAssembler::filter32 -void ArmToMipsAssembler::UXTB16(int cc __unused, int Rd, int Rm, int rotate) -{ - mArmPC[mInum++] = pc(); - - //Rd[31:16] := ZeroExtend((Rm ROR (8 * sh))[23:16]), - //Rd[15:0] := ZeroExtend((Rm ROR (8 * sh))[7:0]). sh 0-3. - - mMips->ROTR(Rm, Rm, rotate * 8); - mMips->AND(Rd, Rm, 0x00FF00FF); -} - -void ArmToMipsAssembler::UBFX(int cc __unused, int Rd __unused, - int Rn __unused, int lsb __unused, - int width __unused) -{ - /* Placeholder for UBFX */ - mArmPC[mInum++] = pc(); - - mMips->NOP2(); - NOT_IMPLEMENTED(); -} - - - - - -#if 0 -#pragma mark - -#pragma mark MIPS Assembler... -#endif - - -//************************************************************************** -//************************************************************************** -//************************************************************************** - - -/* mips assembler -** this is a subset of mips32r2, targeted specifically at ARM instruction -** replacement in the pixelflinger/codeflinger code. -** -** To that end, there is no need for floating point, or priviledged -** instructions. This all runs in user space, no float. -** -** The syntax makes no attempt to be as complete as the assember, with -** synthetic instructions, and automatic recognition of immedate operands -** (use the immediate form of the instruction), etc. -** -** We start with mips32r1, and may add r2 and dsp extensions if cpu -** supports. Decision will be made at compile time, based on gcc -** options. (makes sense since android will be built for a a specific -** device) -*/ - -MIPSAssembler::MIPSAssembler(const sp& assembly, ArmToMipsAssembler *parent) - : mParent(parent), - mAssembly(assembly) -{ - mBase = mPC = (uint32_t *)assembly->base(); - mDuration = ggl_system_time(); -} - -MIPSAssembler::MIPSAssembler(void* assembly) - : mParent(NULL), mAssembly(NULL) -{ - mBase = mPC = (uint32_t *)assembly; -} - -MIPSAssembler::~MIPSAssembler() -{ -} - - -uint32_t* MIPSAssembler::pc() const -{ - return mPC; -} - -uint32_t* MIPSAssembler::base() const -{ - return mBase; -} - -void MIPSAssembler::reset() -{ - mBase = mPC = (uint32_t *)mAssembly->base(); - mBranchTargets.clear(); - mLabels.clear(); - mLabelsInverseMapping.clear(); - mComments.clear(); -} - - -// convert tabs to spaces, and remove any newline -// works with strings of limited size (makes a temp copy) -#define TABSTOP 8 -void MIPSAssembler::string_detab(char *s) -{ - char *os = s; - char temp[100]; - char *t = temp; - int len = 99; - int i = TABSTOP; - - while (*s && len-- > 0) { - if (*s == '\n') { s++; continue; } - if (*s == '\t') { - s++; - for ( ; i>0; i--) {*t++ = ' '; len--; } - } else { - *t++ = *s++; - } - if (i <= 0) i = TABSTOP; - i--; - } - *t = '\0'; - strcpy(os, temp); -} - -void MIPSAssembler::string_pad(char *s, int padded_len) -{ - int len = strlen(s); - s += len; - for (int i = padded_len - len; i > 0; --i) { - *s++ = ' '; - } - *s = '\0'; -} - -// ---------------------------------------------------------------------------- - -void MIPSAssembler::disassemble(const char* name) -{ - char di_buf[140]; - - if (name) { - ALOGW("%s:\n", name); - } - - bool arm_disasm_fmt = (mParent->mArmDisassemblyBuffer == NULL) ? false : true; - - typedef char dstr[40]; - dstr *lines = (dstr *)mParent->mArmDisassemblyBuffer; - - if (mParent->mArmDisassemblyBuffer != NULL) { - for (int i=0; imArmInstrCount; ++i) { - string_detab(lines[i]); - } - } - - size_t count = pc()-base(); - uint32_t* mipsPC = base(); - while (count--) { - ssize_t label = mLabelsInverseMapping.indexOfKey(mipsPC); - if (label >= 0) { - ALOGW("%s:\n", mLabelsInverseMapping.valueAt(label)); - } - ssize_t comment = mComments.indexOfKey(mipsPC); - if (comment >= 0) { - ALOGW("; %s\n", mComments.valueAt(comment)); - } - // ALOGW("%08x: %08x ", int(i), int(i[0])); - ::mips_disassem(mipsPC, di_buf, arm_disasm_fmt); - string_detab(di_buf); - string_pad(di_buf, 30); - ALOGW("0x%p: %08x %s", mipsPC, uint32_t(*mipsPC), di_buf); - mipsPC++; - } -} - -void MIPSAssembler::comment(const char* string) -{ - mComments.add(pc(), string); -} - -void MIPSAssembler::label(const char* theLabel) -{ - mLabels.add(theLabel, pc()); - mLabelsInverseMapping.add(pc(), theLabel); -} - - -void MIPSAssembler::prolog() -{ - // empty - done in ArmToMipsAssembler -} - -void MIPSAssembler::epilog(uint32_t touched __unused) -{ - // empty - done in ArmToMipsAssembler -} - -int MIPSAssembler::generate(const char* name) -{ - // fixup all the branches - size_t count = mBranchTargets.size(); - while (count--) { - const branch_target_t& bt = mBranchTargets[count]; - uint32_t* target_pc = mLabels.valueFor(bt.label); - LOG_ALWAYS_FATAL_IF(!target_pc, - "error resolving branch targets, target_pc is null"); - int32_t offset = int32_t(target_pc - (bt.pc+1)); - *bt.pc |= offset & 0x00FFFF; - } - - mAssembly->resize( int(pc()-base())*4 ); - - // the instruction & data caches are flushed by CodeCache - const int64_t duration = ggl_system_time() - mDuration; - const char * const format = "generated %s (%d ins) at [%p:%p] in %" PRId64 " ns\n"; - ALOGI(format, name, int(pc()-base()), base(), pc(), duration); - - char value[PROPERTY_VALUE_MAX]; - value[0] = '\0'; - - property_get("debug.pf.disasm", value, "0"); - - if (atoi(value) != 0) { - disassemble(name); - } - - return OK; -} - -uint32_t* MIPSAssembler::pcForLabel(const char* label) -{ - return mLabels.valueFor(label); -} - - - -#if 0 -#pragma mark - -#pragma mark Arithmetic... -#endif - -void MIPSAssembler::ADDU(int Rd, int Rs, int Rt) -{ - *mPC++ = (spec_op<> rot | s << (32-rot) - MIPSAssembler::SLL(R_at2, Rt, 32-rot); - MIPSAssembler::SRL(Rd, Rt, rot); - MIPSAssembler::OR(Rd, Rd, R_at2); -} - -void MIPSAssembler::CLO(int Rd, int Rs) -{ - // Rt field must have same gpr # as Rd - *mPC++ = (spec2_op< -#include - -#include "tinyutils/smartpointer.h" -#include "utils/KeyedVector.h" -#include "utils/Vector.h" - -#include "ARMAssemblerInterface.h" -#include "CodeCache.h" - -namespace android { - -class MIPSAssembler; // forward reference - -// this class mimics ARMAssembler interface -// intent is to translate each ARM instruction to 1 or more MIPS instr -// implementation calls MIPSAssembler class to generate mips code -class ArmToMipsAssembler : public ARMAssemblerInterface -{ -public: - ArmToMipsAssembler(const sp& assembly, - char *abuf = 0, int linesz = 0, int instr_count = 0); - virtual ~ArmToMipsAssembler(); - - uint32_t* base() const; - uint32_t* pc() const; - void disassemble(const char* name); - - virtual void reset(); - - virtual int generate(const char* name); - virtual int getCodegenArch(); - - virtual void prolog(); - virtual void epilog(uint32_t touched); - virtual void comment(const char* string); - - - // ----------------------------------------------------------------------- - // shifters and addressing modes - // ----------------------------------------------------------------------- - - // shifters... - virtual bool isValidImmediate(uint32_t immed); - virtual int buildImmediate(uint32_t i, uint32_t& rot, uint32_t& imm); - - virtual uint32_t imm(uint32_t immediate); - virtual uint32_t reg_imm(int Rm, int type, uint32_t shift); - virtual uint32_t reg_rrx(int Rm); - virtual uint32_t reg_reg(int Rm, int type, int Rs); - - // addressing modes... - // LDR(B)/STR(B)/PLD - // (immediate and Rm can be negative, which indicates U=0) - virtual uint32_t immed12_pre(int32_t immed12, int W=0); - virtual uint32_t immed12_post(int32_t immed12); - virtual uint32_t reg_scale_pre(int Rm, int type=0, uint32_t shift=0, int W=0); - virtual uint32_t reg_scale_post(int Rm, int type=0, uint32_t shift=0); - - // LDRH/LDRSB/LDRSH/STRH - // (immediate and Rm can be negative, which indicates U=0) - virtual uint32_t immed8_pre(int32_t immed8, int W=0); - virtual uint32_t immed8_post(int32_t immed8); - virtual uint32_t reg_pre(int Rm, int W=0); - virtual uint32_t reg_post(int Rm); - - - - - virtual void dataProcessing(int opcode, int cc, int s, - int Rd, int Rn, - uint32_t Op2); - virtual void MLA(int cc, int s, - int Rd, int Rm, int Rs, int Rn); - virtual void MUL(int cc, int s, - int Rd, int Rm, int Rs); - virtual void UMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void UMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMULL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - virtual void SMUAL(int cc, int s, - int RdLo, int RdHi, int Rm, int Rs); - - virtual void B(int cc, uint32_t* pc); - virtual void BL(int cc, uint32_t* pc); - virtual void BX(int cc, int Rn); - virtual void label(const char* theLabel); - virtual void B(int cc, const char* label); - virtual void BL(int cc, const char* label); - - virtual uint32_t* pcForLabel(const char* label); - - virtual void LDR (int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRB(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void STR (int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void STRB(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRH (int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRSB(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void LDRSH(int cc, int Rd, - int Rn, uint32_t offset = 0); - virtual void STRH (int cc, int Rd, - int Rn, uint32_t offset = 0); - - virtual void LDM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - virtual void STM(int cc, int dir, - int Rn, int W, uint32_t reg_list); - - virtual void SWP(int cc, int Rn, int Rd, int Rm); - virtual void SWPB(int cc, int Rn, int Rd, int Rm); - virtual void SWI(int cc, uint32_t comment); - - virtual void PLD(int Rn, uint32_t offset); - virtual void CLZ(int cc, int Rd, int Rm); - virtual void QADD(int cc, int Rd, int Rm, int Rn); - virtual void QDADD(int cc, int Rd, int Rm, int Rn); - virtual void QSUB(int cc, int Rd, int Rm, int Rn); - virtual void QDSUB(int cc, int Rd, int Rm, int Rn); - virtual void SMUL(int cc, int xy, - int Rd, int Rm, int Rs); - virtual void SMULW(int cc, int y, - int Rd, int Rm, int Rs); - virtual void SMLA(int cc, int xy, - int Rd, int Rm, int Rs, int Rn); - virtual void SMLAL(int cc, int xy, - int RdHi, int RdLo, int Rs, int Rm); - virtual void SMLAW(int cc, int y, - int Rd, int Rm, int Rs, int Rn); - - // byte/half word extract... - virtual void UXTB16(int cc, int Rd, int Rm, int rotate); - - // bit manipulation... - virtual void UBFX(int cc, int Rd, int Rn, int lsb, int width); - - // this is some crap to share is MIPSAssembler class for debug - char * mArmDisassemblyBuffer; - int mArmLineLength; - int mArmInstrCount; - - int mInum; // current arm instuction number (0..n) - uint32_t** mArmPC; // array: PC for 1st mips instr of - // each translated ARM instr - - -private: - ArmToMipsAssembler(const ArmToMipsAssembler& rhs); - ArmToMipsAssembler& operator = (const ArmToMipsAssembler& rhs); - - void init_conditional_labels(void); - - void protectConditionalOperands(int Rd); - - // reg__tmp set to MIPS AT, reg 1 - int dataProcAdrModes(int op, int& source, bool sign = false, int reg_tmp = 1); - - sp mAssembly; - MIPSAssembler* mMips; - - - enum misc_constants_t { - ARM_MAX_INSTUCTIONS = 512 // based on ASSEMBLY_SCRATCH_SIZE - }; - - enum { - SRC_REG = 0, - SRC_IMM, - SRC_ERROR = -1 - }; - - enum addr_modes { - // start above the range of legal mips reg #'s (0-31) - AMODE_REG = 0x20, - AMODE_IMM, AMODE_REG_IMM, // for data processing - AMODE_IMM_12_PRE, AMODE_IMM_12_POST, // for load/store - AMODE_REG_SCALE_PRE, AMODE_IMM_8_PRE, - AMODE_IMM_8_POST, AMODE_REG_PRE, - AMODE_UNSUPPORTED - }; - - struct addr_mode_t { // address modes for current ARM instruction - int reg; - int stype; - uint32_t value; - bool writeback; // writeback the adr reg after modification - } amode; - - enum cond_types { - CMP_COND = 1, - SBIT_COND - }; - - struct cond_mode_t { // conditional-execution info for current ARM instruction - cond_types type; - int r1; - int r2; - int labelnum; - char label[100][10]; - } cond; - -}; - - - - -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- - -// This is the basic MIPS assembler, which just creates the opcodes in memory. -// All the more complicated work is done in ArmToMipsAssember above. - -class MIPSAssembler -{ -public: - MIPSAssembler(const sp& assembly, ArmToMipsAssembler *parent); - MIPSAssembler(void* assembly); - virtual ~MIPSAssembler(); - - virtual uint32_t* base() const; - virtual uint32_t* pc() const; - virtual void reset(); - - virtual void disassemble(const char* name); - - virtual void prolog(); - virtual void epilog(uint32_t touched); - virtual int generate(const char* name); - virtual void comment(const char* string); - virtual void label(const char* string); - - // valid only after generate() has been called - virtual uint32_t* pcForLabel(const char* label); - - - // ------------------------------------------------------------------------ - // MIPSAssemblerInterface... - // ------------------------------------------------------------------------ - -#if 0 -#pragma mark - -#pragma mark Arithmetic... -#endif - - void ADDU(int Rd, int Rs, int Rt); - void ADDIU(int Rt, int Rs, int16_t imm); - void SUBU(int Rd, int Rs, int Rt); - void SUBIU(int Rt, int Rs, int16_t imm); - void NEGU(int Rd, int Rs); - void MUL(int Rd, int Rs, int Rt); - void MULT(int Rs, int Rt); // dest is hi,lo - void MULTU(int Rs, int Rt); // dest is hi,lo - void MADD(int Rs, int Rt); // hi,lo = hi,lo + Rs * Rt - void MADDU(int Rs, int Rt); // hi,lo = hi,lo + Rs * Rt - void MSUB(int Rs, int Rt); // hi,lo = hi,lo - Rs * Rt - void MSUBU(int Rs, int Rt); // hi,lo = hi,lo - Rs * Rt - void SEB(int Rd, int Rt); // sign-extend byte (mips32r2) - void SEH(int Rd, int Rt); // sign-extend half-word (mips32r2) - - -#if 0 -#pragma mark - -#pragma mark Comparisons... -#endif - - void SLT(int Rd, int Rs, int Rt); - void SLTI(int Rt, int Rs, int16_t imm); - void SLTU(int Rd, int Rs, int Rt); - void SLTIU(int Rt, int Rs, int16_t imm); - - -#if 0 -#pragma mark - -#pragma mark Logical... -#endif - - void AND(int Rd, int Rs, int Rt); - void ANDI(int Rd, int Rs, uint16_t imm); - void OR(int Rd, int Rs, int Rt); - void ORI(int Rt, int Rs, uint16_t imm); - void NOR(int Rd, int Rs, int Rt); - void NOT(int Rd, int Rs); - void XOR(int Rd, int Rs, int Rt); - void XORI(int Rt, int Rs, uint16_t imm); - - void SLL(int Rd, int Rt, int shft); - void SLLV(int Rd, int Rt, int Rs); - void SRL(int Rd, int Rt, int shft); - void SRLV(int Rd, int Rt, int Rs); - void SRA(int Rd, int Rt, int shft); - void SRAV(int Rd, int Rt, int Rs); - void ROTR(int Rd, int Rt, int shft); // mips32r2 - void ROTRV(int Rd, int Rt, int Rs); // mips32r2 - void RORsyn(int Rd, int Rs, int Rt); // synthetic: d = s rotated by t - void RORIsyn(int Rd, int Rt, int rot); // synthetic: d = s rotated by immed - - void CLO(int Rd, int Rs); - void CLZ(int Rd, int Rs); - void WSBH(int Rd, int Rt); - - -#if 0 -#pragma mark - -#pragma mark Load/store... -#endif - - void LW(int Rt, int Rbase, int16_t offset); - void SW(int Rt, int Rbase, int16_t offset); - void LB(int Rt, int Rbase, int16_t offset); - void LBU(int Rt, int Rbase, int16_t offset); - void SB(int Rt, int Rbase, int16_t offset); - void LH(int Rt, int Rbase, int16_t offset); - void LHU(int Rt, int Rbase, int16_t offset); - void SH(int Rt, int Rbase, int16_t offset); - void LUI(int Rt, int16_t offset); - -#if 0 -#pragma mark - -#pragma mark Register moves... -#endif - - void MOVE(int Rd, int Rs); - void MOVN(int Rd, int Rs, int Rt); - void MOVZ(int Rd, int Rs, int Rt); - void MFHI(int Rd); - void MFLO(int Rd); - void MTHI(int Rs); - void MTLO(int Rs); - -#if 0 -#pragma mark - -#pragma mark Branch... -#endif - - void B(const char* label); - void BEQ(int Rs, int Rt, const char* label); - void BNE(int Rs, int Rt, const char* label); - void BGEZ(int Rs, const char* label); - void BGTZ(int Rs, const char* label); - void BLEZ(int Rs, const char* label); - void BLTZ(int Rs, const char* label); - void JR(int Rs); - - -#if 0 -#pragma mark - -#pragma mark Synthesized Branch... -#endif - - // synthetic variants of above (using slt & friends) - void BEQZ(int Rs, const char* label); - void BNEZ(int Rs, const char* label); - void BGE(int Rs, int Rt, const char* label); - void BGEU(int Rs, int Rt, const char* label); - void BGT(int Rs, int Rt, const char* label); - void BGTU(int Rs, int Rt, const char* label); - void BLE(int Rs, int Rt, const char* label); - void BLEU(int Rs, int Rt, const char* label); - void BLT(int Rs, int Rt, const char* label); - void BLTU(int Rs, int Rt, const char* label); - -#if 0 -#pragma mark - -#pragma mark Misc... -#endif - - void NOP(void); - void NOP2(void); - void UNIMPL(void); - - - - - -protected: - virtual void string_detab(char *s); - virtual void string_pad(char *s, int padded_len); - - ArmToMipsAssembler *mParent; - sp mAssembly; - uint32_t* mBase; - uint32_t* mPC; - uint32_t* mPrologPC; - int64_t mDuration; - - struct branch_target_t { - inline branch_target_t() : label(0), pc(0) { } - inline branch_target_t(const char* l, uint32_t* p) - : label(l), pc(p) { } - const char* label; - uint32_t* pc; - }; - - Vector mBranchTargets; - KeyedVector< const char*, uint32_t* > mLabels; - KeyedVector< uint32_t*, const char* > mLabelsInverseMapping; - KeyedVector< uint32_t*, const char* > mComments; - - - - - // opcode field of all instructions - enum opcode_field { - spec_op, regimm_op, j_op, jal_op, // 00 - beq_op, bne_op, blez_op, bgtz_op, - addi_op, addiu_op, slti_op, sltiu_op, // 08 - andi_op, ori_op, xori_op, lui_op, - cop0_op, cop1_op, cop2_op, cop1x_op, // 10 - beql_op, bnel_op, blezl_op, bgtzl_op, - daddi_op, daddiu_op, ldl_op, ldr_op, // 18 - spec2_op, jalx_op, mdmx_op, spec3_op, - lb_op, lh_op, lwl_op, lw_op, // 20 - lbu_op, lhu_op, lwr_op, lwu_op, - sb_op, sh_op, swl_op, sw_op, // 28 - sdl_op, sdr_op, swr_op, cache_op, - ll_op, lwc1_op, lwc2_op, pref_op, // 30 - lld_op, ldc1_op, ldc2_op, ld_op, - sc_op, swc1_op, swc2_op, rsrv_3b_op, // 38 - scd_op, sdc1_op, sdc2_op, sd_op - }; - - - // func field for special opcode - enum func_spec_op { - sll_fn, movc_fn, srl_fn, sra_fn, // 00 - sllv_fn, pmon_fn, srlv_fn, srav_fn, - jr_fn, jalr_fn, movz_fn, movn_fn, // 08 - syscall_fn, break_fn, spim_fn, sync_fn, - mfhi_fn, mthi_fn, mflo_fn, mtlo_fn, // 10 - dsllv_fn, rsrv_spec_2, dsrlv_fn, dsrav_fn, - mult_fn, multu_fn, div_fn, divu_fn, // 18 - dmult_fn, dmultu_fn, ddiv_fn, ddivu_fn, - add_fn, addu_fn, sub_fn, subu_fn, // 20 - and_fn, or_fn, xor_fn, nor_fn, - rsrv_spec_3, rsrv_spec_4, slt_fn, sltu_fn, // 28 - dadd_fn, daddu_fn, dsub_fn, dsubu_fn, - tge_fn, tgeu_fn, tlt_fn, tltu_fn, // 30 - teq_fn, rsrv_spec_5, tne_fn, rsrv_spec_6, - dsll_fn, rsrv_spec_7, dsrl_fn, dsra_fn, // 38 - dsll32_fn, rsrv_spec_8, dsrl32_fn, dsra32_fn - }; - - // func field for spec2 opcode - enum func_spec2_op { - madd_fn, maddu_fn, mul_fn, rsrv_spec2_3, - msub_fn, msubu_fn, - clz_fn = 0x20, clo_fn, - dclz_fn = 0x24, dclo_fn, - sdbbp_fn = 0x3f - }; - - // func field for spec3 opcode - enum func_spec3_op { - ext_fn, dextm_fn, dextu_fn, dext_fn, - ins_fn, dinsm_fn, dinsu_fn, dins_fn, - bshfl_fn = 0x20, - dbshfl_fn = 0x24, - rdhwr_fn = 0x3b - }; - - // sa field for spec3 opcodes, with BSHFL function - enum func_spec3_bshfl { - wsbh_fn = 0x02, - seb_fn = 0x10, - seh_fn = 0x18 - }; - - // rt field of regimm opcodes. - enum regimm_fn { - bltz_fn, bgez_fn, bltzl_fn, bgezl_fn, - rsrv_ri_fn4, rsrv_ri_fn5, rsrv_ri_fn6, rsrv_ri_fn7, - tgei_fn, tgeiu_fn, tlti_fn, tltiu_fn, - teqi_fn, rsrv_ri_fn_0d, tnei_fn, rsrv_ri_fn0f, - bltzal_fn, bgezal_fn, bltzall_fn, bgezall_fn, - bposge32_fn= 0x1c, - synci_fn = 0x1f - }; - - - // func field for mad opcodes (MIPS IV). - enum mad_func { - madd_fp_op = 0x08, msub_fp_op = 0x0a, - nmadd_fp_op = 0x0c, nmsub_fp_op = 0x0e - }; - - - enum mips_inst_shifts { - OP_SHF = 26, - JTARGET_SHF = 0, - RS_SHF = 21, - RT_SHF = 16, - RD_SHF = 11, - RE_SHF = 6, - SA_SHF = RE_SHF, // synonym - IMM_SHF = 0, - FUNC_SHF = 0, - - // mask values - MSK_16 = 0xffff, - - - CACHEOP_SHF = 18, - CACHESEL_SHF = 16, - }; -}; - -enum mips_regnames { - R_zero = 0, - R_at, R_v0, R_v1, R_a0, R_a1, R_a2, R_a3, -#if __mips_isa_rev < 6 - R_t0, R_t1, R_t2, R_t3, R_t4, R_t5, R_t6, R_t7, -#else - R_a4, R_a5, R_a6, R_a7, R_t0, R_t1, R_t2, R_t3, -#endif - R_s0, R_s1, R_s2, R_s3, R_s4, R_s5, R_s6, R_s7, - R_t8, R_t9, R_k0, R_k1, R_gp, R_sp, R_s8, R_ra, - R_lr = R_s8, - - // arm regs 0-15 are mips regs 2-17 (meaning s0 & s1 are used) - R_at2 = R_s2, // R_at2 = 18 = s2 - R_cmp = R_s3, // R_cmp = 19 = s3 - R_cmp2 = R_s4 // R_cmp2 = 20 = s4 -}; - - - -}; // namespace android - -#endif //ANDROID_MIPSASSEMBLER_H diff --git a/libpixelflinger/codeflinger/armreg.h b/libpixelflinger/codeflinger/armreg.h deleted file mode 100644 index fde81ba89..000000000 --- a/libpixelflinger/codeflinger/armreg.h +++ /dev/null @@ -1,300 +0,0 @@ -/* $NetBSD: armreg.h,v 1.28 2003/10/31 16:30:15 scw Exp $ */ - -/*- - * Copyright (c) 1998, 2001 Ben Harris - * Copyright (c) 1994-1996 Mark Brinicombe. - * Copyright (c) 1994 Brini. - * All rights reserved. - * - * This code is derived from software written for Brini by Mark Brinicombe - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Brini. - * 4. The name of the company nor the name of the author may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD: /repoman/r/ncvs/src/sys/arm/include/armreg.h,v 1.3 2005/11/21 19:06:25 cognet Exp $ - */ - -#ifndef MACHINE_ARMREG_H -#define MACHINE_ARMREG_H -#define INSN_SIZE 4 -#define INSN_COND_MASK 0xf0000000 /* Condition mask */ -#define PSR_MODE 0x0000001f /* mode mask */ -#define PSR_USR26_MODE 0x00000000 -#define PSR_FIQ26_MODE 0x00000001 -#define PSR_IRQ26_MODE 0x00000002 -#define PSR_SVC26_MODE 0x00000003 -#define PSR_USR32_MODE 0x00000010 -#define PSR_FIQ32_MODE 0x00000011 -#define PSR_IRQ32_MODE 0x00000012 -#define PSR_SVC32_MODE 0x00000013 -#define PSR_ABT32_MODE 0x00000017 -#define PSR_UND32_MODE 0x0000001b -#define PSR_SYS32_MODE 0x0000001f -#define PSR_32_MODE 0x00000010 -#define PSR_FLAGS 0xf0000000 /* flags */ - -#define PSR_C_bit (1 << 29) /* carry */ - -/* The high-order byte is always the implementor */ -#define CPU_ID_IMPLEMENTOR_MASK 0xff000000 -#define CPU_ID_ARM_LTD 0x41000000 /* 'A' */ -#define CPU_ID_DEC 0x44000000 /* 'D' */ -#define CPU_ID_INTEL 0x69000000 /* 'i' */ -#define CPU_ID_TI 0x54000000 /* 'T' */ - -/* How to decide what format the CPUID is in. */ -#define CPU_ID_ISOLD(x) (((x) & 0x0000f000) == 0x00000000) -#define CPU_ID_IS7(x) (((x) & 0x0000f000) == 0x00007000) -#define CPU_ID_ISNEW(x) (!CPU_ID_ISOLD(x) && !CPU_ID_IS7(x)) - -/* On ARM3 and ARM6, this byte holds the foundry ID. */ -#define CPU_ID_FOUNDRY_MASK 0x00ff0000 -#define CPU_ID_FOUNDRY_VLSI 0x00560000 - -/* On ARM7 it holds the architecture and variant (sub-model) */ -#define CPU_ID_7ARCH_MASK 0x00800000 -#define CPU_ID_7ARCH_V3 0x00000000 -#define CPU_ID_7ARCH_V4T 0x00800000 -#define CPU_ID_7VARIANT_MASK 0x007f0000 - -/* On more recent ARMs, it does the same, but in a different format */ -#define CPU_ID_ARCH_MASK 0x000f0000 -#define CPU_ID_ARCH_V3 0x00000000 -#define CPU_ID_ARCH_V4 0x00010000 -#define CPU_ID_ARCH_V4T 0x00020000 -#define CPU_ID_ARCH_V5 0x00030000 -#define CPU_ID_ARCH_V5T 0x00040000 -#define CPU_ID_ARCH_V5TE 0x00050000 -#define CPU_ID_VARIANT_MASK 0x00f00000 - -/* Next three nybbles are part number */ -#define CPU_ID_PARTNO_MASK 0x0000fff0 - -/* Intel XScale has sub fields in part number */ -#define CPU_ID_XSCALE_COREGEN_MASK 0x0000e000 /* core generation */ -#define CPU_ID_XSCALE_COREREV_MASK 0x00001c00 /* core revision */ -#define CPU_ID_XSCALE_PRODUCT_MASK 0x000003f0 /* product number */ - -/* And finally, the revision number. */ -#define CPU_ID_REVISION_MASK 0x0000000f - -/* Individual CPUs are probably best IDed by everything but the revision. */ -#define CPU_ID_CPU_MASK 0xfffffff0 - -/* Fake CPU IDs for ARMs without CP15 */ -#define CPU_ID_ARM2 0x41560200 -#define CPU_ID_ARM250 0x41560250 - -/* Pre-ARM7 CPUs -- [15:12] == 0 */ -#define CPU_ID_ARM3 0x41560300 -#define CPU_ID_ARM600 0x41560600 -#define CPU_ID_ARM610 0x41560610 -#define CPU_ID_ARM620 0x41560620 - -/* ARM7 CPUs -- [15:12] == 7 */ -#define CPU_ID_ARM700 0x41007000 /* XXX This is a guess. */ -#define CPU_ID_ARM710 0x41007100 -#define CPU_ID_ARM7500 0x41027100 /* XXX This is a guess. */ -#define CPU_ID_ARM710A 0x41047100 /* inc ARM7100 */ -#define CPU_ID_ARM7500FE 0x41077100 -#define CPU_ID_ARM710T 0x41807100 -#define CPU_ID_ARM720T 0x41807200 -#define CPU_ID_ARM740T8K 0x41807400 /* XXX no MMU, 8KB cache */ -#define CPU_ID_ARM740T4K 0x41817400 /* XXX no MMU, 4KB cache */ - -/* Post-ARM7 CPUs */ -#define CPU_ID_ARM810 0x41018100 -#define CPU_ID_ARM920T 0x41129200 -#define CPU_ID_ARM920T_ALT 0x41009200 -#define CPU_ID_ARM922T 0x41029220 -#define CPU_ID_ARM940T 0x41029400 /* XXX no MMU */ -#define CPU_ID_ARM946ES 0x41049460 /* XXX no MMU */ -#define CPU_ID_ARM966ES 0x41049660 /* XXX no MMU */ -#define CPU_ID_ARM966ESR1 0x41059660 /* XXX no MMU */ -#define CPU_ID_ARM1020E 0x4115a200 /* (AKA arm10 rev 1) */ -#define CPU_ID_ARM1022ES 0x4105a220 -#define CPU_ID_SA110 0x4401a100 -#define CPU_ID_SA1100 0x4401a110 -#define CPU_ID_TI925T 0x54029250 -#define CPU_ID_SA1110 0x6901b110 -#define CPU_ID_IXP1200 0x6901c120 -#define CPU_ID_80200 0x69052000 -#define CPU_ID_PXA250 0x69052100 /* sans core revision */ -#define CPU_ID_PXA210 0x69052120 -#define CPU_ID_PXA250A 0x69052100 /* 1st version Core */ -#define CPU_ID_PXA210A 0x69052120 /* 1st version Core */ -#define CPU_ID_PXA250B 0x69052900 /* 3rd version Core */ -#define CPU_ID_PXA210B 0x69052920 /* 3rd version Core */ -#define CPU_ID_PXA250C 0x69052d00 /* 4th version Core */ -#define CPU_ID_PXA210C 0x69052d20 /* 4th version Core */ -#define CPU_ID_80321_400 0x69052420 -#define CPU_ID_80321_600 0x69052430 -#define CPU_ID_80321_400_B0 0x69052c20 -#define CPU_ID_80321_600_B0 0x69052c30 -#define CPU_ID_IXP425_533 0x690541c0 -#define CPU_ID_IXP425_400 0x690541d0 -#define CPU_ID_IXP425_266 0x690541f0 - -/* ARM3-specific coprocessor 15 registers */ -#define ARM3_CP15_FLUSH 1 -#define ARM3_CP15_CONTROL 2 -#define ARM3_CP15_CACHEABLE 3 -#define ARM3_CP15_UPDATEABLE 4 -#define ARM3_CP15_DISRUPTIVE 5 - -/* ARM3 Control register bits */ -#define ARM3_CTL_CACHE_ON 0x00000001 -#define ARM3_CTL_SHARED 0x00000002 -#define ARM3_CTL_MONITOR 0x00000004 - -/* - * Post-ARM3 CP15 registers: - * - * 1 Control register - * - * 2 Translation Table Base - * - * 3 Domain Access Control - * - * 4 Reserved - * - * 5 Fault Status - * - * 6 Fault Address - * - * 7 Cache/write-buffer Control - * - * 8 TLB Control - * - * 9 Cache Lockdown - * - * 10 TLB Lockdown - * - * 11 Reserved - * - * 12 Reserved - * - * 13 Process ID (for FCSE) - * - * 14 Reserved - * - * 15 Implementation Dependent - */ - -/* Some of the definitions below need cleaning up for V3/V4 architectures */ - -/* CPU control register (CP15 register 1) */ -#define CPU_CONTROL_MMU_ENABLE 0x00000001 /* M: MMU/Protection unit enable */ -#define CPU_CONTROL_AFLT_ENABLE 0x00000002 /* A: Alignment fault enable */ -#define CPU_CONTROL_DC_ENABLE 0x00000004 /* C: IDC/DC enable */ -#define CPU_CONTROL_WBUF_ENABLE 0x00000008 /* W: Write buffer enable */ -#define CPU_CONTROL_32BP_ENABLE 0x00000010 /* P: 32-bit exception handlers */ -#define CPU_CONTROL_32BD_ENABLE 0x00000020 /* D: 32-bit addressing */ -#define CPU_CONTROL_LABT_ENABLE 0x00000040 /* L: Late abort enable */ -#define CPU_CONTROL_BEND_ENABLE 0x00000080 /* B: Big-endian mode */ -#define CPU_CONTROL_SYST_ENABLE 0x00000100 /* S: System protection bit */ -#define CPU_CONTROL_ROM_ENABLE 0x00000200 /* R: ROM protection bit */ -#define CPU_CONTROL_CPCLK 0x00000400 /* F: Implementation defined */ -#define CPU_CONTROL_BPRD_ENABLE 0x00000800 /* Z: Branch prediction enable */ -#define CPU_CONTROL_IC_ENABLE 0x00001000 /* I: IC enable */ -#define CPU_CONTROL_VECRELOC 0x00002000 /* V: Vector relocation */ -#define CPU_CONTROL_ROUNDROBIN 0x00004000 /* RR: Predictable replacement */ -#define CPU_CONTROL_V4COMPAT 0x00008000 /* L4: ARMv4 compat LDR R15 etc */ - -#define CPU_CONTROL_IDC_ENABLE CPU_CONTROL_DC_ENABLE - -/* XScale Auxillary Control Register (CP15 register 1, opcode2 1) */ -#define XSCALE_AUXCTL_K 0x00000001 /* dis. write buffer coalescing */ -#define XSCALE_AUXCTL_P 0x00000002 /* ECC protect page table access */ -#define XSCALE_AUXCTL_MD_WB_RA 0x00000000 /* mini-D$ wb, read-allocate */ -#define XSCALE_AUXCTL_MD_WB_RWA 0x00000010 /* mini-D$ wb, read/write-allocate */ -#define XSCALE_AUXCTL_MD_WT 0x00000020 /* mini-D$ wt, read-allocate */ -#define XSCALE_AUXCTL_MD_MASK 0x00000030 - -/* Cache type register definitions */ -#define CPU_CT_ISIZE(x) ((x) & 0xfff) /* I$ info */ -#define CPU_CT_DSIZE(x) (((x) >> 12) & 0xfff) /* D$ info */ -#define CPU_CT_S (1U << 24) /* split cache */ -#define CPU_CT_CTYPE(x) (((x) >> 25) & 0xf) /* cache type */ - -#define CPU_CT_CTYPE_WT 0 /* write-through */ -#define CPU_CT_CTYPE_WB1 1 /* write-back, clean w/ read */ -#define CPU_CT_CTYPE_WB2 2 /* w/b, clean w/ cp15,7 */ -#define CPU_CT_CTYPE_WB6 6 /* w/b, cp15,7, lockdown fmt A */ -#define CPU_CT_CTYPE_WB7 7 /* w/b, cp15,7, lockdown fmt B */ - -#define CPU_CT_xSIZE_LEN(x) ((x) & 0x3) /* line size */ -#define CPU_CT_xSIZE_M (1U << 2) /* multiplier */ -#define CPU_CT_xSIZE_ASSOC(x) (((x) >> 3) & 0x7) /* associativity */ -#define CPU_CT_xSIZE_SIZE(x) (((x) >> 6) & 0x7) /* size */ - -/* Fault status register definitions */ - -#define FAULT_TYPE_MASK 0x0f -#define FAULT_USER 0x10 - -#define FAULT_WRTBUF_0 0x00 /* Vector Exception */ -#define FAULT_WRTBUF_1 0x02 /* Terminal Exception */ -#define FAULT_BUSERR_0 0x04 /* External Abort on Linefetch -- Section */ -#define FAULT_BUSERR_1 0x06 /* External Abort on Linefetch -- Page */ -#define FAULT_BUSERR_2 0x08 /* External Abort on Non-linefetch -- Section */ -#define FAULT_BUSERR_3 0x0a /* External Abort on Non-linefetch -- Page */ -#define FAULT_BUSTRNL1 0x0c /* External abort on Translation -- Level 1 */ -#define FAULT_BUSTRNL2 0x0e /* External abort on Translation -- Level 2 */ -#define FAULT_ALIGN_0 0x01 /* Alignment */ -#define FAULT_ALIGN_1 0x03 /* Alignment */ -#define FAULT_TRANS_S 0x05 /* Translation -- Section */ -#define FAULT_TRANS_P 0x07 /* Translation -- Page */ -#define FAULT_DOMAIN_S 0x09 /* Domain -- Section */ -#define FAULT_DOMAIN_P 0x0b /* Domain -- Page */ -#define FAULT_PERM_S 0x0d /* Permission -- Section */ -#define FAULT_PERM_P 0x0f /* Permission -- Page */ - -#define FAULT_IMPRECISE 0x400 /* Imprecise exception (XSCALE) */ - -/* - * Address of the vector page, low and high versions. - */ -#define ARM_VECTORS_LOW 0x00000000U -#define ARM_VECTORS_HIGH 0xffff0000U - -/* - * ARM Instructions - * - * 3 3 2 2 2 - * 1 0 9 8 7 0 - * +-------+-------------------------------------------------------+ - * | cond | instruction dependant | - * |c c c c| | - * +-------+-------------------------------------------------------+ - */ - -#define INSN_SIZE 4 /* Always 4 bytes */ -#define INSN_COND_MASK 0xf0000000 /* Condition mask */ -#define INSN_COND_AL 0xe0000000 /* Always condition */ - -#endif /* !MACHINE_ARMREG_H */ diff --git a/libpixelflinger/codeflinger/blending.cpp b/libpixelflinger/codeflinger/blending.cpp deleted file mode 100644 index 2cbb00f83..000000000 --- a/libpixelflinger/codeflinger/blending.cpp +++ /dev/null @@ -1,674 +0,0 @@ -/* libs/pixelflinger/codeflinger/blending.cpp -** -** Copyright 2006, 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 "pixelflinger-code" - -#include -#include -#include -#include -#include - -#include -#include - -#include "GGLAssembler.h" - -namespace android { - -void GGLAssembler::build_fog( - component_t& temp, // incomming fragment / output - int component, - Scratch& regs) -{ - if (mInfo[component].fog) { - Scratch scratches(registerFile()); - comment("fog"); - - integer_t fragment(temp.reg, temp.h, temp.flags); - if (!(temp.flags & CORRUPTIBLE)) { - temp.reg = regs.obtain(); - temp.flags |= CORRUPTIBLE; - } - - integer_t fogColor(scratches.obtain(), 8, CORRUPTIBLE); - LDRB(AL, fogColor.reg, mBuilderContext.Rctx, - immed12_pre(GGL_OFFSETOF(state.fog.color[component]))); - - integer_t factor(scratches.obtain(), 16, CORRUPTIBLE); - CONTEXT_LOAD(factor.reg, generated_vars.f); - - // clamp fog factor (TODO: see if there is a way to guarantee - // we won't overflow, when setting the iterators) - BIC(AL, 0, factor.reg, factor.reg, reg_imm(factor.reg, ASR, 31)); - CMP(AL, factor.reg, imm( 0x10000 )); - MOV(HS, 0, factor.reg, imm( 0x10000 )); - - build_blendFOneMinusF(temp, factor, fragment, fogColor); - } -} - -void GGLAssembler::build_blending( - component_t& temp, // incomming fragment / output - const pixel_t& pixel, // framebuffer - int component, - Scratch& regs) -{ - if (!mInfo[component].blend) - return; - - int fs = component==GGLFormat::ALPHA ? mBlendSrcA : mBlendSrc; - int fd = component==GGLFormat::ALPHA ? mBlendDstA : mBlendDst; - if (fs==GGL_SRC_ALPHA_SATURATE && component==GGLFormat::ALPHA) - fs = GGL_ONE; - const int blending = blending_codes(fs, fd); - if (!temp.size()) { - // here, blending will produce something which doesn't depend on - // that component (eg: GL_ZERO:GL_*), so the register has not been - // allocated yet. Will never be used as a source. - temp = component_t(regs.obtain(), CORRUPTIBLE); - } - - // we are doing real blending... - // fb: extracted dst - // fragment: extracted src - // temp: component_t(fragment) and result - - // scoped register allocator - Scratch scratches(registerFile()); - comment("blending"); - - // we can optimize these cases a bit... - // (1) saturation is not needed - // (2) we can use only one multiply instead of 2 - // (3) we can reduce the register pressure - // R = S*f + D*(1-f) = (S-D)*f + D - // R = S*(1-f) + D*f = (D-S)*f + S - - const bool same_factor_opt1 = - (fs==GGL_DST_COLOR && fd==GGL_ONE_MINUS_DST_COLOR) || - (fs==GGL_SRC_COLOR && fd==GGL_ONE_MINUS_SRC_COLOR) || - (fs==GGL_DST_ALPHA && fd==GGL_ONE_MINUS_DST_ALPHA) || - (fs==GGL_SRC_ALPHA && fd==GGL_ONE_MINUS_SRC_ALPHA); - - const bool same_factor_opt2 = - (fs==GGL_ONE_MINUS_DST_COLOR && fd==GGL_DST_COLOR) || - (fs==GGL_ONE_MINUS_SRC_COLOR && fd==GGL_SRC_COLOR) || - (fs==GGL_ONE_MINUS_DST_ALPHA && fd==GGL_DST_ALPHA) || - (fs==GGL_ONE_MINUS_SRC_ALPHA && fd==GGL_SRC_ALPHA); - - - // XXX: we could also optimize these cases: - // R = S*f + D*f = (S+D)*f - // R = S*(1-f) + D*(1-f) = (S+D)*(1-f) - // R = S*D + D*S = 2*S*D - - - // see if we need to extract 'component' from the destination (fb) - integer_t fb; - if (blending & (BLEND_DST|FACTOR_DST)) { - fb.setTo(scratches.obtain(), 32); - extract(fb, pixel, component); - if (mDithering) { - // XXX: maybe what we should do instead, is simply - // expand fb -or- fragment to the larger of the two - if (fb.size() < temp.size()) { - // for now we expand 'fb' to min(fragment, 8) - int new_size = temp.size() < 8 ? temp.size() : 8; - expand(fb, fb, new_size); - } - } - } - - - // convert input fragment to integer_t - if (temp.l && (temp.flags & CORRUPTIBLE)) { - MOV(AL, 0, temp.reg, reg_imm(temp.reg, LSR, temp.l)); - temp.h -= temp.l; - temp.l = 0; - } - integer_t fragment(temp.reg, temp.size(), temp.flags); - - // if not done yet, convert input fragment to integer_t - if (temp.l) { - // here we know temp is not CORRUPTIBLE - fragment.reg = scratches.obtain(); - MOV(AL, 0, fragment.reg, reg_imm(temp.reg, LSR, temp.l)); - fragment.flags |= CORRUPTIBLE; - } - - if (!(temp.flags & CORRUPTIBLE)) { - // temp is not corruptible, but since it's the destination it - // will be modified, so we need to allocate a new register. - temp.reg = regs.obtain(); - temp.flags &= ~CORRUPTIBLE; - fragment.flags &= ~CORRUPTIBLE; - } - - if ((blending & BLEND_SRC) && !same_factor_opt1) { - // source (fragment) is needed for the blending stage - // so it's not CORRUPTIBLE (unless we're doing same_factor_opt1) - fragment.flags &= ~CORRUPTIBLE; - } - - - if (same_factor_opt1) { - // R = S*f + D*(1-f) = (S-D)*f + D - integer_t factor; - build_blend_factor(factor, fs, - component, pixel, fragment, fb, scratches); - // fb is always corruptible from this point - fb.flags |= CORRUPTIBLE; - build_blendFOneMinusF(temp, factor, fragment, fb); - } else if (same_factor_opt2) { - // R = S*(1-f) + D*f = (D-S)*f + S - integer_t factor; - // fb is always corrruptible here - fb.flags |= CORRUPTIBLE; - build_blend_factor(factor, fd, - component, pixel, fragment, fb, scratches); - build_blendOneMinusFF(temp, factor, fragment, fb); - } else { - integer_t src_factor; - integer_t dst_factor; - - // if destination (fb) is not needed for the blending stage, - // then it can be marked as CORRUPTIBLE - if (!(blending & BLEND_DST)) { - fb.flags |= CORRUPTIBLE; - } - - // XXX: try to mark some registers as CORRUPTIBLE - // in most case we could make those corruptible - // when we're processing the last component - // but not always, for instance - // when fragment is constant and not reloaded - // when fb is needed for logic-ops or masking - // when a register is aliased (for instance with mAlphaSource) - - // blend away... - if (fs==GGL_ZERO) { - if (fd==GGL_ZERO) { // R = 0 - // already taken care of - } else if (fd==GGL_ONE) { // R = D - // already taken care of - } else { // R = D*fd - // compute fd - build_blend_factor(dst_factor, fd, - component, pixel, fragment, fb, scratches); - mul_factor(temp, fb, dst_factor); - } - } else if (fs==GGL_ONE) { - if (fd==GGL_ZERO) { // R = S - // NOP, taken care of - } else if (fd==GGL_ONE) { // R = S + D - component_add(temp, fb, fragment); // args order matters - component_sat(temp); - } else { // R = S + D*fd - // compute fd - build_blend_factor(dst_factor, fd, - component, pixel, fragment, fb, scratches); - mul_factor_add(temp, fb, dst_factor, component_t(fragment)); - component_sat(temp); - } - } else { - // compute fs - build_blend_factor(src_factor, fs, - component, pixel, fragment, fb, scratches); - if (fd==GGL_ZERO) { // R = S*fs - mul_factor(temp, fragment, src_factor); - } else if (fd==GGL_ONE) { // R = S*fs + D - mul_factor_add(temp, fragment, src_factor, component_t(fb)); - component_sat(temp); - } else { // R = S*fs + D*fd - mul_factor(temp, fragment, src_factor); - if (scratches.isUsed(src_factor.reg)) - scratches.recycle(src_factor.reg); - // compute fd - build_blend_factor(dst_factor, fd, - component, pixel, fragment, fb, scratches); - mul_factor_add(temp, fb, dst_factor, temp); - if (!same_factor_opt1 && !same_factor_opt2) { - component_sat(temp); - } - } - } - } - - // now we can be corrupted (it's the dest) - temp.flags |= CORRUPTIBLE; -} - -void GGLAssembler::build_blend_factor( - integer_t& factor, int f, int component, - const pixel_t& dst_pixel, - integer_t& fragment, - integer_t& fb, - Scratch& scratches) -{ - integer_t src_alpha(fragment); - - // src_factor/dst_factor won't be used after blending, - // so it's fine to mark them as CORRUPTIBLE (if not aliased) - factor.flags |= CORRUPTIBLE; - - switch(f) { - case GGL_ONE_MINUS_SRC_ALPHA: - case GGL_SRC_ALPHA: - if (component==GGLFormat::ALPHA && !isAlphaSourceNeeded()) { - // we're processing alpha, so we already have - // src-alpha in fragment, and we need src-alpha just this time. - } else { - // alpha-src will be needed for other components - if (!mBlendFactorCached || mBlendFactorCached==f) { - src_alpha = mAlphaSource; - factor = mAlphaSource; - factor.flags &= ~CORRUPTIBLE; - // we already computed the blend factor before, nothing to do. - if (mBlendFactorCached) - return; - // this is the first time, make sure to compute the blend - // factor properly. - mBlendFactorCached = f; - break; - } else { - // we have a cached alpha blend factor, but we want another one, - // this should really not happen because by construction, - // we cannot have BOTH source and destination - // blend factors use ALPHA *and* ONE_MINUS_ALPHA (because - // the blending stage uses the f/(1-f) optimization - - // for completeness, we handle this case though. Since there - // are only 2 choices, this meens we want "the other one" - // (1-factor) - factor = mAlphaSource; - factor.flags &= ~CORRUPTIBLE; - RSB(AL, 0, factor.reg, factor.reg, imm((1< 8) { - MOV(AL, 0, factor.reg, reg_imm(factor.reg, LSR, factor.s-8)); - factor.s = 8; - } -} - -int GGLAssembler::blending_codes(int fs, int fd) -{ - int blending = 0; - switch(fs) { - case GGL_ONE: - blending |= BLEND_SRC; - break; - - case GGL_ONE_MINUS_DST_COLOR: - case GGL_DST_COLOR: - blending |= FACTOR_DST|BLEND_SRC; - break; - case GGL_ONE_MINUS_DST_ALPHA: - case GGL_DST_ALPHA: - // no need to extract 'component' from the destination - // for the blend factor, because we need ALPHA only. - blending |= BLEND_SRC; - break; - - case GGL_ONE_MINUS_SRC_COLOR: - case GGL_SRC_COLOR: - blending |= FACTOR_SRC|BLEND_SRC; - break; - case GGL_ONE_MINUS_SRC_ALPHA: - case GGL_SRC_ALPHA: - case GGL_SRC_ALPHA_SATURATE: - blending |= FACTOR_SRC|BLEND_SRC; - break; - } - switch(fd) { - case GGL_ONE: - blending |= BLEND_DST; - break; - - case GGL_ONE_MINUS_DST_COLOR: - case GGL_DST_COLOR: - blending |= FACTOR_DST|BLEND_DST; - break; - case GGL_ONE_MINUS_DST_ALPHA: - case GGL_DST_ALPHA: - blending |= FACTOR_DST|BLEND_DST; - break; - - case GGL_ONE_MINUS_SRC_COLOR: - case GGL_SRC_COLOR: - blending |= FACTOR_SRC|BLEND_DST; - break; - case GGL_ONE_MINUS_SRC_ALPHA: - case GGL_SRC_ALPHA: - // no need to extract 'component' from the source - // for the blend factor, because we need ALPHA only. - blending |= BLEND_DST; - break; - } - return blending; -} - -// --------------------------------------------------------------------------- - -void GGLAssembler::build_blendFOneMinusF( - component_t& temp, - const integer_t& factor, - const integer_t& fragment, - const integer_t& fb) -{ - // R = S*f + D*(1-f) = (S-D)*f + D - Scratch scratches(registerFile()); - // compute S-D - integer_t diff(fragment.flags & CORRUPTIBLE ? - fragment.reg : scratches.obtain(), fb.size(), CORRUPTIBLE); - const int shift = fragment.size() - fb.size(); - if (shift>0) RSB(AL, 0, diff.reg, fb.reg, reg_imm(fragment.reg, LSR, shift)); - else if (shift<0) RSB(AL, 0, diff.reg, fb.reg, reg_imm(fragment.reg, LSL,-shift)); - else RSB(AL, 0, diff.reg, fb.reg, fragment.reg); - mul_factor_add(temp, diff, factor, component_t(fb)); -} - -void GGLAssembler::build_blendOneMinusFF( - component_t& temp, - const integer_t& factor, - const integer_t& fragment, - const integer_t& fb) -{ - // R = S*f + D*(1-f) = (S-D)*f + D - Scratch scratches(registerFile()); - // compute D-S - integer_t diff(fb.flags & CORRUPTIBLE ? - fb.reg : scratches.obtain(), fb.size(), CORRUPTIBLE); - const int shift = fragment.size() - fb.size(); - if (shift>0) SUB(AL, 0, diff.reg, fb.reg, reg_imm(fragment.reg, LSR, shift)); - else if (shift<0) SUB(AL, 0, diff.reg, fb.reg, reg_imm(fragment.reg, LSL,-shift)); - else SUB(AL, 0, diff.reg, fb.reg, fragment.reg); - mul_factor_add(temp, diff, factor, component_t(fragment)); -} - -// --------------------------------------------------------------------------- - -void GGLAssembler::mul_factor( component_t& d, - const integer_t& v, - const integer_t& f) -{ - int vs = v.size(); - int fs = f.size(); - int ms = vs+fs; - - // XXX: we could have special cases for 1 bit mul - - // all this code below to use the best multiply instruction - // wrt the parameters size. We take advantage of the fact - // that the 16-bits multiplies allow a 16-bit shift - // The trick is that we just make sure that we have at least 8-bits - // per component (which is enough for a 8 bits display). - - int xy; - int vshift = 0; - int fshift = 0; - int smulw = 0; - - if (vs<16) { - if (fs<16) { - xy = xyBB; - } else if (GGL_BETWEEN(fs, 24, 31)) { - ms -= 16; - xy = xyTB; - } else { - // eg: 15 * 18 -> 15 * 15 - fshift = fs - 15; - ms -= fshift; - xy = xyBB; - } - } else if (GGL_BETWEEN(vs, 24, 31)) { - if (fs<16) { - ms -= 16; - xy = xyTB; - } else if (GGL_BETWEEN(fs, 24, 31)) { - ms -= 32; - xy = xyTT; - } else { - // eg: 24 * 18 -> 8 * 18 - fshift = fs - 15; - ms -= 16 + fshift; - xy = xyTB; - } - } else { - if (fs<16) { - // eg: 18 * 15 -> 15 * 15 - vshift = vs - 15; - ms -= vshift; - xy = xyBB; - } else if (GGL_BETWEEN(fs, 24, 31)) { - // eg: 18 * 24 -> 15 * 8 - vshift = vs - 15; - ms -= 16 + vshift; - xy = xyBT; - } else { - // eg: 18 * 18 -> (15 * 18)>>16 - fshift = fs - 15; - ms -= 16 + fshift; - xy = yB; //XXX SMULWB - smulw = 1; - } - } - - ALOGE_IF(ms>=32, "mul_factor overflow vs=%d, fs=%d", vs, fs); - - int vreg = v.reg; - int freg = f.reg; - if (vshift) { - MOV(AL, 0, d.reg, reg_imm(vreg, LSR, vshift)); - vreg = d.reg; - } - if (fshift) { - MOV(AL, 0, d.reg, reg_imm(vreg, LSR, fshift)); - freg = d.reg; - } - if (smulw) SMULW(AL, xy, d.reg, vreg, freg); - else SMUL(AL, xy, d.reg, vreg, freg); - - - d.h = ms; - if (mDithering) { - d.l = 0; - } else { - d.l = fs; - d.flags |= CLEAR_LO; - } -} - -void GGLAssembler::mul_factor_add( component_t& d, - const integer_t& v, - const integer_t& f, - const component_t& a) -{ - // XXX: we could have special cases for 1 bit mul - Scratch scratches(registerFile()); - - int vs = v.size(); - int fs = f.size(); - int as = a.h; - int ms = vs+fs; - - ALOGE_IF(ms>=32, "mul_factor_add overflow vs=%d, fs=%d, as=%d", vs, fs, as); - - integer_t add(a.reg, a.h, a.flags); - - // 'a' is a component_t but it is guaranteed to have - // its high bits set to 0. However in the dithering case, - // we can't get away with truncating the potentially bad bits - // so extraction is needed. - - if ((mDithering) && (a.size() < ms)) { - // we need to expand a - if (!(a.flags & CORRUPTIBLE)) { - // ... but it's not corruptible, so we need to pick a - // temporary register. - // Try to uses the destination register first (it's likely - // to be usable, unless it aliases an input). - if (d.reg!=a.reg && d.reg!=v.reg && d.reg!=f.reg) { - add.reg = d.reg; - } else { - add.reg = scratches.obtain(); - } - } - expand(add, a, ms); // extracts and expands - as = ms; - } - - if (ms == as) { - if (vs<16 && fs<16) SMLABB(AL, d.reg, v.reg, f.reg, add.reg); - else MLA(AL, 0, d.reg, v.reg, f.reg, add.reg); - } else { - int temp = d.reg; - if (temp == add.reg) { - // the mul will modify add.reg, we need an intermediary reg - if (v.flags & CORRUPTIBLE) temp = v.reg; - else if (f.flags & CORRUPTIBLE) temp = f.reg; - else temp = scratches.obtain(); - } - - if (vs<16 && fs<16) SMULBB(AL, temp, v.reg, f.reg); - else MUL(AL, 0, temp, v.reg, f.reg); - - if (ms>as) { - ADD(AL, 0, d.reg, temp, reg_imm(add.reg, LSL, ms-as)); - } else if (msa.l ? fs : a.l; - d.flags |= CLEAR_LO; - } -} - -void GGLAssembler::component_add(component_t& d, - const integer_t& dst, const integer_t& src) -{ - // here we're guaranteed that fragment.size() >= fb.size() - const int shift = src.size() - dst.size(); - if (!shift) { - ADD(AL, 0, d.reg, src.reg, dst.reg); - } else { - ADD(AL, 0, d.reg, src.reg, reg_imm(dst.reg, LSL, shift)); - } - - d.h = src.size(); - if (mDithering) { - d.l = 0; - } else { - d.l = shift; - d.flags |= CLEAR_LO; - } -} - -void GGLAssembler::component_sat(const component_t& v) -{ - const int one = ((1< -//__FBSDID("$FreeBSD: /repoman/r/ncvs/src/sys/arm/arm/disassem.c,v 1.2 2005/01/05 21:58:47 imp Exp $"); -#include -#include - -#include "disassem.h" -#include "armreg.h" -//#include - -/* - * General instruction format - * - * insn[cc][mod] [operands] - * - * Those fields with an uppercase format code indicate that the field - * follows directly after the instruction before the separator i.e. - * they modify the instruction rather than just being an operand to - * the instruction. The only exception is the writeback flag which - * follows a operand. - * - * - * 2 - print Operand 2 of a data processing instruction - * d - destination register (bits 12-15) - * n - n register (bits 16-19) - * s - s register (bits 8-11) - * o - indirect register rn (bits 16-19) (used by swap) - * m - m register (bits 0-3) - * a - address operand of ldr/str instruction - * e - address operand of ldrh/strh instruction - * l - register list for ldm/stm instruction - * f - 1st fp operand (register) (bits 12-14) - * g - 2nd fp operand (register) (bits 16-18) - * h - 3rd fp operand (register/immediate) (bits 0-4) - * j - xtb rotate literal (bits 10-11) - * i - bfx lsb literal (bits 7-11) - * w - bfx width literal (bits 16-20) - * b - branch address - * t - thumb branch address (bits 24, 0-23) - * k - breakpoint comment (bits 0-3, 8-19) - * X - block transfer type - * Y - block transfer type (r13 base) - * c - comment field bits(0-23) - * p - saved or current status register - * F - PSR transfer fields - * D - destination-is-r15 (P) flag on TST, TEQ, CMP, CMN - * L - co-processor transfer size - * S - set status flag - * P - fp precision - * Q - fp precision (for ldf/stf) - * R - fp rounding - * v - co-processor data transfer registers + addressing mode - * W - writeback flag - * x - instruction in hex - * # - co-processor number - * y - co-processor data processing registers - * z - co-processor register transfer registers - */ - -struct arm32_insn { - u_int mask; - u_int pattern; - char* name; - char* format; -}; - -static const struct arm32_insn arm32_i[] = { - { 0x0fffffff, 0x0ff00000, "imb", "c" }, /* Before swi */ - { 0x0fffffff, 0x0ff00001, "imbrange", "c" }, /* Before swi */ - { 0x0f000000, 0x0f000000, "swi", "c" }, - { 0xfe000000, 0xfa000000, "blx", "t" }, /* Before b and bl */ - { 0x0f000000, 0x0a000000, "b", "b" }, - { 0x0f000000, 0x0b000000, "bl", "b" }, - { 0x0fe000f0, 0x00000090, "mul", "Snms" }, - { 0x0fe000f0, 0x00200090, "mla", "Snmsd" }, - { 0x0fe000f0, 0x00800090, "umull", "Sdnms" }, - { 0x0fe000f0, 0x00c00090, "smull", "Sdnms" }, - { 0x0fe000f0, 0x00a00090, "umlal", "Sdnms" }, - { 0x0fe000f0, 0x00e00090, "smlal", "Sdnms" }, - { 0x0fff03f0, 0x06cf0070, "uxtb16", "dmj" }, - { 0x0fe00070, 0x07e00050, "ubfx", "dmiw" }, - { 0x0d700000, 0x04200000, "strt", "daW" }, - { 0x0d700000, 0x04300000, "ldrt", "daW" }, - { 0x0d700000, 0x04600000, "strbt", "daW" }, - { 0x0d700000, 0x04700000, "ldrbt", "daW" }, - { 0x0c500000, 0x04000000, "str", "daW" }, - { 0x0c500000, 0x04100000, "ldr", "daW" }, - { 0x0c500000, 0x04400000, "strb", "daW" }, - { 0x0c500000, 0x04500000, "ldrb", "daW" }, - { 0x0e1f0000, 0x080d0000, "stm", "YnWl" },/* separate out r13 base */ - { 0x0e1f0000, 0x081d0000, "ldm", "YnWl" },/* separate out r13 base */ - { 0x0e100000, 0x08000000, "stm", "XnWl" }, - { 0x0e100000, 0x08100000, "ldm", "XnWl" }, - { 0x0e1000f0, 0x00100090, "ldrb", "deW" }, - { 0x0e1000f0, 0x00000090, "strb", "deW" }, - { 0x0e1000f0, 0x001000d0, "ldrsb", "deW" }, - { 0x0e1000f0, 0x001000b0, "ldrh", "deW" }, - { 0x0e1000f0, 0x000000b0, "strh", "deW" }, - { 0x0e1000f0, 0x001000f0, "ldrsh", "deW" }, - { 0x0f200090, 0x00200090, "und", "x" }, /* Before data processing */ - { 0x0e1000d0, 0x000000d0, "und", "x" }, /* Before data processing */ - { 0x0ff00ff0, 0x01000090, "swp", "dmo" }, - { 0x0ff00ff0, 0x01400090, "swpb", "dmo" }, - { 0x0fbf0fff, 0x010f0000, "mrs", "dp" }, /* Before data processing */ - { 0x0fb0fff0, 0x0120f000, "msr", "pFm" },/* Before data processing */ - { 0x0fb0f000, 0x0320f000, "msr", "pF2" },/* Before data processing */ - { 0x0ffffff0, 0x012fff10, "bx", "m" }, - { 0x0fff0ff0, 0x016f0f10, "clz", "dm" }, - { 0x0ffffff0, 0x012fff30, "blx", "m" }, - { 0xfff000f0, 0xe1200070, "bkpt", "k" }, - { 0x0de00000, 0x00000000, "and", "Sdn2" }, - { 0x0de00000, 0x00200000, "eor", "Sdn2" }, - { 0x0de00000, 0x00400000, "sub", "Sdn2" }, - { 0x0de00000, 0x00600000, "rsb", "Sdn2" }, - { 0x0de00000, 0x00800000, "add", "Sdn2" }, - { 0x0de00000, 0x00a00000, "adc", "Sdn2" }, - { 0x0de00000, 0x00c00000, "sbc", "Sdn2" }, - { 0x0de00000, 0x00e00000, "rsc", "Sdn2" }, - { 0x0df00000, 0x01100000, "tst", "Dn2" }, - { 0x0df00000, 0x01300000, "teq", "Dn2" }, - { 0x0df00000, 0x01500000, "cmp", "Dn2" }, - { 0x0df00000, 0x01700000, "cmn", "Dn2" }, - { 0x0de00000, 0x01800000, "orr", "Sdn2" }, - { 0x0de00000, 0x01a00000, "mov", "Sd2" }, - { 0x0de00000, 0x01c00000, "bic", "Sdn2" }, - { 0x0de00000, 0x01e00000, "mvn", "Sd2" }, - { 0x0ff08f10, 0x0e000100, "adf", "PRfgh" }, - { 0x0ff08f10, 0x0e100100, "muf", "PRfgh" }, - { 0x0ff08f10, 0x0e200100, "suf", "PRfgh" }, - { 0x0ff08f10, 0x0e300100, "rsf", "PRfgh" }, - { 0x0ff08f10, 0x0e400100, "dvf", "PRfgh" }, - { 0x0ff08f10, 0x0e500100, "rdf", "PRfgh" }, - { 0x0ff08f10, 0x0e600100, "pow", "PRfgh" }, - { 0x0ff08f10, 0x0e700100, "rpw", "PRfgh" }, - { 0x0ff08f10, 0x0e800100, "rmf", "PRfgh" }, - { 0x0ff08f10, 0x0e900100, "fml", "PRfgh" }, - { 0x0ff08f10, 0x0ea00100, "fdv", "PRfgh" }, - { 0x0ff08f10, 0x0eb00100, "frd", "PRfgh" }, - { 0x0ff08f10, 0x0ec00100, "pol", "PRfgh" }, - { 0x0f008f10, 0x0e000100, "fpbop", "PRfgh" }, - { 0x0ff08f10, 0x0e008100, "mvf", "PRfh" }, - { 0x0ff08f10, 0x0e108100, "mnf", "PRfh" }, - { 0x0ff08f10, 0x0e208100, "abs", "PRfh" }, - { 0x0ff08f10, 0x0e308100, "rnd", "PRfh" }, - { 0x0ff08f10, 0x0e408100, "sqt", "PRfh" }, - { 0x0ff08f10, 0x0e508100, "log", "PRfh" }, - { 0x0ff08f10, 0x0e608100, "lgn", "PRfh" }, - { 0x0ff08f10, 0x0e708100, "exp", "PRfh" }, - { 0x0ff08f10, 0x0e808100, "sin", "PRfh" }, - { 0x0ff08f10, 0x0e908100, "cos", "PRfh" }, - { 0x0ff08f10, 0x0ea08100, "tan", "PRfh" }, - { 0x0ff08f10, 0x0eb08100, "asn", "PRfh" }, - { 0x0ff08f10, 0x0ec08100, "acs", "PRfh" }, - { 0x0ff08f10, 0x0ed08100, "atn", "PRfh" }, - { 0x0f008f10, 0x0e008100, "fpuop", "PRfh" }, - { 0x0e100f00, 0x0c000100, "stf", "QLv" }, - { 0x0e100f00, 0x0c100100, "ldf", "QLv" }, - { 0x0ff00f10, 0x0e000110, "flt", "PRgd" }, - { 0x0ff00f10, 0x0e100110, "fix", "PRdh" }, - { 0x0ff00f10, 0x0e200110, "wfs", "d" }, - { 0x0ff00f10, 0x0e300110, "rfs", "d" }, - { 0x0ff00f10, 0x0e400110, "wfc", "d" }, - { 0x0ff00f10, 0x0e500110, "rfc", "d" }, - { 0x0ff0ff10, 0x0e90f110, "cmf", "PRgh" }, - { 0x0ff0ff10, 0x0eb0f110, "cnf", "PRgh" }, - { 0x0ff0ff10, 0x0ed0f110, "cmfe", "PRgh" }, - { 0x0ff0ff10, 0x0ef0f110, "cnfe", "PRgh" }, - { 0xff100010, 0xfe000010, "mcr2", "#z" }, - { 0x0f100010, 0x0e000010, "mcr", "#z" }, - { 0xff100010, 0xfe100010, "mrc2", "#z" }, - { 0x0f100010, 0x0e100010, "mrc", "#z" }, - { 0xff000010, 0xfe000000, "cdp2", "#y" }, - { 0x0f000010, 0x0e000000, "cdp", "#y" }, - { 0xfe100090, 0xfc100000, "ldc2", "L#v" }, - { 0x0e100090, 0x0c100000, "ldc", "L#v" }, - { 0xfe100090, 0xfc000000, "stc2", "L#v" }, - { 0x0e100090, 0x0c000000, "stc", "L#v" }, - { 0xf550f000, 0xf550f000, "pld", "ne" }, - { 0x0ff00ff0, 0x01000050, "qaad", "dmn" }, - { 0x0ff00ff0, 0x01400050, "qdaad", "dmn" }, - { 0x0ff00ff0, 0x01600050, "qdsub", "dmn" }, - { 0x0ff00ff0, 0x01200050, "dsub", "dmn" }, - { 0x0ff000f0, 0x01000080, "smlabb", "nmsd" }, // d & n inverted!! - { 0x0ff000f0, 0x010000a0, "smlatb", "nmsd" }, // d & n inverted!! - { 0x0ff000f0, 0x010000c0, "smlabt", "nmsd" }, // d & n inverted!! - { 0x0ff000f0, 0x010000e0, "smlatt", "nmsd" }, // d & n inverted!! - { 0x0ff000f0, 0x01400080, "smlalbb","ndms" }, // d & n inverted!! - { 0x0ff000f0, 0x014000a0, "smlaltb","ndms" }, // d & n inverted!! - { 0x0ff000f0, 0x014000c0, "smlalbt","ndms" }, // d & n inverted!! - { 0x0ff000f0, 0x014000e0, "smlaltt","ndms" }, // d & n inverted!! - { 0x0ff000f0, 0x01200080, "smlawb", "nmsd" }, // d & n inverted!! - { 0x0ff0f0f0, 0x012000a0, "smulwb","nms" }, // d & n inverted!! - { 0x0ff000f0, 0x012000c0, "smlawt", "nmsd" }, // d & n inverted!! - { 0x0ff0f0f0, 0x012000e0, "smulwt","nms" }, // d & n inverted!! - { 0x0ff0f0f0, 0x01600080, "smulbb","nms" }, // d & n inverted!! - { 0x0ff0f0f0, 0x016000a0, "smultb","nms" }, // d & n inverted!! - { 0x0ff0f0f0, 0x016000c0, "smulbt","nms" }, // d & n inverted!! - { 0x0ff0f0f0, 0x016000e0, "smultt","nms" }, // d & n inverted!! - { 0x00000000, 0x00000000, NULL, NULL } -}; - -static char const arm32_insn_conditions[][4] = { - "eq", "ne", "cs", "cc", - "mi", "pl", "vs", "vc", - "hi", "ls", "ge", "lt", - "gt", "le", "", "nv" -}; - -static char const insn_block_transfers[][4] = { - "da", "ia", "db", "ib" -}; - -static char const insn_stack_block_transfers[][4] = { - "ed", "ea", "fd", "fa" -}; - -static char const op_shifts[][4] = { - "lsl", "lsr", "asr", "ror" -}; - -static char const insn_fpa_rounding[][2] = { - "", "p", "m", "z" -}; - -static char const insn_fpa_precision[][2] = { - "s", "d", "e", "p" -}; - -static char const insn_fpaconstants[][8] = { - "0.0", "1.0", "2.0", "3.0", - "4.0", "5.0", "0.5", "10.0" -}; - -#define insn_condition(x) arm32_insn_conditions[((x) >> 28) & 0x0f] -#define insn_blktrans(x) insn_block_transfers[((x) >> 23) & 3] -#define insn_stkblktrans(x) insn_stack_block_transfers[(3*(((x) >> 20)&1))^(((x) >> 23)&3)] -#define op2_shift(x) op_shifts[((x) >> 5) & 3] -#define insn_fparnd(x) insn_fpa_rounding[((x) >> 5) & 0x03] -#define insn_fpaprec(x) insn_fpa_precision[((((x) >> 18) & 2)|((x) >> 7)) & 1] -#define insn_fpaprect(x) insn_fpa_precision[((((x) >> 21) & 2)|((x) >> 15)) & 1] -#define insn_fpaimm(x) insn_fpaconstants[(x) & 0x07] - -/* Local prototypes */ -static void disasm_register_shift(const disasm_interface_t *di, u_int insn); -static void disasm_print_reglist(const disasm_interface_t *di, u_int insn); -static void disasm_insn_ldrstr(const disasm_interface_t *di, u_int insn, - u_int loc); -static void disasm_insn_ldrhstrh(const disasm_interface_t *di, u_int insn, - u_int loc); -static void disasm_insn_ldcstc(const disasm_interface_t *di, u_int insn, - u_int loc); -static u_int disassemble_readword(u_int address); -static void disassemble_printaddr(u_int address); - -u_int -disasm(const disasm_interface_t *di, u_int loc, int __unused altfmt) -{ - const struct arm32_insn *i_ptr = &arm32_i[0]; - u_int insn = di->di_readword(loc); - int matchp = 0; - int branch; - char* f_ptr; - int fmt = 0; - -/* di->di_printf("loc=%08x insn=%08x : ", loc, insn);*/ - - while (i_ptr->name) { - if ((insn & i_ptr->mask) == i_ptr->pattern) { - matchp = 1; - break; - } - i_ptr++; - } - - if (!matchp) { - di->di_printf("und%s\t%08x\n", insn_condition(insn), insn); - return(loc + INSN_SIZE); - } - - /* If instruction forces condition code, don't print it. */ - if ((i_ptr->mask & 0xf0000000) == 0xf0000000) - di->di_printf("%s", i_ptr->name); - else - di->di_printf("%s%s", i_ptr->name, insn_condition(insn)); - - f_ptr = i_ptr->format; - - /* Insert tab if there are no instruction modifiers */ - - if (*(f_ptr) < 'A' || *(f_ptr) > 'Z') { - ++fmt; - di->di_printf("\t"); - } - - while (*f_ptr) { - switch (*f_ptr) { - /* 2 - print Operand 2 of a data processing instruction */ - case '2': - if (insn & 0x02000000) { - int rotate= ((insn >> 7) & 0x1e); - - di->di_printf("#0x%08x", - (insn & 0xff) << (32 - rotate) | - (insn & 0xff) >> rotate); - } else { - disasm_register_shift(di, insn); - } - break; - /* d - destination register (bits 12-15) */ - case 'd': - di->di_printf("r%d", ((insn >> 12) & 0x0f)); - break; - /* D - insert 'p' if Rd is R15 */ - case 'D': - if (((insn >> 12) & 0x0f) == 15) - di->di_printf("p"); - break; - /* n - n register (bits 16-19) */ - case 'n': - di->di_printf("r%d", ((insn >> 16) & 0x0f)); - break; - /* s - s register (bits 8-11) */ - case 's': - di->di_printf("r%d", ((insn >> 8) & 0x0f)); - break; - /* o - indirect register rn (bits 16-19) (used by swap) */ - case 'o': - di->di_printf("[r%d]", ((insn >> 16) & 0x0f)); - break; - /* m - m register (bits 0-4) */ - case 'm': - di->di_printf("r%d", ((insn >> 0) & 0x0f)); - break; - /* a - address operand of ldr/str instruction */ - case 'a': - disasm_insn_ldrstr(di, insn, loc); - break; - /* e - address operand of ldrh/strh instruction */ - case 'e': - disasm_insn_ldrhstrh(di, insn, loc); - break; - /* l - register list for ldm/stm instruction */ - case 'l': - disasm_print_reglist(di, insn); - break; - /* f - 1st fp operand (register) (bits 12-14) */ - case 'f': - di->di_printf("f%d", (insn >> 12) & 7); - break; - /* g - 2nd fp operand (register) (bits 16-18) */ - case 'g': - di->di_printf("f%d", (insn >> 16) & 7); - break; - /* h - 3rd fp operand (register/immediate) (bits 0-4) */ - case 'h': - if (insn & (1 << 3)) - di->di_printf("#%s", insn_fpaimm(insn)); - else - di->di_printf("f%d", insn & 7); - break; - /* j - xtb rotate literal (bits 10-11) */ - case 'j': - di->di_printf("ror #%d", ((insn >> 10) & 3) << 3); - break; - /* i - bfx lsb literal (bits 7-11) */ - case 'i': - di->di_printf("#%d", (insn >> 7) & 31); - break; - /* w - bfx width literal (bits 16-20) */ - case 'w': - di->di_printf("#%d", 1 + ((insn >> 16) & 31)); - break; - /* b - branch address */ - case 'b': - branch = ((insn << 2) & 0x03ffffff); - if (branch & 0x02000000) - branch |= 0xfc000000; - di->di_printaddr(loc + 8 + branch); - break; - /* t - blx address */ - case 't': - branch = ((insn << 2) & 0x03ffffff) | - (insn >> 23 & 0x00000002); - if (branch & 0x02000000) - branch |= 0xfc000000; - di->di_printaddr(loc + 8 + branch); - break; - /* X - block transfer type */ - case 'X': - di->di_printf("%s", insn_blktrans(insn)); - break; - /* Y - block transfer type (r13 base) */ - case 'Y': - di->di_printf("%s", insn_stkblktrans(insn)); - break; - /* c - comment field bits(0-23) */ - case 'c': - di->di_printf("0x%08x", (insn & 0x00ffffff)); - break; - /* k - breakpoint comment (bits 0-3, 8-19) */ - case 'k': - di->di_printf("0x%04x", - (insn & 0x000fff00) >> 4 | (insn & 0x0000000f)); - break; - /* p - saved or current status register */ - case 'p': - if (insn & 0x00400000) - di->di_printf("spsr"); - else - di->di_printf("cpsr"); - break; - /* F - PSR transfer fields */ - case 'F': - di->di_printf("_"); - if (insn & (1 << 16)) - di->di_printf("c"); - if (insn & (1 << 17)) - di->di_printf("x"); - if (insn & (1 << 18)) - di->di_printf("s"); - if (insn & (1 << 19)) - di->di_printf("f"); - break; - /* B - byte transfer flag */ - case 'B': - if (insn & 0x00400000) - di->di_printf("b"); - break; - /* L - co-processor transfer size */ - case 'L': - if (insn & (1 << 22)) - di->di_printf("l"); - break; - /* S - set status flag */ - case 'S': - if (insn & 0x00100000) - di->di_printf("s"); - break; - /* P - fp precision */ - case 'P': - di->di_printf("%s", insn_fpaprec(insn)); - break; - /* Q - fp precision (for ldf/stf) */ - case 'Q': - break; - /* R - fp rounding */ - case 'R': - di->di_printf("%s", insn_fparnd(insn)); - break; - /* W - writeback flag */ - case 'W': - if (insn & (1 << 21)) - di->di_printf("!"); - break; - /* # - co-processor number */ - case '#': - di->di_printf("p%d", (insn >> 8) & 0x0f); - break; - /* v - co-processor data transfer registers+addressing mode */ - case 'v': - disasm_insn_ldcstc(di, insn, loc); - break; - /* x - instruction in hex */ - case 'x': - di->di_printf("0x%08x", insn); - break; - /* y - co-processor data processing registers */ - case 'y': - di->di_printf("%d, ", (insn >> 20) & 0x0f); - - di->di_printf("c%d, c%d, c%d", (insn >> 12) & 0x0f, - (insn >> 16) & 0x0f, insn & 0x0f); - - di->di_printf(", %d", (insn >> 5) & 0x07); - break; - /* z - co-processor register transfer registers */ - case 'z': - di->di_printf("%d, ", (insn >> 21) & 0x07); - di->di_printf("r%d, c%d, c%d, %d", - (insn >> 12) & 0x0f, (insn >> 16) & 0x0f, - insn & 0x0f, (insn >> 5) & 0x07); - -/* if (((insn >> 5) & 0x07) != 0) - di->di_printf(", %d", (insn >> 5) & 0x07);*/ - break; - default: - di->di_printf("[%c - unknown]", *f_ptr); - break; - } - if (*(f_ptr+1) >= 'A' && *(f_ptr+1) <= 'Z') - ++f_ptr; - else if (*(++f_ptr)) { - ++fmt; - if (fmt == 1) - di->di_printf("\t"); - else - di->di_printf(", "); - } - }; - - di->di_printf("\n"); - - return(loc + INSN_SIZE); -} - - -static void -disasm_register_shift(const disasm_interface_t *di, u_int insn) -{ - di->di_printf("r%d", (insn & 0x0f)); - if ((insn & 0x00000ff0) == 0) - ; - else if ((insn & 0x00000ff0) == 0x00000060) - di->di_printf(", rrx"); - else { - if (insn & 0x10) - di->di_printf(", %s r%d", op2_shift(insn), - (insn >> 8) & 0x0f); - else - di->di_printf(", %s #%d", op2_shift(insn), - (insn >> 7) & 0x1f); - } -} - - -static void -disasm_print_reglist(const disasm_interface_t *di, u_int insn) -{ - int loop; - int start; - int comma; - - di->di_printf("{"); - start = -1; - comma = 0; - - for (loop = 0; loop < 17; ++loop) { - if (start != -1) { - if (loop == 16 || !(insn & (1 << loop))) { - if (comma) - di->di_printf(", "); - else - comma = 1; - if (start == loop - 1) - di->di_printf("r%d", start); - else - di->di_printf("r%d-r%d", start, loop - 1); - start = -1; - } - } else { - if (insn & (1 << loop)) - start = loop; - } - } - di->di_printf("}"); - - if (insn & (1 << 22)) - di->di_printf("^"); -} - -static void -disasm_insn_ldrstr(const disasm_interface_t *di, u_int insn, u_int loc) -{ - int offset; - - offset = insn & 0xfff; - if ((insn & 0x032f0000) == 0x010f0000) { - /* rA = pc, immediate index */ - if (insn & 0x00800000) - loc += offset; - else - loc -= offset; - di->di_printaddr(loc + 8); - } else { - di->di_printf("[r%d", (insn >> 16) & 0x0f); - if ((insn & 0x03000fff) != 0x01000000) { - di->di_printf("%s, ", (insn & (1 << 24)) ? "" : "]"); - if (!(insn & 0x00800000)) - di->di_printf("-"); - if (insn & (1 << 25)) - disasm_register_shift(di, insn); - else - di->di_printf("#0x%03x", offset); - } - if (insn & (1 << 24)) - di->di_printf("]"); - } -} - -static void -disasm_insn_ldrhstrh(const disasm_interface_t *di, u_int insn, u_int loc) -{ - int offset; - - offset = ((insn & 0xf00) >> 4) | (insn & 0xf); - if ((insn & 0x004f0000) == 0x004f0000) { - /* rA = pc, immediate index */ - if (insn & 0x00800000) - loc += offset; - else - loc -= offset; - di->di_printaddr(loc + 8); - } else { - di->di_printf("[r%d", (insn >> 16) & 0x0f); - if ((insn & 0x01400f0f) != 0x01400000) { - di->di_printf("%s, ", (insn & (1 << 24)) ? "" : "]"); - if (!(insn & 0x00800000)) - di->di_printf("-"); - if (insn & (1 << 22)) - di->di_printf("#0x%02x", offset); - else - di->di_printf("r%d", (insn & 0x0f)); - } - if (insn & (1 << 24)) - di->di_printf("]"); - } -} - -static void -disasm_insn_ldcstc(const disasm_interface_t *di, u_int insn, u_int __unused loc) -{ - if (((insn >> 8) & 0xf) == 1) - di->di_printf("f%d, ", (insn >> 12) & 0x07); - else - di->di_printf("c%d, ", (insn >> 12) & 0x0f); - - di->di_printf("[r%d", (insn >> 16) & 0x0f); - - di->di_printf("%s, ", (insn & (1 << 24)) ? "" : "]"); - - if (!(insn & (1 << 23))) - di->di_printf("-"); - - di->di_printf("#0x%03x", (insn & 0xff) << 2); - - if (insn & (1 << 24)) - di->di_printf("]"); - - if (insn & (1 << 21)) - di->di_printf("!"); -} - -static u_int -disassemble_readword(u_int address) -{ - return(*((u_int *)address)); -} - -static void -disassemble_printaddr(u_int address) -{ - printf("0x%08x", address); -} - -static const disasm_interface_t disassemble_di = { - disassemble_readword, disassemble_printaddr, printf -}; - -void -disassemble(u_int address) -{ - - (void)disasm(&disassemble_di, address, 0); -} - -/* End of disassem.c */ diff --git a/libpixelflinger/codeflinger/disassem.h b/libpixelflinger/codeflinger/disassem.h deleted file mode 100644 index c7c60b695..000000000 --- a/libpixelflinger/codeflinger/disassem.h +++ /dev/null @@ -1,65 +0,0 @@ -/* $NetBSD: disassem.h,v 1.4 2001/03/04 04:15:58 matt Exp $ */ - -/*- - * Copyright (c) 1997 Mark Brinicombe. - * Copyright (c) 1997 Causality Limited. - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Mark Brinicombe. - * 4. The name of the company nor the name of the author may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Define the interface structure required by the disassembler. - * - * $FreeBSD: /repoman/r/ncvs/src/sys/arm/include/disassem.h,v 1.2 2005/01/05 21:58:48 imp Exp $ - */ - -#ifndef ANDROID_MACHINE_DISASSEM_H -#define ANDROID_MACHINE_DISASSEM_H - -#include - -#if __cplusplus -extern "C" { -#endif - -typedef struct { - u_int (*di_readword)(u_int); - void (*di_printaddr)(u_int); - int (*di_printf)(const char *, ...); -} disasm_interface_t; - -/* Prototypes for callable functions */ - -u_int disasm(const disasm_interface_t *, u_int, int); -void disassemble(u_int); - -#if __cplusplus -} -#endif - -#endif /* !ANDROID_MACHINE_DISASSEM_H */ diff --git a/libpixelflinger/codeflinger/load_store.cpp b/libpixelflinger/codeflinger/load_store.cpp deleted file mode 100644 index 4db0a4948..000000000 --- a/libpixelflinger/codeflinger/load_store.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/* libs/pixelflinger/codeflinger/load_store.cpp -** -** Copyright 2006, 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 "pixelflinger-code" - -#include -#include - -#include - -#include "GGLAssembler.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -void GGLAssembler::store(const pointer_t& addr, const pixel_t& s, uint32_t flags) -{ - const int bits = addr.size; - const int inc = (flags & WRITE_BACK)?1:0; - switch (bits) { - case 32: - if (inc) STR(AL, s.reg, addr.reg, immed12_post(4)); - else STR(AL, s.reg, addr.reg); - break; - case 24: - // 24 bits formats are a little special and used only for RGB - // 0x00BBGGRR is unpacked as R,G,B - STRB(AL, s.reg, addr.reg, immed12_pre(0)); - MOV(AL, 0, s.reg, reg_imm(s.reg, ROR, 8)); - STRB(AL, s.reg, addr.reg, immed12_pre(1)); - MOV(AL, 0, s.reg, reg_imm(s.reg, ROR, 8)); - STRB(AL, s.reg, addr.reg, immed12_pre(2)); - if (!(s.flags & CORRUPTIBLE)) { - MOV(AL, 0, s.reg, reg_imm(s.reg, ROR, 16)); - } - if (inc) - ADD(AL, 0, addr.reg, addr.reg, imm(3)); - break; - case 16: - if (inc) STRH(AL, s.reg, addr.reg, immed8_post(2)); - else STRH(AL, s.reg, addr.reg); - break; - case 8: - if (inc) STRB(AL, s.reg, addr.reg, immed12_post(1)); - else STRB(AL, s.reg, addr.reg); - break; - } -} - -void GGLAssembler::load(const pointer_t& addr, const pixel_t& s, uint32_t flags) -{ - Scratch scratches(registerFile()); - int s0; - - const int bits = addr.size; - const int inc = (flags & WRITE_BACK)?1:0; - switch (bits) { - case 32: - if (inc) LDR(AL, s.reg, addr.reg, immed12_post(4)); - else LDR(AL, s.reg, addr.reg); - break; - case 24: - // 24 bits formats are a little special and used only for RGB - // R,G,B is packed as 0x00BBGGRR - s0 = scratches.obtain(); - if (s.reg != addr.reg) { - LDRB(AL, s.reg, addr.reg, immed12_pre(0)); // R - LDRB(AL, s0, addr.reg, immed12_pre(1)); // G - ORR(AL, 0, s.reg, s.reg, reg_imm(s0, LSL, 8)); - LDRB(AL, s0, addr.reg, immed12_pre(2)); // B - ORR(AL, 0, s.reg, s.reg, reg_imm(s0, LSL, 16)); - } else { - int s1 = scratches.obtain(); - LDRB(AL, s1, addr.reg, immed12_pre(0)); // R - LDRB(AL, s0, addr.reg, immed12_pre(1)); // G - ORR(AL, 0, s1, s1, reg_imm(s0, LSL, 8)); - LDRB(AL, s0, addr.reg, immed12_pre(2)); // B - ORR(AL, 0, s.reg, s1, reg_imm(s0, LSL, 16)); - } - if (inc) - ADD(AL, 0, addr.reg, addr.reg, imm(3)); - break; - case 16: - if (inc) LDRH(AL, s.reg, addr.reg, immed8_post(2)); - else LDRH(AL, s.reg, addr.reg); - break; - case 8: - if (inc) LDRB(AL, s.reg, addr.reg, immed12_post(1)); - else LDRB(AL, s.reg, addr.reg); - break; - } -} - -void GGLAssembler::extract(integer_t& d, int s, int h, int l, int bits) -{ - const int maskLen = h-l; - -#ifdef __mips__ - assert(maskLen<=11); -#else - assert(maskLen<=8); -#endif - assert(h); - - if (h != bits) { - const int mask = ((1<> l; - s = d.reg; - } - - if (s != d.reg) { - MOV(AL, 0, d.reg, s); - } - - d.s = maskLen; -} - -void GGLAssembler::extract(integer_t& d, const pixel_t& s, int component) -{ - extract(d, s.reg, - s.format.c[component].h, - s.format.c[component].l, - s.size()); -} - -void GGLAssembler::extract(component_t& d, const pixel_t& s, int component) -{ - integer_t r(d.reg, 32, d.flags); - extract(r, s.reg, - s.format.c[component].h, - s.format.c[component].l, - s.size()); - d = component_t(r); -} - - -void GGLAssembler::expand(integer_t& d, const component_t& s, int dbits) -{ - if (s.l || (s.flags & CLEAR_HI)) { - extract(d, s.reg, s.h, s.l, 32); - expand(d, d, dbits); - } else { - expand(d, integer_t(s.reg, s.size(), s.flags), dbits); - } -} - -void GGLAssembler::expand(component_t& d, const component_t& s, int dbits) -{ - integer_t r(d.reg, 32, d.flags); - expand(r, s, dbits); - d = component_t(r); -} - -void GGLAssembler::expand(integer_t& dst, const integer_t& src, int dbits) -{ - assert(src.size()); - - int sbits = src.size(); - int s = src.reg; - int d = dst.reg; - - // be sure to set 'dst' after we read 'src' as they may be identical - dst.s = dbits; - dst.flags = 0; - - if (dbits<=sbits) { - if (s != d) { - MOV(AL, 0, d, s); - } - return; - } - - if (sbits == 1) { - RSB(AL, 0, d, s, reg_imm(s, LSL, dbits)); - // d = (s<> sbits; - dbits -= sbits; - sbits *= 2; - } while(dbits>0); - return; - } - - dbits -= sbits; - do { - ORR(AL, 0, d, s, reg_imm(s, LSL, sbits)); - // d |= d<0); -} - -void GGLAssembler::downshift( - pixel_t& d, int component, component_t s, const reg_t& dither) -{ - Scratch scratches(registerFile()); - - int sh = s.h; - int sl = s.l; - int maskHiBits = (sh!=32) ? ((s.flags & CLEAR_HI)?1:0) : 0; - int maskLoBits = (sl!=0) ? ((s.flags & CLEAR_LO)?1:0) : 0; - int sbits = sh - sl; - - int dh = d.format.c[component].h; - int dl = d.format.c[component].l; - int dbits = dh - dl; - int dithering = 0; - - ALOGE_IF(sbitsdbits) { - // see if we need to dither - dithering = mDithering; - } - - int ireg = d.reg; - if (!(d.flags & FIRST)) { - if (s.flags & CORRUPTIBLE) { - ireg = s.reg; - } else { - ireg = scratches.obtain(); - } - } - d.flags &= ~FIRST; - - if (maskHiBits) { - // we need to mask the high bits (and possibly the lowbits too) - // and we might be able to use immediate mask. - if (!dithering) { - // we don't do this if we only have maskLoBits because we can - // do it more efficiently below (in the case where dl=0) - const int offset = sh - dbits; - if (dbits<=8 && offset >= 0) { - const uint32_t mask = ((1<>dbits - 1/((1<>dbits)) - (V>>sbits)/((1<>sbits - // V/((1<<(sbits-dbits))-(1>>dbits)) - (V>>sbits)/(1-(1>>sbits)) - // - // By approximating (1>>dbits) and (1>>sbits) to 0: - // - // V>>(sbits-dbits) - V>>sbits - // - // A good approximation is V>>(sbits-dbits), - // but better one (needed for dithering) is: - // - // (V>>(sbits-dbits)<>sbits - // (V<>sbits - // (V - V>>dbits)>>(sbits-dbits) - - // Dithering is done here - if (dithering) { - comment("dithering"); - if (sl) { - MOV(AL, 0, ireg, reg_imm(s.reg, LSR, sl)); - sh -= sl; - sl = 0; - s.reg = ireg; - } - // scaling (V-V>>dbits) - SUB(AL, 0, ireg, s.reg, reg_imm(s.reg, LSR, dbits)); - const int shift = (GGL_DITHER_BITS - (sbits-dbits)); - if (shift>0) ADD(AL, 0, ireg, ireg, reg_imm(dither.reg, LSR, shift)); - else if (shift<0) ADD(AL, 0, ireg, ireg, reg_imm(dither.reg, LSL,-shift)); - else ADD(AL, 0, ireg, ireg, dither.reg); - s.reg = ireg; - } - - if ((maskLoBits|dithering) && (sh > dbits)) { - int shift = sh-dbits; - if (dl) { - MOV(AL, 0, ireg, reg_imm(s.reg, LSR, shift)); - if (ireg == d.reg) { - MOV(AL, 0, d.reg, reg_imm(ireg, LSL, dl)); - } else { - ORR(AL, 0, d.reg, d.reg, reg_imm(ireg, LSL, dl)); - } - } else { - if (ireg == d.reg) { - MOV(AL, 0, d.reg, reg_imm(s.reg, LSR, shift)); - } else { - ORR(AL, 0, d.reg, d.reg, reg_imm(s.reg, LSR, shift)); - } - } - } else { - int shift = sh-dh; - if (shift>0) { - if (ireg == d.reg) { - MOV(AL, 0, d.reg, reg_imm(s.reg, LSR, shift)); - } else { - ORR(AL, 0, d.reg, d.reg, reg_imm(s.reg, LSR, shift)); - } - } else if (shift<0) { - if (ireg == d.reg) { - MOV(AL, 0, d.reg, reg_imm(s.reg, LSL, -shift)); - } else { - ORR(AL, 0, d.reg, d.reg, reg_imm(s.reg, LSL, -shift)); - } - } else { - if (ireg == d.reg) { - if (s.reg != d.reg) { - MOV(AL, 0, d.reg, s.reg); - } - } else { - ORR(AL, 0, d.reg, d.reg, s.reg); - } - } - } -} - -}; // namespace android diff --git a/libpixelflinger/codeflinger/mips64_disassem.c b/libpixelflinger/codeflinger/mips64_disassem.c deleted file mode 100644 index 852829984..000000000 --- a/libpixelflinger/codeflinger/mips64_disassem.c +++ /dev/null @@ -1,584 +0,0 @@ -/* $NetBSD: db_disasm.c,v 1.19 2007/02/28 04:21:53 thorpej Exp $ */ - -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)kadb.c 8.1 (Berkeley) 6/10/93 - */ - -#include -#include -#include -#include -#include -#include - -#include - -#include "mips_opcode.h" - -#define __unused __attribute__((__unused__)) - -static char *sprintf_buffer; -static int sprintf_buf_len; - -typedef uint64_t db_addr_t; -static void db_printf(const char* fmt, ...); - -static const char * const op_name[64] = { -/* 0 */ "spec", "bcond", "j", "jal", "beq", "bne", "blez", "bgtz", -/* 8 */ "pop10", "addiu", "slti", "sltiu", "andi", "ori", "xori", "aui", -/*16 */ "cop0", "cop1", "cop2", "?", "?", "?", "pop26", "pop27", -/*24 */ "pop30", "daddiu", "?", "?", "?", "daui", "msa", "op37", -/*32 */ "lb", "lh", "?", "lw", "lbu", "lhu", "?", "lwu", -/*40 */ "sb", "sh", "?", "sw", "?", "?", "?", "?", -/*48 */ "?", "lwc1", "bc", "?", "?", "ldc1", "pop66", "ld", -/*56 */ "?", "swc1", "balc", "pcrel", "?", "sdc1", "pop76", "sd" -}; - -static const char * const spec_name[64] = { -/* 0 */ "sll", "?", "srl", "sra", "sllv", "?", "srlv", "srav", -/* 8 */ "?", "jalr", "?", "?", "syscall", "break", "sdbpp", "sync", -/*16 */ "clz", "clo", "dclz", "dclo", "dsllv", "dlsa", "dsrlv", "dsrav", -/*24 */ "sop30", "sop31", "sop32", "sop33", "sop34", "sop35", "sop36", "sop37", -/*32 */ "add", "addu", "sub", "subu", "and", "or", "xor", "nor", -/*40 */ "?", "?", "slt", "sltu", "dadd", "daddu", "dsub", "dsubu", -/*48 */ "tge", "tgeu", "tlt", "tltu", "teq", "seleqz", "tne", "selnez", -/*56 */ "dsll", "?", "dsrl", "dsra", "dsll32", "?", "dsrl32", "dsra32" -}; - -static const char * const bcond_name[32] = { -/* 0 */ "bltz", "bgez", "?", "?", "?", "?", "dahi", "?", -/* 8 */ "?", "?", "?", "?", "?", "?", "?", "?", -/*16 */ "nal", "bal", "?", "?", "?", "?", "?", "sigrie", -/*24 */ "?", "?", "?", "?", "?", "?", "dati", "synci", -}; - -static const char * const cop1_name[64] = { -/* 0 */ "fadd", "fsub", "fmpy", "fdiv", "fsqrt","fabs", "fmov", "fneg", -/* 8 */ "fop08","fop09","fop0a","fop0b","fop0c","fop0d","fop0e","fop0f", -/*16 */ "fop10","fop11","fop12","fop13","fop14","fop15","fop16","fop17", -/*24 */ "fop18","fop19","fop1a","fop1b","fop1c","fop1d","fop1e","fop1f", -/*32 */ "fcvts","fcvtd","fcvte","fop23","fcvtw","fop25","fop26","fop27", -/*40 */ "fop28","fop29","fop2a","fop2b","fop2c","fop2d","fop2e","fop2f", -/*48 */ "fcmp.f","fcmp.un","fcmp.eq","fcmp.ueq","fcmp.olt","fcmp.ult", - "fcmp.ole","fcmp.ule", -/*56 */ "fcmp.sf","fcmp.ngle","fcmp.seq","fcmp.ngl","fcmp.lt","fcmp.nge", - "fcmp.le","fcmp.ngt" -}; - -static const char * const fmt_name[16] = { - "s", "d", "e", "fmt3", - "w", "fmt5", "fmt6", "fmt7", - "fmt8", "fmt9", "fmta", "fmtb", - "fmtc", "fmtd", "fmte", "fmtf" -}; - -static char * const mips_reg_name[32] = { - "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", - "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3", - "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", - "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" -}; - -static char * alt_arm_reg_name[32] = { // hacked names for comparison with ARM code - "zero", "at", "r0", "r1", "r2", "r3", "r4", "r5", - "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", - "r14", "r15", "at2", "cmp", "s4", "s5", "s6", "s7", - "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" -}; - -static char * const * reg_name = &mips_reg_name[0]; - -static const char * const c0_opname[64] = { - "c0op00","tlbr", "tlbwi", "c0op03","c0op04","c0op05","tlbwr", "c0op07", - "tlbp", "c0op11","c0op12","c0op13","c0op14","c0op15","c0op16","c0op17", - "rfe", "c0op21","c0op22","c0op23","c0op24","c0op25","c0op26","c0op27", - "eret", "c0op31","c0op32","c0op33","c0op34","c0op35","c0op36","c0op37", - "c0op40","c0op41","c0op42","c0op43","c0op44","c0op45","c0op46","c0op47", - "c0op50","c0op51","c0op52","c0op53","c0op54","c0op55","c0op56","c0op57", - "c0op60","c0op61","c0op62","c0op63","c0op64","c0op65","c0op66","c0op67", - "c0op70","c0op71","c0op72","c0op73","c0op74","c0op75","c0op77","c0op77", -}; - -static const char * const c0_reg[32] = { - "index", "random", "tlblo0", "tlblo1", - "context", "pagemask", "wired", "cp0r7", - "badvaddr", "count", "tlbhi", "compare", - "status", "cause", "epc", "prid", - "config", "lladdr", "watchlo", "watchhi", - "xcontext", "cp0r21", "cp0r22", "debug", - "depc", "perfcnt", "ecc", "cacheerr", - "taglo", "taghi", "errepc", "desave" -}; - -static void print_addr(db_addr_t); -db_addr_t mips_disassem(db_addr_t loc, char *di_buffer, int alt_dis_format); - - -/* - * Disassemble instruction 'insn' nominally at 'loc'. - * 'loc' may in fact contain a breakpoint instruction. - */ -static db_addr_t -db_disasm_insn(int insn, db_addr_t loc, bool altfmt __unused) -{ - bool bdslot = false; - InstFmt i; - - i.word = insn; - - switch (i.JType.op) { - case OP_SPECIAL: - if (i.word == 0) { - db_printf("nop"); - break; - } - if (i.word == 0x0080) { - db_printf("NIY"); - break; - } - if (i.word == 0x00c0) { - db_printf("NOT IMPL"); - break; - } - /* Special cases -------------------------------------------------- - * "addu" is a "move" only in 32-bit mode. What's the correct - * answer - never decode addu/daddu as "move"? - */ - if ( (i.RType.func == OP_ADDU && i.RType.rt == 0) || - (i.RType.func == OP_OR && i.RType.rt == 0) ) { - db_printf("move\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rs]); - break; - } - - if (i.RType.func == OP_SRL && (i.RType.rs & 1) == 1) { - db_printf("rotr\t%s,%s,%d", reg_name[i.RType.rd], - reg_name[i.RType.rt], i.RType.shamt); - break; - } - if (i.RType.func == OP_SRLV && (i.RType.shamt & 1) == 1) { - db_printf("rotrv\t%s,%s,%s", reg_name[i.RType.rd], - reg_name[i.RType.rt], reg_name[i.RType.rs]); - break; - } - - if (i.RType.func == OP_SOP30) { - if (i.RType.shamt == OP_MUL) { - db_printf("mul"); - } else if (i.RType.shamt == OP_MUH) { - db_printf("muh"); - } - db_printf("\t%s,%s,%s", reg_name[i.RType.rd], - reg_name[i.RType.rs], reg_name[i.RType.rt]); - break; - } - if (i.RType.func == OP_SOP31) { - if (i.RType.shamt == OP_MUL) { - db_printf("mulu"); - } else if (i.RType.shamt == OP_MUH) { - db_printf("muhu"); - } - db_printf("\t%s,%s,%s", reg_name[i.RType.rd], - reg_name[i.RType.rs], reg_name[i.RType.rt]); - break; - } - - if (i.RType.func == OP_JALR && i.RType.rd == 0) { - db_printf("jr\t%s", reg_name[i.RType.rs]); - bdslot = true; - break; - } - - db_printf("%s", spec_name[i.RType.func]); - switch (i.RType.func) { - case OP_SLL: - case OP_SRL: - case OP_SRA: - case OP_DSLL: - - case OP_DSRL: - case OP_DSRA: - case OP_DSLL32: - case OP_DSRL32: - case OP_DSRA32: - db_printf("\t%s,%s,%d", - reg_name[i.RType.rd], - reg_name[i.RType.rt], - i.RType.shamt); - break; - - case OP_SLLV: - case OP_SRLV: - case OP_SRAV: - case OP_DSLLV: - case OP_DSRLV: - case OP_DSRAV: - db_printf("\t%s,%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rt], - reg_name[i.RType.rs]); - break; - - case OP_CLZ: - case OP_CLO: - case OP_DCLZ: - case OP_DCLO: - db_printf("\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rs]); - break; - - case OP_JALR: - db_printf("\t"); - if (i.RType.rd != 31) { - db_printf("%s,", reg_name[i.RType.rd]); - } - db_printf("%s", reg_name[i.RType.rs]); - bdslot = true; - break; - - case OP_SYSCALL: - case OP_SYNC: - break; - - case OP_BREAK: - db_printf("\t%d", (i.RType.rs << 5) | i.RType.rt); - break; - - default: - db_printf("\t%s,%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rs], - reg_name[i.RType.rt]); - } - break; - - case OP_SPECIAL3: - if (i.RType.func == OP_EXT) - db_printf("ext\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt, - i.RType.rd+1); - else if (i.RType.func == OP_DEXT) - db_printf("dext\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt, - i.RType.rd+1); - else if (i.RType.func == OP_DEXTM) - db_printf("dextm\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt, - i.RType.rd+33); - else if (i.RType.func == OP_DEXTU) - db_printf("dextu\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt+32, - i.RType.rd+1); - else if (i.RType.func == OP_INS) - db_printf("ins\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt, - i.RType.rd-i.RType.shamt+1); - else if (i.RType.func == OP_DINS) - db_printf("dins\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt, - i.RType.rd-i.RType.shamt+1); - else if (i.RType.func == OP_DINSM) - db_printf("dinsm\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt, - i.RType.rd-i.RType.shamt+33); - else if (i.RType.func == OP_DINSU) - db_printf("dinsu\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt+32, - i.RType.rd-i.RType.shamt+1); - else if (i.RType.func == OP_BSHFL && i.RType.shamt == OP_WSBH) - db_printf("wsbh\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rt]); - else if (i.RType.func == OP_BSHFL && i.RType.shamt == OP_SEB) - db_printf("seb\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rt]); - else if (i.RType.func == OP_BSHFL && i.RType.shamt == OP_SEH) - db_printf("seh\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rt]); - else if (i.RType.func == OP_RDHWR) - db_printf("rdhwr\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rt]); - else - db_printf("Unknown"); - break; - - case OP_BCOND: - db_printf("%s\t%s,", bcond_name[i.IType.rt], - reg_name[i.IType.rs]); - goto pr_displ; - - case OP_BLEZ: - case OP_BGTZ: - db_printf("%s\t%s,", op_name[i.IType.op], - reg_name[i.IType.rs]); - goto pr_displ; - - case OP_BEQ: - if (i.IType.rs == 0 && i.IType.rt == 0) { - db_printf("b\t"); - goto pr_displ; - } - /* FALLTHROUGH */ - case OP_BNE: - db_printf("%s\t%s,%s,", op_name[i.IType.op], - reg_name[i.IType.rs], - reg_name[i.IType.rt]); - pr_displ: - print_addr(loc + 4 + ((short)i.IType.imm << 2)); - bdslot = true; - break; - - case OP_COP0: - switch (i.RType.rs) { - case OP_BCx: - case OP_BCy: - - db_printf("bc0%c\t", - "ft"[i.RType.rt & COPz_BC_TF_MASK]); - goto pr_displ; - - case OP_MT: - db_printf("mtc0\t%s,%s", - reg_name[i.RType.rt], - c0_reg[i.RType.rd]); - break; - - case OP_DMT: - db_printf("dmtc0\t%s,%s", - reg_name[i.RType.rt], - c0_reg[i.RType.rd]); - break; - - case OP_MF: - db_printf("mfc0\t%s,%s", - reg_name[i.RType.rt], - c0_reg[i.RType.rd]); - break; - - case OP_DMF: - db_printf("dmfc0\t%s,%s", - reg_name[i.RType.rt], - c0_reg[i.RType.rd]); - break; - - default: - db_printf("%s", c0_opname[i.FRType.func]); - } - break; - - case OP_COP1: - switch (i.RType.rs) { - case OP_BCx: - case OP_BCy: - db_printf("bc1%c\t", - "ft"[i.RType.rt & COPz_BC_TF_MASK]); - goto pr_displ; - - case OP_MT: - db_printf("mtc1\t%s,f%d", - reg_name[i.RType.rt], - i.RType.rd); - break; - - case OP_MF: - db_printf("mfc1\t%s,f%d", - reg_name[i.RType.rt], - i.RType.rd); - break; - - case OP_CT: - db_printf("ctc1\t%s,f%d", - reg_name[i.RType.rt], - i.RType.rd); - break; - - case OP_CF: - db_printf("cfc1\t%s,f%d", - reg_name[i.RType.rt], - i.RType.rd); - break; - - default: - db_printf("%s.%s\tf%d,f%d,f%d", - cop1_name[i.FRType.func], - fmt_name[i.FRType.fmt], - i.FRType.fd, i.FRType.fs, i.FRType.ft); - } - break; - - case OP_J: - case OP_JAL: - db_printf("%s\t", op_name[i.JType.op]); - print_addr((loc & 0xFFFFFFFFF0000000) | (i.JType.target << 2)); - bdslot = true; - break; - - case OP_LWC1: - case OP_SWC1: - db_printf("%s\tf%d,", op_name[i.IType.op], - i.IType.rt); - goto loadstore; - - case OP_LB: - case OP_LH: - case OP_LW: - case OP_LD: - case OP_LBU: - case OP_LHU: - case OP_LWU: - case OP_SB: - case OP_SH: - case OP_SW: - case OP_SD: - db_printf("%s\t%s,", op_name[i.IType.op], - reg_name[i.IType.rt]); - loadstore: - db_printf("%d(%s)", (short)i.IType.imm, - reg_name[i.IType.rs]); - break; - - case OP_ORI: - case OP_XORI: - if (i.IType.rs == 0) { - db_printf("li\t%s,0x%x", - reg_name[i.IType.rt], - i.IType.imm); - break; - } - /* FALLTHROUGH */ - case OP_ANDI: - db_printf("%s\t%s,%s,0x%x", op_name[i.IType.op], - reg_name[i.IType.rt], - reg_name[i.IType.rs], - i.IType.imm); - break; - - case OP_AUI: - if (i.IType.rs == 0) { - db_printf("lui\t%s,0x%x", reg_name[i.IType.rt], - i.IType.imm); - } else { - db_printf("%s\t%s,%s,%d", op_name[i.IType.op], - reg_name[i.IType.rt], reg_name[i.IType.rs], - (short)i.IType.imm); - } - break; - - case OP_ADDIU: - case OP_DADDIU: - if (i.IType.rs == 0) { - db_printf("li\t%s,%d", - reg_name[i.IType.rt], - (short)i.IType.imm); - break; - } - /* FALLTHROUGH */ - default: - db_printf("%s\t%s,%s,%d", op_name[i.IType.op], - reg_name[i.IType.rt], - reg_name[i.IType.rs], - (short)i.IType.imm); - } - // db_printf("\n"); - // if (bdslot) { - // db_printf(" bd: "); - // mips_disassem(loc+4); - // return (loc + 8); - // } - return (loc + 4); -} - -static void -print_addr(db_addr_t loc) -{ - db_printf("0x%08lx", loc); -} - -static void db_printf(const char* fmt, ...) -{ - int cnt; - va_list argp; - va_start(argp, fmt); - if (sprintf_buffer) { - cnt = vsnprintf(sprintf_buffer, sprintf_buf_len, fmt, argp); - sprintf_buffer += cnt; - sprintf_buf_len -= cnt; - } else { - vprintf(fmt, argp); - } - va_end(argp); -} - -/* - * Disassemble instruction at 'loc'. - * Return address of start of next instruction. - * Since this function is used by 'examine' and by 'step' - * "next instruction" does NOT mean the next instruction to - * be executed but the 'linear' next instruction. - */ -db_addr_t -mips_disassem(db_addr_t loc, char *di_buffer, int alt_dis_format) -{ - u_int32_t instr; - - if (alt_dis_format) { // use ARM register names for disassembly - reg_name = &alt_arm_reg_name[0]; - } - - sprintf_buffer = di_buffer; // quick 'n' dirty printf() vs sprintf() - sprintf_buf_len = 39; // should be passed in - - instr = *(u_int32_t *)loc; - return (db_disasm_insn(instr, loc, false)); -} diff --git a/libpixelflinger/codeflinger/mips64_disassem.h b/libpixelflinger/codeflinger/mips64_disassem.h deleted file mode 100644 index c94f04f9b..000000000 --- a/libpixelflinger/codeflinger/mips64_disassem.h +++ /dev/null @@ -1,56 +0,0 @@ -/* $NetBSD: db_disasm.c,v 1.19 2007/02/28 04:21:53 thorpej Exp $ */ - -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)kadb.c 8.1 (Berkeley) 6/10/93 - */ - - - -#ifndef ANDROID_MIPS_DISASSEM_H -#define ANDROID_MIPS_DISASSEM_H - -#include - -#if __cplusplus -extern "C" { -#endif - -/* Prototypes for callable functions */ - -void mips_disassem(uint32_t *location, char *di_buffer, int alt_fmt); - -#if __cplusplus -} -#endif - -#endif /* !ANDROID_MIPS_DISASSEM_H */ diff --git a/libpixelflinger/codeflinger/mips_disassem.c b/libpixelflinger/codeflinger/mips_disassem.c deleted file mode 100644 index 1fe680675..000000000 --- a/libpixelflinger/codeflinger/mips_disassem.c +++ /dev/null @@ -1,592 +0,0 @@ -/* $NetBSD: db_disasm.c,v 1.19 2007/02/28 04:21:53 thorpej Exp $ */ - -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)kadb.c 8.1 (Berkeley) 6/10/93 - */ - -#include -#include -#include -#include -#include - -#include -#include "mips_opcode.h" - - -// #include -// #include - -// #include -// #include -/*#include */ -// #include - -// #include -// #include -// #include -// #include - -#define __unused __attribute__((__unused__)) - -static char *sprintf_buffer; -static int sprintf_buf_len; - - -typedef uint32_t db_addr_t; -static void db_printf(const char* fmt, ...); - -static const char * const op_name[64] = { -/* 0 */ "spec", "bcond","j ", "jal", "beq", "bne", "blez", "bgtz", -/* 8 */ "addi", "addiu","slti", "sltiu","andi", "ori", "xori", "lui", -/*16 */ "cop0", "cop1", "cop2", "cop3", "beql", "bnel", "blezl","bgtzl", -/*24 */ "daddi","daddiu","ldl", "ldr", "op34", "op35", "op36", "op37", -/*32 */ "lb ", "lh ", "lwl", "lw ", "lbu", "lhu", "lwr", "lwu", -/*40 */ "sb ", "sh ", "swl", "sw ", "sdl", "sdr", "swr", "cache", -/*48 */ "ll ", "lwc1", "lwc2", "lwc3", "lld", "ldc1", "ldc2", "ld ", -/*56 */ "sc ", "swc1", "swc2", "swc3", "scd", "sdc1", "sdc2", "sd " -}; - -static const char * const spec_name[64] = { -/* 0 */ "sll", "spec01","srl", "sra", "sllv", "spec05","srlv","srav", -/* 8 */ "jr", "jalr", "movz","movn","syscall","break","spec16","sync", -/*16 */ "mfhi", "mthi", "mflo", "mtlo", "dsllv","spec25","dsrlv","dsrav", -/*24 */ "mult", "multu","div", "divu", "dmult","dmultu","ddiv","ddivu", -/*32 */ "add", "addu", "sub", "subu", "and", "or ", "xor", "nor", -/*40 */ "spec50","spec51","slt","sltu", "dadd","daddu","dsub","dsubu", -/*48 */ "tge","tgeu","tlt","tltu","teq","spec65","tne","spec67", -/*56 */ "dsll","spec71","dsrl","dsra","dsll32","spec75","dsrl32","dsra32" -}; - -static const char * const spec2_name[64] = { /* QED RM4650, R5000, etc. */ -/* 0x00 */ "madd", "maddu", "mul", "spec3", "msub", "msubu", "rsrv6", "rsrv7", -/* 0x08 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", -/* 0x10 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", -/* 0x18 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", -/* 0x20 */ "clz", "clo", "rsrv", "rsrv", "dclz", "dclo", "rsrv", "rsrv", -/* 0x28 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", -/* 0x30 */ "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", "rsrv", -/* 0x38 */ "rsrv", "rsrv", "rsrv", "resv", "rsrv", "rsrv", "rsrv", "sdbbp" -}; - -static const char * const bcond_name[32] = { -/* 0 */ "bltz", "bgez", "bltzl", "bgezl", "?", "?", "?", "?", -/* 8 */ "tgei", "tgeiu", "tlti", "tltiu", "teqi", "?", "tnei", "?", -/*16 */ "bltzal", "bgezal", "bltzall", "bgezall", "?", "?", "?", "?", -/*24 */ "?", "?", "?", "?", "?", "?", "?", "?", -}; - -static const char * const cop1_name[64] = { -/* 0 */ "fadd", "fsub", "fmpy", "fdiv", "fsqrt","fabs", "fmov", "fneg", -/* 8 */ "fop08","fop09","fop0a","fop0b","fop0c","fop0d","fop0e","fop0f", -/*16 */ "fop10","fop11","fop12","fop13","fop14","fop15","fop16","fop17", -/*24 */ "fop18","fop19","fop1a","fop1b","fop1c","fop1d","fop1e","fop1f", -/*32 */ "fcvts","fcvtd","fcvte","fop23","fcvtw","fop25","fop26","fop27", -/*40 */ "fop28","fop29","fop2a","fop2b","fop2c","fop2d","fop2e","fop2f", -/*48 */ "fcmp.f","fcmp.un","fcmp.eq","fcmp.ueq","fcmp.olt","fcmp.ult", - "fcmp.ole","fcmp.ule", -/*56 */ "fcmp.sf","fcmp.ngle","fcmp.seq","fcmp.ngl","fcmp.lt","fcmp.nge", - "fcmp.le","fcmp.ngt" -}; - -static const char * const fmt_name[16] = { - "s", "d", "e", "fmt3", - "w", "fmt5", "fmt6", "fmt7", - "fmt8", "fmt9", "fmta", "fmtb", - "fmtc", "fmtd", "fmte", "fmtf" -}; - -#if defined(__mips_n32) || defined(__mips_n64) -static char * const reg_name[32] = { - "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", - "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3", - "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", - "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" -}; -#else - -static char * alt_arm_reg_name[32] = { // hacked names for comparison with ARM code - "zero", "at", "r0", "r1", "r2", "r3", "r4", "r5", - "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", - "r14", "r15", "at2", "cmp", "s4", "s5", "s6", "s7", - "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" -}; - -static char * mips_reg_name[32] = { - "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", - "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", - "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", - "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" -}; - -static char ** reg_name = &mips_reg_name[0]; - -#endif /* __mips_n32 || __mips_n64 */ - -static const char * const c0_opname[64] = { - "c0op00","tlbr", "tlbwi", "c0op03","c0op04","c0op05","tlbwr", "c0op07", - "tlbp", "c0op11","c0op12","c0op13","c0op14","c0op15","c0op16","c0op17", - "rfe", "c0op21","c0op22","c0op23","c0op24","c0op25","c0op26","c0op27", - "eret", "c0op31","c0op32","c0op33","c0op34","c0op35","c0op36","c0op37", - "c0op40","c0op41","c0op42","c0op43","c0op44","c0op45","c0op46","c0op47", - "c0op50","c0op51","c0op52","c0op53","c0op54","c0op55","c0op56","c0op57", - "c0op60","c0op61","c0op62","c0op63","c0op64","c0op65","c0op66","c0op67", - "c0op70","c0op71","c0op72","c0op73","c0op74","c0op75","c0op77","c0op77", -}; - -static const char * const c0_reg[32] = { - "index", "random", "tlblo0", "tlblo1", - "context", "pagemask", "wired", "cp0r7", - "badvaddr", "count", "tlbhi", "compare", - "status", "cause", "epc", "prid", - "config", "lladdr", "watchlo", "watchhi", - "xcontext", "cp0r21", "cp0r22", "debug", - "depc", "perfcnt", "ecc", "cacheerr", - "taglo", "taghi", "errepc", "desave" -}; - -static void print_addr(db_addr_t); -db_addr_t mips_disassem(db_addr_t loc, char *di_buffer, int alt_dis_format); - - -/* - * Disassemble instruction 'insn' nominally at 'loc'. - * 'loc' may in fact contain a breakpoint instruction. - */ -static db_addr_t -db_disasm_insn(int insn, db_addr_t loc, bool altfmt __unused) -{ - bool bdslot = false; - InstFmt i; - - i.word = insn; - - switch (i.JType.op) { - case OP_SPECIAL: - if (i.word == 0) { - db_printf("nop"); - break; - } - if (i.word == 0x0080) { - db_printf("NIY"); - break; - } - if (i.word == 0x00c0) { - db_printf("NOT IMPL"); - break; - } - /* Special cases -------------------------------------------------- - * "addu" is a "move" only in 32-bit mode. What's the correct - * answer - never decode addu/daddu as "move"? - */ - if ( (i.RType.func == OP_ADDU && i.RType.rt == 0) || - (i.RType.func == OP_OR && i.RType.rt == 0) ) { - db_printf("move\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rs]); - break; - } - // mips32r2, rotr & rotrv - if (i.RType.func == OP_SRL && (i.RType.rs & 1) == 1) { - db_printf("rotr\t%s,%s,%d", reg_name[i.RType.rd], - reg_name[i.RType.rt], i.RType.shamt); - break; - } - if (i.RType.func == OP_SRLV && (i.RType.shamt & 1) == 1) { - db_printf("rotrv\t%s,%s,%s", reg_name[i.RType.rd], - reg_name[i.RType.rt], reg_name[i.RType.rs]); - break; - } - - - db_printf("%s", spec_name[i.RType.func]); - switch (i.RType.func) { - case OP_SLL: - case OP_SRL: - case OP_SRA: - case OP_DSLL: - - case OP_DSRL: - case OP_DSRA: - case OP_DSLL32: - case OP_DSRL32: - case OP_DSRA32: - db_printf("\t%s,%s,%d", - reg_name[i.RType.rd], - reg_name[i.RType.rt], - i.RType.shamt); - break; - - case OP_SLLV: - case OP_SRLV: - case OP_SRAV: - case OP_DSLLV: - case OP_DSRLV: - case OP_DSRAV: - db_printf("\t%s,%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rt], - reg_name[i.RType.rs]); - break; - - case OP_MFHI: - case OP_MFLO: - db_printf("\t%s", reg_name[i.RType.rd]); - break; - - case OP_JR: - case OP_JALR: - db_printf("\t%s", reg_name[i.RType.rs]); - bdslot = true; - break; - case OP_MTLO: - case OP_MTHI: - db_printf("\t%s", reg_name[i.RType.rs]); - break; - - case OP_MULT: - case OP_MULTU: - case OP_DMULT: - case OP_DMULTU: - case OP_DIV: - case OP_DIVU: - case OP_DDIV: - case OP_DDIVU: - db_printf("\t%s,%s", - reg_name[i.RType.rs], - reg_name[i.RType.rt]); - break; - - - case OP_SYSCALL: - case OP_SYNC: - break; - - case OP_BREAK: - db_printf("\t%d", (i.RType.rs << 5) | i.RType.rt); - break; - - default: - db_printf("\t%s,%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rs], - reg_name[i.RType.rt]); - } - break; - - case OP_SPECIAL2: - if (i.RType.func == OP_MUL) - db_printf("%s\t%s,%s,%s", - spec2_name[i.RType.func & 0x3f], - reg_name[i.RType.rd], - reg_name[i.RType.rs], - reg_name[i.RType.rt]); - else - db_printf("%s\t%s,%s", - spec2_name[i.RType.func & 0x3f], - reg_name[i.RType.rs], - reg_name[i.RType.rt]); - - break; - - case OP_SPECIAL3: - if (i.RType.func == OP_EXT) - db_printf("ext\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt, - i.RType.rd+1); - else if (i.RType.func == OP_INS) - db_printf("ins\t%s,%s,%d,%d", - reg_name[i.RType.rt], - reg_name[i.RType.rs], - i.RType.shamt, - i.RType.rd-i.RType.shamt+1); - else if (i.RType.func == OP_BSHFL && i.RType.shamt == OP_WSBH) - db_printf("wsbh\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rt]); - else if (i.RType.func == OP_BSHFL && i.RType.shamt == OP_SEB) - db_printf("seb\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rt]); - else if (i.RType.func == OP_BSHFL && i.RType.shamt == OP_SEH) - db_printf("seh\t%s,%s", - reg_name[i.RType.rd], - reg_name[i.RType.rt]); - else - db_printf("Unknown"); - break; - - case OP_BCOND: - db_printf("%s\t%s,", bcond_name[i.IType.rt], - reg_name[i.IType.rs]); - goto pr_displ; - - case OP_BLEZ: - case OP_BLEZL: - case OP_BGTZ: - case OP_BGTZL: - db_printf("%s\t%s,", op_name[i.IType.op], - reg_name[i.IType.rs]); - goto pr_displ; - - case OP_BEQ: - case OP_BEQL: - if (i.IType.rs == 0 && i.IType.rt == 0) { - db_printf("b \t"); - goto pr_displ; - } - /* FALLTHROUGH */ - case OP_BNE: - case OP_BNEL: - db_printf("%s\t%s,%s,", op_name[i.IType.op], - reg_name[i.IType.rs], - reg_name[i.IType.rt]); - pr_displ: - print_addr(loc + 4 + ((short)i.IType.imm << 2)); - bdslot = true; - break; - - case OP_COP0: - switch (i.RType.rs) { - case OP_BCx: - case OP_BCy: - - db_printf("bc0%c\t", - "ft"[i.RType.rt & COPz_BC_TF_MASK]); - goto pr_displ; - - case OP_MT: - db_printf("mtc0\t%s,%s", - reg_name[i.RType.rt], - c0_reg[i.RType.rd]); - break; - - case OP_DMT: - db_printf("dmtc0\t%s,%s", - reg_name[i.RType.rt], - c0_reg[i.RType.rd]); - break; - - case OP_MF: - db_printf("mfc0\t%s,%s", - reg_name[i.RType.rt], - c0_reg[i.RType.rd]); - break; - - case OP_DMF: - db_printf("dmfc0\t%s,%s", - reg_name[i.RType.rt], - c0_reg[i.RType.rd]); - break; - - default: - db_printf("%s", c0_opname[i.FRType.func]); - } - break; - - case OP_COP1: - switch (i.RType.rs) { - case OP_BCx: - case OP_BCy: - db_printf("bc1%c\t", - "ft"[i.RType.rt & COPz_BC_TF_MASK]); - goto pr_displ; - - case OP_MT: - db_printf("mtc1\t%s,f%d", - reg_name[i.RType.rt], - i.RType.rd); - break; - - case OP_MF: - db_printf("mfc1\t%s,f%d", - reg_name[i.RType.rt], - i.RType.rd); - break; - - case OP_CT: - db_printf("ctc1\t%s,f%d", - reg_name[i.RType.rt], - i.RType.rd); - break; - - case OP_CF: - db_printf("cfc1\t%s,f%d", - reg_name[i.RType.rt], - i.RType.rd); - break; - - default: - db_printf("%s.%s\tf%d,f%d,f%d", - cop1_name[i.FRType.func], - fmt_name[i.FRType.fmt], - i.FRType.fd, i.FRType.fs, i.FRType.ft); - } - break; - - case OP_J: - case OP_JAL: - db_printf("%s\t", op_name[i.JType.op]); - print_addr((loc & 0xF0000000) | (i.JType.target << 2)); - bdslot = true; - break; - - case OP_LWC1: - case OP_SWC1: - db_printf("%s\tf%d,", op_name[i.IType.op], - i.IType.rt); - goto loadstore; - - case OP_LB: - case OP_LH: - case OP_LW: - case OP_LD: - case OP_LBU: - case OP_LHU: - case OP_LWU: - case OP_SB: - case OP_SH: - case OP_SW: - case OP_SD: - db_printf("%s\t%s,", op_name[i.IType.op], - reg_name[i.IType.rt]); - loadstore: - db_printf("%d(%s)", (short)i.IType.imm, - reg_name[i.IType.rs]); - break; - - case OP_ORI: - case OP_XORI: - if (i.IType.rs == 0) { - db_printf("li\t%s,0x%x", - reg_name[i.IType.rt], - i.IType.imm); - break; - } - /* FALLTHROUGH */ - case OP_ANDI: - db_printf("%s\t%s,%s,0x%x", op_name[i.IType.op], - reg_name[i.IType.rt], - reg_name[i.IType.rs], - i.IType.imm); - break; - - case OP_LUI: - db_printf("%s\t%s,0x%x", op_name[i.IType.op], - reg_name[i.IType.rt], - i.IType.imm); - break; - - case OP_CACHE: - db_printf("%s\t0x%x,0x%x(%s)", - op_name[i.IType.op], - i.IType.rt, - i.IType.imm, - reg_name[i.IType.rs]); - break; - - case OP_ADDI: - case OP_DADDI: - case OP_ADDIU: - case OP_DADDIU: - if (i.IType.rs == 0) { - db_printf("li\t%s,%d", - reg_name[i.IType.rt], - (short)i.IType.imm); - break; - } - /* FALLTHROUGH */ - default: - db_printf("%s\t%s,%s,%d", op_name[i.IType.op], - reg_name[i.IType.rt], - reg_name[i.IType.rs], - (short)i.IType.imm); - } - // db_printf("\n"); - // if (bdslot) { - // db_printf(" bd: "); - // mips_disassem(loc+4); - // return (loc + 8); - // } - return (loc + 4); -} - -static void -print_addr(db_addr_t loc) -{ - db_printf("0x%08x", loc); -} - - - -static void db_printf(const char* fmt, ...) -{ - int cnt; - va_list argp; - va_start(argp, fmt); - if (sprintf_buffer) { - cnt = vsnprintf(sprintf_buffer, sprintf_buf_len, fmt, argp); - sprintf_buffer += cnt; - sprintf_buf_len -= cnt; - } else { - vprintf(fmt, argp); - } - va_end(argp); -} - - -/* - * Disassemble instruction at 'loc'. - * Return address of start of next instruction. - * Since this function is used by 'examine' and by 'step' - * "next instruction" does NOT mean the next instruction to - * be executed but the 'linear' next instruction. - */ -db_addr_t -mips_disassem(db_addr_t loc, char *di_buffer, int alt_dis_format) -{ - u_int32_t instr; - - if (alt_dis_format) { // use ARM register names for disassembly - reg_name = &alt_arm_reg_name[0]; - } - - sprintf_buffer = di_buffer; // quick 'n' dirty printf() vs sprintf() - sprintf_buf_len = 39; // should be passed in - - instr = *(u_int32_t *)loc; - return (db_disasm_insn(instr, loc, false)); -} - diff --git a/libpixelflinger/codeflinger/mips_disassem.h b/libpixelflinger/codeflinger/mips_disassem.h deleted file mode 100644 index 2d5b7f551..000000000 --- a/libpixelflinger/codeflinger/mips_disassem.h +++ /dev/null @@ -1,66 +0,0 @@ -/* $NetBSD: db_disasm.c,v 1.19 2007/02/28 04:21:53 thorpej Exp $ */ - -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: @(#)kadb.c 8.1 (Berkeley) 6/10/93 - */ - - - -#ifndef ANDROID_MIPS_DISASSEM_H -#define ANDROID_MIPS_DISASSEM_H - -#include - -#if __cplusplus -extern "C" { -#endif - - -// could add an interface like this, but I have not -// typedef struct { -// u_int (*di_readword)(u_int); -// void (*di_printaddr)(u_int); -// void (*di_printf)(const char *, ...); -// } disasm_interface_t; - -/* Prototypes for callable functions */ - -// u_int disasm(const disasm_interface_t *, u_int, int); - -void mips_disassem(uint32_t *location, char *di_buffer, int alt_fmt); - -#if __cplusplus -} -#endif - -#endif /* !ANDROID_MIPS_DISASSEM_H */ diff --git a/libpixelflinger/codeflinger/mips_opcode.h b/libpixelflinger/codeflinger/mips_opcode.h deleted file mode 100644 index 45bb19ea1..000000000 --- a/libpixelflinger/codeflinger/mips_opcode.h +++ /dev/null @@ -1,410 +0,0 @@ -/* $NetBSD: mips_opcode.h,v 1.12 2005/12/11 12:18:09 christos Exp $ */ - -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)mips_opcode.h 8.1 (Berkeley) 6/10/93 - */ - -/* - * Define the instruction formats and opcode values for the - * MIPS instruction set. - */ - -#include - -/* - * Define the instruction formats. - */ -typedef union { - unsigned word; - -#if BYTE_ORDER == LITTLE_ENDIAN - struct { - unsigned imm: 16; - unsigned rt: 5; - unsigned rs: 5; - unsigned op: 6; - } IType; - - struct { - unsigned target: 26; - unsigned op: 6; - } JType; - - struct { - unsigned func: 6; - unsigned shamt: 5; - unsigned rd: 5; - unsigned rt: 5; - unsigned rs: 5; - unsigned op: 6; - } RType; - - struct { - unsigned func: 6; - unsigned fd: 5; - unsigned fs: 5; - unsigned ft: 5; - unsigned fmt: 4; - unsigned : 1; /* always '1' */ - unsigned op: 6; /* always '0x11' */ - } FRType; -#endif -#if BYTE_ORDER == BIG_ENDIAN - struct { - unsigned op: 6; - unsigned rs: 5; - unsigned rt: 5; - unsigned imm: 16; - } IType; - - struct { - unsigned op: 6; - unsigned target: 26; - } JType; - - struct { - unsigned op: 6; - unsigned rs: 5; - unsigned rt: 5; - unsigned rd: 5; - unsigned shamt: 5; - unsigned func: 6; - } RType; - - struct { - unsigned op: 6; /* always '0x11' */ - unsigned : 1; /* always '1' */ - unsigned fmt: 4; - unsigned ft: 5; - unsigned fs: 5; - unsigned fd: 5; - unsigned func: 6; - } FRType; -#endif -} InstFmt; - -/* - * Values for the 'op' field. - */ -#define OP_SPECIAL 000 -#define OP_BCOND 001 -#define OP_J 002 -#define OP_JAL 003 -#define OP_BEQ 004 -#define OP_BNE 005 -#define OP_BLEZ 006 -#define OP_BGTZ 007 - -#if __mips_isa_rev < 6 -#define OP_ADDI 010 -#else -#define OP_POP10 010 -#endif - -#define OP_ADDIU 011 -#define OP_SLTI 012 -#define OP_SLTIU 013 -#define OP_ANDI 014 -#define OP_ORI 015 -#define OP_XORI 016 - -#if __mips_isa_rev < 6 -#define OP_LUI 017 -#else -#define OP_AUI 017 -#endif - -#define OP_COP0 020 -#define OP_COP1 021 -#define OP_COP2 022 - -#if __mips_isa_rev < 6 -#define OP_COP3 023 -#define OP_BEQL 024 -#define OP_BNEL 025 -#define OP_BLEZL 026 -#define OP_BGTZL 027 -#define OP_DADDI 030 -#else -#define OP_POP26 026 -#define OP_POP27 027 -#define OP_POP30 030 -#endif - -#define OP_DADDIU 031 - -#if __mips_isa_rev < 6 -#define OP_LDL 032 -#define OP_LDR 033 -#define OP_SPECIAL2 034 -#else -#define OP_DAUI 035 -#endif - -#define OP_SPECIAL3 037 - -#define OP_LB 040 -#define OP_LH 041 - -#if __mips_isa_rev < 6 -#define OP_LWL 042 -#endif - -#define OP_LW 043 -#define OP_LBU 044 -#define OP_LHU 045 -#define OP_LWR 046 -#define OP_LHU 045 - -#if __mips_isa_rev < 6 -#define OP_LWR 046 -#endif - -#define OP_LWU 047 - -#define OP_SB 050 -#define OP_SH 051 - -#if __mips_isa_rev < 6 -#define OP_SWL 052 -#endif - -#define OP_SW 053 - -#if __mips_isa_rev < 6 -#define OP_SDL 054 -#define OP_SDR 055 -#define OP_SWR 056 -#define OP_CACHE 057 -#define OP_LL 060 -#define OP_LWC0 OP_LL -#define OP_LWC1 061 -#define OP_LWC2 062 -#define OP_LWC3 063 -#define OP_LLD 064 -#else -#define OP_LWC1 061 -#define OP_BC 062 -#endif - -#define OP_LDC1 065 -#define OP_LD 067 - -#if __mips_isa_rev < 6 -#define OP_SC 070 -#define OP_SWC0 OP_SC -#endif - -#define OP_SWC1 071 - -#if __mips_isa_rev < 6 -#define OP_SWC2 072 -#define OP_SWC3 073 -#define OP_SCD 074 -#else -#define OP_BALC 072 -#endif - -#define OP_SDC1 075 -#define OP_SD 077 - -/* - * Values for the 'func' field when 'op' == OP_SPECIAL. - */ -#define OP_SLL 000 -#define OP_SRL 002 -#define OP_SRA 003 -#define OP_SLLV 004 -#define OP_SRLV 006 -#define OP_SRAV 007 - -#if __mips_isa_rev < 6 -#define OP_JR 010 -#endif - -#define OP_JALR 011 -#define OP_SYSCALL 014 -#define OP_BREAK 015 -#define OP_SYNC 017 - -#if __mips_isa_rev < 6 -#define OP_MFHI 020 -#define OP_MTHI 021 -#define OP_MFLO 022 -#define OP_MTLO 023 -#else -#define OP_CLZ 020 -#define OP_CLO 021 -#define OP_DCLZ 022 -#define OP_DCLO 023 -#endif - -#define OP_DSLLV 024 -#define OP_DSRLV 026 -#define OP_DSRAV 027 - -#if __mips_isa_rev < 6 -#define OP_MULT 030 -#define OP_MULTU 031 -#define OP_DIV 032 -#define OP_DIVU 033 -#define OP_DMULT 034 -#define OP_DMULTU 035 -#define OP_DDIV 036 -#define OP_DDIVU 037 -#else -#define OP_SOP30 030 -#define OP_SOP31 031 -#define OP_SOP32 032 -#define OP_SOP33 033 -#define OP_SOP34 034 -#define OP_SOP35 035 -#define OP_SOP36 036 -#define OP_SOP37 037 -#endif - -#define OP_ADD 040 -#define OP_ADDU 041 -#define OP_SUB 042 -#define OP_SUBU 043 -#define OP_AND 044 -#define OP_OR 045 -#define OP_XOR 046 -#define OP_NOR 047 - -#define OP_SLT 052 -#define OP_SLTU 053 -#define OP_DADD 054 -#define OP_DADDU 055 -#define OP_DSUB 056 -#define OP_DSUBU 057 - -#define OP_TGE 060 -#define OP_TGEU 061 -#define OP_TLT 062 -#define OP_TLTU 063 -#define OP_TEQ 064 -#define OP_TNE 066 - -#define OP_DSLL 070 -#define OP_DSRL 072 -#define OP_DSRA 073 -#define OP_DSLL32 074 -#define OP_DSRL32 076 -#define OP_DSRA32 077 - -#if __mips_isa_rev < 6 -/* - * Values for the 'func' field when 'op' == OP_SPECIAL2. - * OP_SPECIAL2 opcodes are removed in mips32r6 - */ -#define OP_MAD 000 /* QED */ -#define OP_MADU 001 /* QED */ -#define OP_MUL 002 /* QED */ -#endif - -/* - * Values for the 'func' field when 'op' == OP_SPECIAL3. - */ -#define OP_EXT 000 -#define OP_DEXTM 001 -#define OP_DEXTU 002 -#define OP_DEXT 003 -#define OP_INS 004 -#define OP_DINSM 005 -#define OP_DINSU 006 -#define OP_DINS 007 -#define OP_BSHFL 040 -#define OP_RDHWR 073 - -/* - * Values for the 'shamt' field when OP_SPECIAL3 && func OP_BSHFL. - */ - -#define OP_WSBH 002 -#define OP_SEB 020 -#define OP_SEH 030 - -#if __mips_isa_rev == 6 -/* - * Values for the 'shamt' field when OP_SOP30. - */ -#define OP_MUL 002 -#define OP_MUH 003 -#endif - -/* - * Values for the 'func' field when 'op' == OP_BCOND. - */ -#define OP_BLTZ 000 -#define OP_BGEZ 001 - -#if __mips_isa_rev < 6 -#define OP_BLTZL 002 -#define OP_BGEZL 003 -#define OP_TGEI 010 -#define OP_TGEIU 011 -#define OP_TLTI 012 -#define OP_TLTIU 013 -#define OP_TEQI 014 -#define OP_TNEI 016 -#define OP_BLTZAL 020 -#define OP_BGEZAL 021 -#define OP_BLTZALL 022 -#define OP_BGEZALL 023 -#else -#define OP_NAL 020 -#define OP_BAL 021 -#endif - -/* - * Values for the 'rs' field when 'op' == OP_COPz. - */ -#define OP_MF 000 -#define OP_DMF 001 -#define OP_MT 004 -#define OP_DMT 005 -#define OP_BCx 010 -#define OP_BCy 014 -#define OP_CF 002 -#define OP_CT 006 - -/* - * Values for the 'rt' field when 'op' == OP_COPz. - */ -#define COPz_BC_TF_MASK 0x01 -#define COPz_BC_TRUE 0x01 -#define COPz_BC_FALSE 0x00 -#define COPz_BCL_TF_MASK 0x02 -#define COPz_BCL_TRUE 0x02 -#define COPz_BCL_FALSE 0x00 diff --git a/libpixelflinger/codeflinger/texturing.cpp b/libpixelflinger/codeflinger/texturing.cpp deleted file mode 100644 index e6997bd4b..000000000 --- a/libpixelflinger/codeflinger/texturing.cpp +++ /dev/null @@ -1,1261 +0,0 @@ -/* libs/pixelflinger/codeflinger/texturing.cpp -** -** Copyright 2006, 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 "pixelflinger-code" - -#include -#include -#include -#include -#include - -#include - -#include "GGLAssembler.h" - -namespace android { - -// --------------------------------------------------------------------------- - -// iterators are initialized like this: -// (intToFixedCenter(x) * dx)>>16 + x0 -// ((x<<16 + 0x8000) * dx)>>16 + x0 -// ((x<<16)*dx + (0x8000*dx))>>16 + x0 -// ( (x*dx) + dx>>1 ) + x0 -// (x*dx) + (dx>>1 + x0) - -void GGLAssembler::init_iterated_color(fragment_parts_t& parts, const reg_t& x) -{ - context_t const* c = mBuilderContext.c; - - if (mSmooth) { - // NOTE: we could take this case in the mDithering + !mSmooth case, - // but this would use up to 4 more registers for the color components - // for only a little added quality. - // Currently, this causes the system to run out of registers in - // some case (see issue #719496) - - comment("compute initial iterated color (smooth and/or dither case)"); - - parts.iterated_packed = 0; - parts.packed = 0; - - // 0x1: color component - // 0x2: iterators - const int optReload = mOptLevel >> 1; - if (optReload >= 3) parts.reload = 0; // reload nothing - else if (optReload == 2) parts.reload = 2; // reload iterators - else if (optReload == 1) parts.reload = 1; // reload colors - else if (optReload <= 0) parts.reload = 3; // reload both - - if (!mSmooth) { - // we're not smoothing (just dithering), we never have to - // reload the iterators - parts.reload &= ~2; - } - - Scratch scratches(registerFile()); - const int t0 = (parts.reload & 1) ? scratches.obtain() : 0; - const int t1 = (parts.reload & 2) ? scratches.obtain() : 0; - for (int i=0 ; i<4 ; i++) { - if (!mInfo[i].iterated) - continue; - - // this component exists in the destination and is not replaced - // by a texture unit. - const int c = (parts.reload & 1) ? t0 : obtainReg(); - if (i==0) CONTEXT_LOAD(c, iterators.ydady); - if (i==1) CONTEXT_LOAD(c, iterators.ydrdy); - if (i==2) CONTEXT_LOAD(c, iterators.ydgdy); - if (i==3) CONTEXT_LOAD(c, iterators.ydbdy); - parts.argb[i].reg = c; - - if (mInfo[i].smooth) { - parts.argb_dx[i].reg = (parts.reload & 2) ? t1 : obtainReg(); - const int dvdx = parts.argb_dx[i].reg; - CONTEXT_LOAD(dvdx, generated_vars.argb[i].dx); - MLA(AL, 0, c, x.reg, dvdx, c); - - // adjust the color iterator to make sure it won't overflow - if (!mAA) { - // this is not needed when we're using anti-aliasing - // because we will (have to) clamp the components - // anyway. - int end = scratches.obtain(); - MOV(AL, 0, end, reg_imm(parts.count.reg, LSR, 16)); - MLA(AL, 1, end, dvdx, end, c); - SUB(MI, 0, c, c, end); - BIC(AL, 0, c, c, reg_imm(c, ASR, 31)); - scratches.recycle(end); - } - } - - if (parts.reload & 1) { - CONTEXT_STORE(c, generated_vars.argb[i].c); - } - } - } else { - // We're not smoothed, so we can - // just use a packed version of the color and extract the - // components as needed (or not at all if we don't blend) - - // figure out if we need the iterated color - int load = 0; - for (int i=0 ; i<4 ; i++) { - component_info_t& info = mInfo[i]; - if ((info.inDest || info.needed) && !info.replaced) - load |= 1; - } - - parts.iterated_packed = 1; - parts.packed = (!mTextureMachine.mask && !mBlending - && !mFog && !mDithering); - parts.reload = 0; - if (load || parts.packed) { - if (mBlending || mDithering || mInfo[GGLFormat::ALPHA].needed) { - comment("load initial iterated color (8888 packed)"); - parts.iterated.setTo(obtainReg(), - &(c->formats[GGL_PIXEL_FORMAT_RGBA_8888])); - CONTEXT_LOAD(parts.iterated.reg, packed8888); - } else { - comment("load initial iterated color (dest format packed)"); - - parts.iterated.setTo(obtainReg(), &mCbFormat); - - // pre-mask the iterated color - const int bits = parts.iterated.size(); - const uint32_t size = ((bits>=32) ? 0 : (1LU << bits)) - 1; - uint32_t mask = 0; - if (mMasking) { - for (int i=0 ; i<4 ; i++) { - const int component_mask = 1<=0 ; i--) { - texture_unit_t& tmu = mTextureMachine.tmu[i]; - if (replaced == 0xF) { - // all components are replaced, skip this TMU. - tmu.format_idx = 0; - tmu.mask = 0; - tmu.replaced = replaced; - continue; - } - tmu.format_idx = GGL_READ_NEEDS(T_FORMAT, needs.t[i]); - tmu.format = c->formats[tmu.format_idx]; - tmu.bits = tmu.format.size*8; - tmu.swrap = GGL_READ_NEEDS(T_S_WRAP, needs.t[i]); - tmu.twrap = GGL_READ_NEEDS(T_T_WRAP, needs.t[i]); - tmu.env = ggl_needs_to_env(GGL_READ_NEEDS(T_ENV, needs.t[i])); - tmu.pot = GGL_READ_NEEDS(T_POT, needs.t[i]); - tmu.linear = GGL_READ_NEEDS(T_LINEAR, needs.t[i]) - && tmu.format.size!=3; // XXX: only 8, 16 and 32 modes for now - - // 5551 linear filtering is not supported - if (tmu.format_idx == GGL_PIXEL_FORMAT_RGBA_5551) - tmu.linear = 0; - - tmu.mask = 0; - tmu.replaced = replaced; - - if (tmu.format_idx) { - mTextureMachine.activeUnits++; - if (tmu.format.c[0].h) tmu.mask |= 0x1; - if (tmu.format.c[1].h) tmu.mask |= 0x2; - if (tmu.format.c[2].h) tmu.mask |= 0x4; - if (tmu.format.c[3].h) tmu.mask |= 0x8; - if (tmu.env == GGL_REPLACE) { - replaced |= tmu.mask; - } else if (tmu.env == GGL_DECAL) { - if (!tmu.format.c[GGLFormat::ALPHA].h) { - // if we don't have alpha, decal does nothing - tmu.mask = 0; - } else { - // decal always ignores At - tmu.mask &= ~(1< 1; - for (int i=0 ; i>16) - CONTEXT_LOAD(txPtr.reg, state.texture[i].iterators.ydtdy); - ADD(AL, 0, Ry, Ry, reg_imm(txPtr.reg, ASR, 16)); // y += (t>>16) - // merge base & offset - CONTEXT_LOAD(txPtr.reg, generated_vars.texture[i].stride); - SMLABB(AL, Rx, Ry, txPtr.reg, Rx); // x+y*stride - CONTEXT_ADDR_LOAD(txPtr.reg, generated_vars.texture[i].data); - base_offset(txPtr, txPtr, Rx); - } else { - Scratch scratches(registerFile()); - reg_t& s = coords[i].s; - reg_t& t = coords[i].t; - // s = (x * dsdx)>>16 + ydsdy - // s = (x * dsdx)>>16 + (y*dsdy)>>16 + s0 - // t = (x * dtdx)>>16 + ydtdy - // t = (x * dtdx)>>16 + (y*dtdy)>>16 + t0 - s.setTo(obtainReg()); - t.setTo(obtainReg()); - const int need_w = GGL_READ_NEEDS(W, needs.n); - if (need_w) { - CONTEXT_LOAD(s.reg, state.texture[i].iterators.ydsdy); - CONTEXT_LOAD(t.reg, state.texture[i].iterators.ydtdy); - } else { - int ydsdy = scratches.obtain(); - int ydtdy = scratches.obtain(); - CONTEXT_LOAD(s.reg, generated_vars.texture[i].dsdx); - CONTEXT_LOAD(ydsdy, state.texture[i].iterators.ydsdy); - CONTEXT_LOAD(t.reg, generated_vars.texture[i].dtdx); - CONTEXT_LOAD(ydtdy, state.texture[i].iterators.ydtdy); - MLA(AL, 0, s.reg, Rx, s.reg, ydsdy); - MLA(AL, 0, t.reg, Rx, t.reg, ydtdy); - } - - if ((mOptLevel&1)==0) { - CONTEXT_STORE(s.reg, generated_vars.texture[i].spill[0]); - CONTEXT_STORE(t.reg, generated_vars.texture[i].spill[1]); - recycleReg(s.reg); - recycleReg(t.reg); - } - } - - // direct texture? - if (!multiTexture && !mBlending && !mDithering && !mFog && - cb_format_idx == tmu.format_idx && !tmu.linear && - mTextureMachine.replaced == tmu.mask) - { - mTextureMachine.directTexture = i + 1; - } - } -} - -void GGLAssembler::build_textures( fragment_parts_t& parts, - Scratch& regs) -{ - // We don't have a way to spill registers automatically - // spill depth and AA regs, when we know we may have to. - // build the spill list... - uint32_t spill_list = 0; - for (int i=0 ; i 0 && parts.covPtr.reg > 0) - spill_list |= 1< 0) - spill_list |= 1< 0) - spill_list |= 1<>4) >= width) - // u = width<<4 - // width = 0 - // else - // width = 1<>4; // get integer part - // if (u<0) - // u = 0 - // width = 0 - // generated_vars.rt = width - - CMP(AL, width, reg_imm(u, ASR, FRAC_BITS)); - MOV(LE, 0, u, reg_imm(width, LSL, FRAC_BITS)); - MOV(LE, 0, width, imm(0)); - MOV(GT, 0, width, imm(1 << shift)); - MOV(AL, 1, u, reg_imm(u, ASR, FRAC_BITS)); - MOV(MI, 0, u, imm(0)); - MOV(MI, 0, width, imm(0)); - } - CONTEXT_STORE(width, generated_vars.rt); - - const int stride = width; - CONTEXT_LOAD(stride, generated_vars.texture[i].stride); - if (tmu.twrap == GGL_NEEDS_WRAP_REPEAT) { - // v has already been REPEATed - MOV(AL, 1, v, reg_imm(v, ASR, FRAC_BITS)); - MOV(MI, 0, v, height); - CMP(AL, v, height); - MOV(LT, 0, height, imm(1 << shift)); - if (shift) - MOV(GE, 0, height, reg_imm(height, LSL, shift)); - RSB(GE, 0, height, height, imm(0)); - MUL(AL, 0, height, stride, height); - } else { - // v has not been CLAMPed yet - CMP(AL, height, reg_imm(v, ASR, FRAC_BITS)); - MOV(LE, 0, v, reg_imm(height, LSL, FRAC_BITS)); - MOV(LE, 0, height, imm(0)); - if (shift) { - MOV(GT, 0, height, reg_imm(stride, LSL, shift)); - } else { - MOV(GT, 0, height, stride); - } - MOV(AL, 1, v, reg_imm(v, ASR, FRAC_BITS)); - MOV(MI, 0, v, imm(0)); - MOV(MI, 0, height, imm(0)); - } - CONTEXT_STORE(height, generated_vars.lb); - } - - scratches.recycle(width); - scratches.recycle(height); - - // iterate texture coordinates... - comment("iterate s,t"); - int dsdx = scratches.obtain(); - int dtdx = scratches.obtain(); - - if (registerFile().status() & RegisterFile::OUT_OF_REGISTERS) - return; - - CONTEXT_LOAD(dsdx, generated_vars.texture[i].dsdx); - CONTEXT_LOAD(dtdx, generated_vars.texture[i].dtdx); - ADD(AL, 0, s.reg, s.reg, dsdx); - ADD(AL, 0, t.reg, t.reg, dtdx); - if ((mOptLevel&1)==0) { - CONTEXT_STORE(s.reg, generated_vars.texture[i].spill[0]); - CONTEXT_STORE(t.reg, generated_vars.texture[i].spill[1]); - scratches.recycle(s.reg); - scratches.recycle(t.reg); - } - scratches.recycle(dsdx); - scratches.recycle(dtdx); - - // merge base & offset... - comment("merge base & offset"); - texel.setTo(regs.obtain(), &tmu.format); - txPtr.setTo(texel.reg, tmu.bits); - int stride = scratches.obtain(); - - if (registerFile().status() & RegisterFile::OUT_OF_REGISTERS) - return; - - CONTEXT_LOAD(stride, generated_vars.texture[i].stride); - CONTEXT_ADDR_LOAD(txPtr.reg, generated_vars.texture[i].data); - SMLABB(AL, u, v, stride, u); // u+v*stride - base_offset(txPtr, txPtr, u); - - // load texel - if (!tmu.linear) { - comment("fetch texel"); - load(txPtr, texel, 0); - } else { - // recycle registers we don't need anymore - scratches.recycle(u); - scratches.recycle(v); - scratches.recycle(stride); - - comment("fetch texel, bilinear"); - switch (tmu.format.size) { - case 1: filter8(parts, texel, tmu, U, V, txPtr, FRAC_BITS); break; - case 2: filter16(parts, texel, tmu, U, V, txPtr, FRAC_BITS); break; - case 3: filter24(parts, texel, tmu, U, V, txPtr, FRAC_BITS); break; - case 4: filter32(parts, texel, tmu, U, V, txPtr, FRAC_BITS); break; - } - } - } - } -} - -void GGLAssembler::build_iterate_texture_coordinates( - const fragment_parts_t& parts) -{ - for (int i=0 ; i>3)); - } else { - Scratch scratches(registerFile()); - int s = parts.coords[i].s.reg; - int t = parts.coords[i].t.reg; - if ((mOptLevel&1)==0) { - s = scratches.obtain(); - t = scratches.obtain(); - CONTEXT_LOAD(s, generated_vars.texture[i].spill[0]); - CONTEXT_LOAD(t, generated_vars.texture[i].spill[1]); - } - int dsdx = scratches.obtain(); - int dtdx = scratches.obtain(); - CONTEXT_LOAD(dsdx, generated_vars.texture[i].dsdx); - CONTEXT_LOAD(dtdx, generated_vars.texture[i].dtdx); - ADD(AL, 0, s, s, dsdx); - ADD(AL, 0, t, t, dtdx); - if ((mOptLevel&1)==0) { - CONTEXT_STORE(s, generated_vars.texture[i].spill[0]); - CONTEXT_STORE(t, generated_vars.texture[i].spill[1]); - } - } - } -} - -void GGLAssembler::filter8( - const fragment_parts_t& /*parts*/, - pixel_t& texel, const texture_unit_t& tmu, - int U, int V, pointer_t& txPtr, - int FRAC_BITS) -{ - if (tmu.format.components != GGL_ALPHA && - tmu.format.components != GGL_LUMINANCE) - { - // this is a packed format, and we don't support - // linear filtering (it's probably RGB 332) - // Should not happen with OpenGL|ES - LDRB(AL, texel.reg, txPtr.reg); - return; - } - - // ------------------------ - // about ~22 cycles / pixel - Scratch scratches(registerFile()); - - int pixel= scratches.obtain(); - int d = scratches.obtain(); - int u = scratches.obtain(); - int k = scratches.obtain(); - int rt = scratches.obtain(); - int lb = scratches.obtain(); - - // RB -> U * V - - CONTEXT_LOAD(rt, generated_vars.rt); - CONTEXT_LOAD(lb, generated_vars.lb); - - int offset = pixel; - ADD(AL, 0, offset, lb, rt); - LDRB(AL, pixel, txPtr.reg, reg_scale_pre(offset)); - SMULBB(AL, u, U, V); - SMULBB(AL, d, pixel, u); - RSB(AL, 0, k, u, imm(1<<(FRAC_BITS*2))); - - // LB -> (1-U) * V - RSB(AL, 0, U, U, imm(1< (1-U)*(1-V) - RSB(AL, 0, V, V, imm(1< U*(1-V) - LDRB(AL, pixel, txPtr.reg, reg_scale_pre(rt)); - SUB(AL, 0, u, k, u); - SMLABB(AL, texel.reg, pixel, u, d); - - for (int i=0 ; i<4 ; i++) { - if (!texel.format.c[i].h) continue; - texel.format.c[i].h = FRAC_BITS*2+8; - texel.format.c[i].l = FRAC_BITS*2; // keeping 8 bits in enough - } - texel.format.size = 4; - texel.format.bitsPerPixel = 32; - texel.flags |= CLEAR_LO; -} - -void GGLAssembler::filter16( - const fragment_parts_t& /*parts*/, - pixel_t& texel, const texture_unit_t& tmu, - int U, int V, pointer_t& txPtr, - int FRAC_BITS) -{ - // compute the mask - // XXX: it would be nice if the mask below could be computed - // automatically. - uint32_t mask = 0; - int shift = 0; - int prec = 0; - switch (tmu.format_idx) { - case GGL_PIXEL_FORMAT_RGB_565: - // source: 00000ggg.ggg00000 | rrrrr000.000bbbbb - // result: gggggggg.gggrrrrr | rrrrr0bb.bbbbbbbb - mask = 0x07E0F81F; - shift = 16; - prec = 5; - break; - case GGL_PIXEL_FORMAT_RGBA_4444: - // 0000,1111,0000,1111 | 0000,1111,0000,1111 - mask = 0x0F0F0F0F; - shift = 12; - prec = 4; - break; - case GGL_PIXEL_FORMAT_LA_88: - // 0000,0000,1111,1111 | 0000,0000,1111,1111 - // AALL -> 00AA | 00LL - mask = 0x00FF00FF; - shift = 8; - prec = 8; - break; - default: - // unsupported format, do something sensical... - ALOGE("Unsupported 16-bits texture format (%d)", tmu.format_idx); - LDRH(AL, texel.reg, txPtr.reg); - return; - } - - const int adjust = FRAC_BITS*2 - prec; - const int round = 0; - - // update the texel format - texel.format.size = 4; - texel.format.bitsPerPixel = 32; - texel.flags |= CLEAR_HI|CLEAR_LO; - for (int i=0 ; i<4 ; i++) { - if (!texel.format.c[i].h) continue; - const uint32_t offset = (mask & tmu.format.mask(i)) ? 0 : shift; - texel.format.c[i].h = tmu.format.c[i].h + offset + prec; - texel.format.c[i].l = texel.format.c[i].h - (tmu.format.bits(i) + prec); - } - - // ------------------------ - // about ~40 cycles / pixel - Scratch scratches(registerFile()); - - int pixel= scratches.obtain(); - int d = scratches.obtain(); - int u = scratches.obtain(); - int k = scratches.obtain(); - - // RB -> U * V - int offset = pixel; - CONTEXT_LOAD(offset, generated_vars.rt); - CONTEXT_LOAD(u, generated_vars.lb); - ADD(AL, 0, offset, offset, u); - - LDRH(AL, pixel, txPtr.reg, reg_pre(offset)); - SMULBB(AL, u, U, V); - ORR(AL, 0, pixel, pixel, reg_imm(pixel, LSL, shift)); - build_and_immediate(pixel, pixel, mask, 32); - if (adjust) { - if (round) - ADD(AL, 0, u, u, imm(1<<(adjust-1))); - MOV(AL, 0, u, reg_imm(u, LSR, adjust)); - } - MUL(AL, 0, d, pixel, u); - RSB(AL, 0, k, u, imm(1< (1-U) * V - CONTEXT_LOAD(offset, generated_vars.lb); - RSB(AL, 0, U, U, imm(1< (1-U)*(1-V) - RSB(AL, 0, V, V, imm(1< U*(1-V) - CONTEXT_LOAD(offset, generated_vars.rt); - LDRH(AL, pixel, txPtr.reg, reg_pre(offset)); - SUB(AL, 0, u, k, u); - ORR(AL, 0, pixel, pixel, reg_imm(pixel, LSL, shift)); - build_and_immediate(pixel, pixel, mask, 32); - MLA(AL, 0, texel.reg, pixel, u, d); -} - -void GGLAssembler::filter24( - const fragment_parts_t& /*parts*/, - pixel_t& texel, const texture_unit_t& /*tmu*/, - int /*U*/, int /*V*/, pointer_t& txPtr, - int /*FRAC_BITS*/) -{ - // not supported yet (currently disabled) - load(txPtr, texel, 0); -} - -void GGLAssembler::filter32( - const fragment_parts_t& /*parts*/, - pixel_t& texel, const texture_unit_t& /*tmu*/, - int U, int V, pointer_t& txPtr, - int FRAC_BITS) -{ - const int adjust = FRAC_BITS*2 - 8; - const int round = 0; - - // ------------------------ - // about ~38 cycles / pixel - Scratch scratches(registerFile()); - - int pixel= scratches.obtain(); - int dh = scratches.obtain(); - int u = scratches.obtain(); - int k = scratches.obtain(); - - int temp = scratches.obtain(); - int dl = scratches.obtain(); - int mask = scratches.obtain(); - - MOV(AL, 0, mask, imm(0xFF)); - ORR(AL, 0, mask, mask, imm(0xFF0000)); - - // RB -> U * V - int offset = pixel; - CONTEXT_LOAD(offset, generated_vars.rt); - CONTEXT_LOAD(u, generated_vars.lb); - ADD(AL, 0, offset, offset, u); - - LDR(AL, pixel, txPtr.reg, reg_scale_pre(offset)); - SMULBB(AL, u, U, V); - AND(AL, 0, temp, mask, pixel); - if (adjust) { - if (round) - ADD(AL, 0, u, u, imm(1<<(adjust-1))); - MOV(AL, 0, u, reg_imm(u, LSR, adjust)); - } - MUL(AL, 0, dh, temp, u); - AND(AL, 0, temp, mask, reg_imm(pixel, LSR, 8)); - MUL(AL, 0, dl, temp, u); - RSB(AL, 0, k, u, imm(0x100)); - - // LB -> (1-U) * V - CONTEXT_LOAD(offset, generated_vars.lb); - RSB(AL, 0, U, U, imm(1< (1-U)*(1-V) - RSB(AL, 0, V, V, imm(1< U*(1-V) - CONTEXT_LOAD(offset, generated_vars.rt); - LDR(AL, pixel, txPtr.reg, reg_scale_pre(offset)); - SUB(AL, 0, u, k, u); - AND(AL, 0, temp, mask, pixel); - MLA(AL, 0, dh, temp, u, dh); - AND(AL, 0, temp, mask, reg_imm(pixel, LSR, 8)); - MLA(AL, 0, dl, temp, u, dl); - - AND(AL, 0, dh, mask, reg_imm(dh, LSR, 8)); - AND(AL, 0, dl, dl, reg_imm(mask, LSL, 8)); - ORR(AL, 0, texel.reg, dh, dl); -} - -void GGLAssembler::build_texture_environment( - component_t& fragment, - const fragment_parts_t& parts, - int component, - Scratch& regs) -{ - const uint32_t component_mask = 1< 1; - for (int i=0 ; i 32) { - // we will overflow, reduce the precision of Ni to 8 bits - // (Note Nt cannot be more than 10 bits which happens with - // 565 textures and GGL_LINEAR) - shift += Ni-8; - Ni = 8; - } - - // modulate by the component with the lowest precision - if (Nt >= Ni) { - if (shift) { - // XXX: we should be able to avoid this shift - // when shift==16 && Nt<16 && Ni<16, in which - // we could use SMULBT below. - MOV(AL, 0, dest.reg, reg_imm(inReg, LSR, shift)); - inReg = dest.reg; - shift = 0; - } - // operation: (Cf*Ct)/((1<>(Ni-1))>>Ni - // this operation doesn't change texel's size - ADD(AL, 0, dest.reg, inReg, reg_imm(inReg, LSR, Ni-1)); - if (Nt<16 && Ni<16) SMULBB(AL, dest.reg, texel.reg, dest.reg); - else MUL(AL, 0, dest.reg, texel.reg, dest.reg); - dest.l = Ni; - dest.h = Nt + Ni; - } else { - if (shift && (shift != 16)) { - // if shift==16, we can use 16-bits mul instructions later - MOV(AL, 0, dest.reg, reg_imm(inReg, LSR, shift)); - inReg = dest.reg; - shift = 0; - } - // operation: (Cf*Ct)/((1<>(Nt-1))>>Nt - // this operation doesn't change incoming's size - Scratch scratches(registerFile()); - int t = (texel.flags & CORRUPTIBLE) ? texel.reg : dest.reg; - if (t == inReg) - t = scratches.obtain(); - ADD(AL, 0, t, texel.reg, reg_imm(texel.reg, LSR, Nt-1)); - if (Nt<16 && Ni<16) { - if (shift==16) SMULBT(AL, dest.reg, t, inReg); - else SMULBB(AL, dest.reg, t, inReg); - } else MUL(AL, 0, dest.reg, t, inReg); - dest.l = Nt; - dest.h = Nt + Ni; - } - - // low bits are not valid - dest.flags |= CLEAR_LO; - - // no need to keep more than 8 bits/component - if (dest.size() > 8) - dest.l = dest.h-8; - } -} - -void GGLAssembler::decal( - component_t& dest, - const component_t& incoming, - const pixel_t& incomingTexel, int component) -{ - // RGBA: - // Cv = Cf*(1 - At) + Ct*At = Cf + (Ct - Cf)*At - // Av = Af - Scratch locals(registerFile()); - integer_t texel(locals.obtain(), 32, CORRUPTIBLE); - integer_t factor(locals.obtain(), 32, CORRUPTIBLE); - extract(texel, incomingTexel, component); - extract(factor, incomingTexel, GGLFormat::ALPHA); - - // no need to keep more than 8-bits for decal - int Ni = incoming.size(); - int shift = incoming.l; - if (Ni > 8) { - shift += Ni-8; - Ni = 8; - } - integer_t incomingNorm(incoming.reg, Ni, incoming.flags); - if (shift) { - MOV(AL, 0, dest.reg, reg_imm(incomingNorm.reg, LSR, shift)); - incomingNorm.reg = dest.reg; - incomingNorm.flags |= CORRUPTIBLE; - } - ADD(AL, 0, factor.reg, factor.reg, reg_imm(factor.reg, LSR, factor.s-1)); - build_blendOneMinusFF(dest, factor, incomingNorm, texel); -} - -void GGLAssembler::blend( - component_t& dest, - const component_t& incoming, - const pixel_t& incomingTexel, int component, int tmu) -{ - // RGBA: - // Cv = (1 - Ct)*Cf + Ct*Cc = Cf + (Cc - Cf)*Ct - // Av = At*Af - - if (component == GGLFormat::ALPHA) { - modulate(dest, incoming, incomingTexel, component); - return; - } - - Scratch locals(registerFile()); - integer_t color(locals.obtain(), 8, CORRUPTIBLE); - integer_t factor(locals.obtain(), 32, CORRUPTIBLE); - LDRB(AL, color.reg, mBuilderContext.Rctx, - immed12_pre(GGL_OFFSETOF(state.texture[tmu].env_color[component]))); - extract(factor, incomingTexel, component); - - // no need to keep more than 8-bits for blend - int Ni = incoming.size(); - int shift = incoming.l; - if (Ni > 8) { - shift += Ni-8; - Ni = 8; - } - integer_t incomingNorm(incoming.reg, Ni, incoming.flags); - if (shift) { - MOV(AL, 0, dest.reg, reg_imm(incomingNorm.reg, LSR, shift)); - incomingNorm.reg = dest.reg; - incomingNorm.flags |= CORRUPTIBLE; - } - ADD(AL, 0, factor.reg, factor.reg, reg_imm(factor.reg, LSR, factor.s-1)); - build_blendOneMinusFF(dest, factor, incomingNorm, color); -} - -void GGLAssembler::add( - component_t& dest, - const component_t& incoming, - const pixel_t& incomingTexel, int component) -{ - // RGBA: - // Cv = Cf + Ct; - Scratch locals(registerFile()); - - component_t incomingTemp(incoming); - - // use "dest" as a temporary for extracting the texel, unless "dest" - // overlaps "incoming". - integer_t texel(dest.reg, 32, CORRUPTIBLE); - if (dest.reg == incomingTemp.reg) - texel.reg = locals.obtain(); - extract(texel, incomingTexel, component); - - if (texel.s < incomingTemp.size()) { - expand(texel, texel, incomingTemp.size()); - } else if (texel.s > incomingTemp.size()) { - if (incomingTemp.flags & CORRUPTIBLE) { - expand(incomingTemp, incomingTemp, texel.s); - } else { - incomingTemp.reg = locals.obtain(); - expand(incomingTemp, incoming, texel.s); - } - } - - if (incomingTemp.l) { - ADD(AL, 0, dest.reg, texel.reg, - reg_imm(incomingTemp.reg, LSR, incomingTemp.l)); - } else { - ADD(AL, 0, dest.reg, texel.reg, incomingTemp.reg); - } - dest.l = 0; - dest.h = texel.size(); - component_sat(dest); -} - -// ---------------------------------------------------------------------------- - -}; // namespace android - diff --git a/libpixelflinger/codeflinger/tinyutils/smartpointer.h b/libpixelflinger/codeflinger/tinyutils/smartpointer.h deleted file mode 100644 index 23a5f7e54..000000000 --- a/libpixelflinger/codeflinger/tinyutils/smartpointer.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2005 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_PIXELFLINGER_SMART_POINTER_H -#define ANDROID_PIXELFLINGER_SMART_POINTER_H - -#include -#include -#include - -// --------------------------------------------------------------------------- -namespace android { -namespace tinyutils { - -// --------------------------------------------------------------------------- - -#define COMPARE(_op_) \ -inline bool operator _op_ (const sp& o) const { \ - return m_ptr _op_ o.m_ptr; \ -} \ -inline bool operator _op_ (const T* o) const { \ - return m_ptr _op_ o; \ -} \ -template \ -inline bool operator _op_ (const sp& o) const { \ - return m_ptr _op_ o.m_ptr; \ -} \ -template \ -inline bool operator _op_ (const U* o) const { \ - return m_ptr _op_ o; \ -} - -// --------------------------------------------------------------------------- - -template -class sp -{ -public: - inline sp() : m_ptr(0) { } - - sp(T* other); // NOLINT, implicit - sp(const sp& other); - template sp(U* other); // NOLINT, implicit - template sp(const sp& other); // NOLINT, implicit - - ~sp(); - - // Assignment - - sp& operator = (T* other); - sp& operator = (const sp& other); - - template sp& operator = (const sp& other); - template sp& operator = (U* other); - - // Reset - void clear(); - - // Accessors - - inline T& operator* () const { return *m_ptr; } - inline T* operator-> () const { return m_ptr; } - inline T* get() const { return m_ptr; } - - // Operators - - COMPARE(==) - COMPARE(!=) - COMPARE(>) - COMPARE(<) - COMPARE(<=) - COMPARE(>=) - -private: - template friend class sp; - - T* m_ptr; -}; - -// --------------------------------------------------------------------------- -// No user serviceable parts below here. - -template -sp::sp(T* other) - : m_ptr(other) -{ - if (other) other->incStrong(this); -} - -template -sp::sp(const sp& other) - : m_ptr(other.m_ptr) -{ - if (m_ptr) m_ptr->incStrong(this); -} - -template template -sp::sp(U* other) : m_ptr(other) -{ - if (other) other->incStrong(this); -} - -template template -sp::sp(const sp& other) - : m_ptr(other.m_ptr) -{ - if (m_ptr) m_ptr->incStrong(this); -} - -template -sp::~sp() -{ - if (m_ptr) m_ptr->decStrong(this); -} - -template -sp& sp::operator = (const sp& other) { - if (other.m_ptr) other.m_ptr->incStrong(this); - if (m_ptr) m_ptr->decStrong(this); - m_ptr = other.m_ptr; - return *this; -} - -template -sp& sp::operator = (T* other) -{ - if (other) other->incStrong(this); - if (m_ptr) m_ptr->decStrong(this); - m_ptr = other; - return *this; -} - -template template -sp& sp::operator = (const sp& other) -{ - if (other.m_ptr) other.m_ptr->incStrong(this); - if (m_ptr) m_ptr->decStrong(this); - m_ptr = other.m_ptr; - return *this; -} - -template template -sp& sp::operator = (U* other) -{ - if (other) other->incStrong(this); - if (m_ptr) m_ptr->decStrong(this); - m_ptr = other; - return *this; -} - -template -void sp::clear() -{ - if (m_ptr) { - m_ptr->decStrong(this); - m_ptr = 0; - } -} - -// --------------------------------------------------------------------------- - -} // namespace tinyutils -} // namespace android - -// --------------------------------------------------------------------------- - -#endif // ANDROID_PIXELFLINGER_SMART_POINTER_H diff --git a/libpixelflinger/col32cb16blend.S b/libpixelflinger/col32cb16blend.S deleted file mode 100644 index 39f94e164..000000000 --- a/libpixelflinger/col32cb16blend.S +++ /dev/null @@ -1,77 +0,0 @@ -/* libs/pixelflinger/col32cb16blend.S - * - * Copyright (C) 2009 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. - */ - - .text - .balign 4 - - .global scanline_col32cb16blend_arm - -// -// This function alpha blends a fixed color into a destination scanline, using -// the formula: -// -// d = s + (((a + (a >> 7)) * d) >> 8) -// -// where d is the destination pixel, -// s is the source color, -// a is the alpha channel of the source color. -// - -// r0 = destination buffer pointer -// r1 = color value -// r2 = count - - -scanline_col32cb16blend_arm: - push {r4-r10, lr} // stack ARM regs - - mov r5, r1, lsr #24 // shift down alpha - mov r9, #0xff // create mask - add r5, r5, r5, lsr #7 // add in top bit - rsb r5, r5, #256 // invert alpha - and r10, r1, #0xff // extract red - and r12, r9, r1, lsr #8 // extract green - and r4, r9, r1, lsr #16 // extract blue - mov r10, r10, lsl #5 // prescale red - mov r12, r12, lsl #6 // prescale green - mov r4, r4, lsl #5 // prescale blue - mov r9, r9, lsr #2 // create dest green mask - -1: - ldrh r8, [r0] // load dest pixel - subs r2, r2, #1 // decrement loop counter - mov r6, r8, lsr #11 // extract dest red - and r7, r9, r8, lsr #5 // extract dest green - and r8, r8, #0x1f // extract dest blue - - smlabb r6, r6, r5, r10 // dest red * alpha + src red - smlabb r7, r7, r5, r12 // dest green * alpha + src green - smlabb r8, r8, r5, r4 // dest blue * alpha + src blue - - mov r6, r6, lsr #8 // shift down red - mov r7, r7, lsr #8 // shift down green - mov r6, r6, lsl #11 // shift red into 565 - orr r6, r7, lsl #5 // shift green into 565 - orr r6, r8, lsr #8 // shift blue into 565 - - strh r6, [r0], #2 // store pixel to dest, update ptr - bne 1b // if count != 0, loop - - pop {r4-r10, pc} // return - - - diff --git a/libpixelflinger/col32cb16blend_neon.S b/libpixelflinger/col32cb16blend_neon.S deleted file mode 100644 index 7ad34b051..000000000 --- a/libpixelflinger/col32cb16blend_neon.S +++ /dev/null @@ -1,153 +0,0 @@ -/* libs/pixelflinger/col32cb16blend_neon.S - * - * Copyright (C) 2009 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. - */ - - - .text - .balign 4 - - .global scanline_col32cb16blend_neon - -// -// This function alpha blends a fixed color into a destination scanline, using -// the formula: -// -// d = s + (((a + (a >> 7)) * d) >> 8) -// -// where d is the destination pixel, -// s is the source color, -// a is the alpha channel of the source color. -// -// The NEON implementation processes 16 pixels per iteration. The remaining 0 - 15 -// pixels are processed in ARM code. -// - -// r0 = destination buffer pointer -// r1 = color pointer -// r2 = count - - -scanline_col32cb16blend_neon: - push {r4-r11, lr} // stack ARM regs - - vmov.u16 q15, #256 // create alpha constant - movs r3, r2, lsr #4 // calc. sixteens iterations - vmov.u16 q14, #0x1f // create blue mask - - beq 2f // if r3 == 0, branch to singles - - vld4.8 {d0[], d2[], d4[], d6[]}, [r1] // load color into four registers - // split and duplicate them, such that - // d0 = 8 equal red values - // d2 = 8 equal green values - // d4 = 8 equal blue values - // d6 = 8 equal alpha values - vshll.u8 q0, d0, #5 // shift up red and widen - vshll.u8 q1, d2, #6 // shift up green and widen - vshll.u8 q2, d4, #5 // shift up blue and widen - - vshr.u8 d7, d6, #7 // extract top bit of alpha - vaddl.u8 q3, d6, d7 // add top bit into alpha - vsub.u16 q3, q15, q3 // invert alpha - -1: - // This loop processes 16 pixels per iteration. In the comments, references to - // the first eight pixels are suffixed with "0" (red0, green0, blue0), - // the second eight are suffixed "1". - // q8 = dst red0 - // q9 = dst green0 - // q10 = dst blue0 - // q13 = dst red1 - // q12 = dst green1 - // q11 = dst blue1 - - vld1.16 {d20, d21, d22, d23}, [r0] // load 16 dest pixels - vshr.u16 q8, q10, #11 // shift dst red0 to low 5 bits - pld [r0, #63] // preload next dest pixels - vshl.u16 q9, q10, #5 // shift dst green0 to top 6 bits - vand q10, q10, q14 // extract dst blue0 - vshr.u16 q9, q9, #10 // shift dst green0 to low 6 bits - vmul.u16 q8, q8, q3 // multiply dst red0 by src alpha - vshl.u16 q12, q11, #5 // shift dst green1 to top 6 bits - vmul.u16 q9, q9, q3 // multiply dst green0 by src alpha - vshr.u16 q13, q11, #11 // shift dst red1 to low 5 bits - vmul.u16 q10, q10, q3 // multiply dst blue0 by src alpha - vshr.u16 q12, q12, #10 // shift dst green1 to low 6 bits - vand q11, q11, q14 // extract dst blue1 - vadd.u16 q8, q8, q0 // add src red to dst red0 - vmul.u16 q13, q13, q3 // multiply dst red1 by src alpha - vadd.u16 q9, q9, q1 // add src green to dst green0 - vmul.u16 q12, q12, q3 // multiply dst green1 by src alpha - vadd.u16 q10, q10, q2 // add src blue to dst blue0 - vmul.u16 q11, q11, q3 // multiply dst blue1 by src alpha - vshr.u16 q8, q8, #8 // shift down red0 - vadd.u16 q13, q13, q0 // add src red to dst red1 - vshr.u16 q9, q9, #8 // shift down green0 - vadd.u16 q12, q12, q1 // add src green to dst green1 - vshr.u16 q10, q10, #8 // shift down blue0 - vadd.u16 q11, q11, q2 // add src blue to dst blue1 - vsli.u16 q10, q9, #5 // shift & insert green0 into blue0 - vshr.u16 q13, q13, #8 // shift down red1 - vsli.u16 q10, q8, #11 // shift & insert red0 into blue0 - vshr.u16 q12, q12, #8 // shift down green1 - vshr.u16 q11, q11, #8 // shift down blue1 - subs r3, r3, #1 // decrement loop counter - vsli.u16 q11, q12, #5 // shift & insert green1 into blue1 - vsli.u16 q11, q13, #11 // shift & insert red1 into blue1 - - vst1.16 {d20, d21, d22, d23}, [r0]! // write 16 pixels back to dst - bne 1b // if count != 0, loop - -2: - ands r3, r2, #15 // calc. single iterations - beq 4f // if r3 == 0, exit - - ldr r4, [r1] // load source color - mov r5, r4, lsr #24 // shift down alpha - add r5, r5, r5, lsr #7 // add in top bit - rsb r5, r5, #256 // invert alpha - and r11, r4, #0xff // extract red - ubfx r12, r4, #8, #8 // extract green - ubfx r4, r4, #16, #8 // extract blue - mov r11, r11, lsl #5 // prescale red - mov r12, r12, lsl #6 // prescale green - mov r4, r4, lsl #5 // prescale blue - -3: - ldrh r8, [r0] // load dest pixel - subs r3, r3, #1 // decrement loop counter - mov r6, r8, lsr #11 // extract dest red - ubfx r7, r8, #5, #6 // extract dest green - and r8, r8, #0x1f // extract dest blue - - smlabb r6, r6, r5, r11 // dest red * alpha + src red - smlabb r7, r7, r5, r12 // dest green * alpha + src green - smlabb r8, r8, r5, r4 // dest blue * alpha + src blue - - mov r6, r6, lsr #8 // shift down red - mov r7, r7, lsr #8 // shift down green - mov r6, r6, lsl #11 // shift red into 565 - orr r6, r7, lsl #5 // shift green into 565 - orr r6, r8, lsr #8 // shift blue into 565 - - strh r6, [r0], #2 // store pixel to dest, update ptr - bne 3b // if count != 0, loop -4: - - pop {r4-r11, pc} // return - - - diff --git a/libpixelflinger/fixed.cpp b/libpixelflinger/fixed.cpp deleted file mode 100644 index de6b4794f..000000000 --- a/libpixelflinger/fixed.cpp +++ /dev/null @@ -1,329 +0,0 @@ -/* libs/pixelflinger/fixed.cpp -** -** Copyright 2006, 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 - - -// ------------------------------------------------------------------------ - -int32_t gglRecipQNormalized(int32_t x, int* exponent) -{ - const int32_t s = x>>31; - uint32_t a = s ? -x : x; - - // the result will overflow, so just set it to the biggest/inf value - if (ggl_unlikely(a <= 2LU)) { - *exponent = 0; - return s ? FIXED_MIN : FIXED_MAX; - } - - // Newton-Raphson iteration: - // x = r*(2 - a*r) - - const int32_t lz = gglClz(a); - a <<= lz; // 0.32 - uint32_t r = a; - // note: if a == 0x80000000, this means x was a power-of-2, in this - // case we don't need to compute anything. We get the reciprocal for - // (almost) free. - if (a != 0x80000000) { - r = (0x2E800 << (30-16)) - (r>>(2-1)); // 2.30, r = 2.90625 - 2*a - // 0.32 + 2.30 = 2.62 -> 2.30 - // 2.30 + 2.30 = 4.60 -> 2.30 - r = (((2LU<<30) - uint32_t((uint64_t(a)*r) >> 32)) * uint64_t(r)) >> 30; - r = (((2LU<<30) - uint32_t((uint64_t(a)*r) >> 32)) * uint64_t(r)) >> 30; - } - - // shift right 1-bit to make room for the sign bit - *exponent = 30-lz-1; - r >>= 1; - return s ? -r : r; -} - -int32_t gglRecipQ(GGLfixed x, int q) -{ - int shift; - x = gglRecipQNormalized(x, &shift); - shift += 16-q; - if (shift > 0) - x += 1L << (shift-1); // rounding - x >>= shift; - return x; -} - -// ------------------------------------------------------------------------ - -static const GGLfixed ggl_sqrt_reciproc_approx_tab[8] = { - // 1/sqrt(x) with x = 1-N/16, N=[8...1] - 0x16A09, 0x15555, 0x143D1, 0x134BF, 0x1279A, 0x11C01, 0x111AC, 0x10865 -}; - -GGLfixed gglSqrtRecipx(GGLfixed x) -{ - if (x == 0) return FIXED_MAX; - if (x == FIXED_ONE) return x; - const GGLfixed a = x; - const int32_t lz = gglClz(x); - x = ggl_sqrt_reciproc_approx_tab[(a>>(28-lz))&0x7]; - const int32_t exp = lz - 16; - if (exp <= 0) x >>= -exp>>1; - else x <<= (exp>>1) + (exp & 1); - if (exp & 1) { - x = gglMulx(x, ggl_sqrt_reciproc_approx_tab[0])>>1; - } - // 2 Newton-Raphson iterations: x = x/2*(3-(a*x)*x) - x = gglMulx((x>>1),(0x30000 - gglMulx(gglMulx(a,x),x))); - x = gglMulx((x>>1),(0x30000 - gglMulx(gglMulx(a,x),x))); - return x; -} - -GGLfixed gglSqrtx(GGLfixed a) -{ - // Compute a full precision square-root (24 bits accuracy) - GGLfixed r = 0; - GGLfixed bit = 0x800000; - int32_t bshift = 15; - do { - GGLfixed temp = bit + (r<<1); - if (bshift >= 8) temp <<= (bshift-8); - else temp >>= (8-bshift); - if (a >= temp) { - r += bit; - a -= temp; - } - bshift--; - } while (bit>>=1); - return r; -} - -// ------------------------------------------------------------------------ - -static const GGLfixed ggl_log_approx_tab[] = { - // -ln(x)/ln(2) with x = N/16, N=[8...16] - 0xFFFF, 0xd47f, 0xad96, 0x8a62, 0x6a3f, 0x4caf, 0x3151, 0x17d6, 0x0000 -}; - -static const GGLfixed ggl_alog_approx_tab[] = { // domain [0 - 1.0] - 0xffff, 0xeac0, 0xd744, 0xc567, 0xb504, 0xa5fe, 0x9837, 0x8b95, 0x8000 -}; - -GGLfixed gglPowx(GGLfixed x, GGLfixed y) -{ - // prerequisite: 0 <= x <= 1, and y >=0 - - // pow(x,y) = 2^(y*log2(x)) - // = 2^(y*log2(x*(2^exp)*(2^-exp)))) - // = 2^(y*(log2(X)-exp)) - // = 2^(log2(X)*y - y*exp) - // = 2^( - (-log2(X)*y + y*exp) ) - - int32_t exp = gglClz(x) - 16; - GGLfixed f = x << exp; - x = (f & 0x0FFF)<<4; - f = (f >> 12) & 0x7; - GGLfixed p = gglMulAddx( - ggl_log_approx_tab[f+1] - ggl_log_approx_tab[f], x, - ggl_log_approx_tab[f]); - p = gglMulAddx(p, y, y*exp); - exp = gglFixedToIntFloor(p); - if (exp < 31) { - p = gglFracx(p); - x = (p & 0x1FFF)<<3; - p >>= 13; - p = gglMulAddx( - ggl_alog_approx_tab[p+1] - ggl_alog_approx_tab[p], x, - ggl_alog_approx_tab[p]); - p >>= exp; - } else { - p = 0; - } - return p; - // ( powf((a*65536.0f), (b*65536.0f)) ) * 65536.0f; -} - -// ------------------------------------------------------------------------ - -int32_t gglDivQ(GGLfixed n, GGLfixed d, int32_t i) -{ - //int32_t r =int32_t((int64_t(n)< 0) d <<= nd; - else n <<= -nd; - uint32_t q = 0; - - int j = i & 7; - i >>= 3; - - // gcc deals with the code below pretty well. - // we get 3.75 cycles per bit in the main loop - // and 8 cycles per bit in the termination loop - if (ggl_likely(i)) { - n -= d; - do { - q <<= 8; - if (n>=0) q |= 128; - else n += d; - n = n*2 - d; - if (n>=0) q |= 64; - else n += d; - n = n*2 - d; - if (n>=0) q |= 32; - else n += d; - n = n*2 - d; - if (n>=0) q |= 16; - else n += d; - n = n*2 - d; - if (n>=0) q |= 8; - else n += d; - n = n*2 - d; - if (n>=0) q |= 4; - else n += d; - n = n*2 - d; - if (n>=0) q |= 2; - else n += d; - n = n*2 - d; - if (n>=0) q |= 1; - else n += d; - - if (--i == 0) - goto finish; - - n = n*2 - d; - } while(true); - do { - q <<= 1; - n = n*2 - d; - if (n>=0) q |= 1; - else n += d; - finish: ; - } while (j--); - return (ds<0) ? -q : q; - } - - n -= d; - if (n>=0) q |= 1; - else n += d; - j--; - goto finish; -} - -// ------------------------------------------------------------------------ - -// assumes that the int32_t values of a, b, and c are all positive -// use when both a and b are larger than c - -template -static inline void swap(T& a, T& b) { - T t(a); - a = b; - b = t; -} - -static __attribute__((noinline)) -int32_t slow_muldiv(uint32_t a, uint32_t b, uint32_t c) -{ - // first we compute a*b as a 64-bit integer - // (GCC generates umull with the code below) - uint64_t ab = uint64_t(a)*b; - uint32_t hi = ab>>32; - uint32_t lo = ab; - uint32_t result; - - // now perform the division - if (hi >= c) { - overflow: - result = 0x7fffffff; // basic overflow - } else if (hi == 0) { - result = lo/c; // note: c can't be 0 - if ((result >> 31) != 0) // result must fit in 31 bits - goto overflow; - } else { - uint32_t r = hi; - int bits = 31; - result = 0; - do { - r = (r << 1) | (lo >> 31); - lo <<= 1; - result <<= 1; - if (r >= c) { - r -= c; - result |= 1; - } - } while (bits--); - } - return int32_t(result); -} - -// assumes a >= 0 and c >= b >= 0 -static inline -int32_t quick_muldiv(int32_t a, int32_t b, int32_t c) -{ - int32_t r = 0, q = 0, i; - int leading = gglClz(a); - i = 32 - leading; - a <<= leading; - do { - r <<= 1; - if (a < 0) - r += b; - a <<= 1; - q <<= 1; - if (r >= c) { - r -= c; - q++; - } - asm(""::); // gcc generates better code this way - if (r >= c) { - r -= c; - q++; - } - } - while (--i); - return q; -} - -// this function computes a*b/c with 64-bit intermediate accuracy -// overflows (e.g. division by 0) are handled and return INT_MAX - -int32_t gglMulDivi(int32_t a, int32_t b, int32_t c) -{ - int32_t result; - int32_t sign = a^b^c; - - if (a < 0) a = -a; - if (b < 0) b = -b; - if (c < 0) c = -c; - - if (a < b) { - swap(a, b); - } - - if (b <= c) result = quick_muldiv(a, b, c); - else result = slow_muldiv((uint32_t)a, (uint32_t)b, (uint32_t)c); - - if (sign < 0) - result = -result; - - return result; -} diff --git a/libpixelflinger/format.cpp b/libpixelflinger/format.cpp deleted file mode 100644 index 6546e8c06..000000000 --- a/libpixelflinger/format.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* libs/pixelflinger/format.cpp -** -** Copyright 2006, 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 - -namespace android { - -static GGLFormat const gPixelFormatInfos[] = -{ // Alpha Red Green Blue - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 4, 32, {{32,24, 8, 0, 16, 8, 24,16 }}, GGL_RGBA }, // PIXEL_FORMAT_RGBA_8888 - { 4, 24, {{ 0, 0, 8, 0, 16, 8, 24,16 }}, GGL_RGB }, // PIXEL_FORMAT_RGBX_8888 - { 3, 24, {{ 0, 0, 8, 0, 16, 8, 24,16 }}, GGL_RGB }, // PIXEL_FORMAT_RGB_888 - { 2, 16, {{ 0, 0, 16,11, 11, 5, 5, 0 }}, GGL_RGB }, // PIXEL_FORMAT_RGB_565 - { 4, 32, {{32,24, 24,16, 16, 8, 8, 0 }}, GGL_RGBA }, // PIXEL_FORMAT_BGRA_8888 - { 2, 16, {{ 1, 0, 16,11, 11, 6, 6, 1 }}, GGL_RGBA }, // PIXEL_FORMAT_RGBA_5551 - { 2, 16, {{ 4, 0, 16,12, 12, 8, 8, 4 }}, GGL_RGBA }, // PIXEL_FORMAT_RGBA_4444 - { 1, 8, {{ 8, 0, 0, 0, 0, 0, 0, 0 }}, GGL_ALPHA}, // PIXEL_FORMAT_A8 - { 1, 8, {{ 0, 0, 8, 0, 8, 0, 8, 0 }}, GGL_LUMINANCE},//PIXEL_FORMAT_L8 - { 2, 16, {{16, 8, 8, 0, 8, 0, 8, 0 }}, GGL_LUMINANCE_ALPHA},// PIXEL_FORMAT_LA_88 - { 1, 8, {{ 0, 0, 8, 5, 5, 2, 2, 0 }}, GGL_RGB }, // PIXEL_FORMAT_RGB_332 - - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - - { 2, 16, {{ 0, 0, 16, 0, 0, 0, 0, 0 }}, GGL_DEPTH_COMPONENT}, - { 1, 8, {{ 8, 0, 0, 0, 0, 0, 0, 0 }}, GGL_STENCIL_INDEX }, - { 4, 24, {{ 0, 0, 24, 0, 0, 0, 0, 0 }}, GGL_DEPTH_COMPONENT}, - { 4, 8, {{ 32,24, 0, 0, 0, 0, 0, 0 }}, GGL_STENCIL_INDEX }, - - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - { 0, 0, {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0 }, // PIXEL_FORMAT_NONE - -}; - -}; // namespace android - - -const GGLFormat* gglGetPixelFormatTable(size_t* numEntries) -{ - if (numEntries) { - *numEntries = sizeof(android::gPixelFormatInfos)/sizeof(GGLFormat); - } - return android::gPixelFormatInfos; -} diff --git a/libpixelflinger/include/pixelflinger/format.h b/libpixelflinger/include/pixelflinger/format.h deleted file mode 100644 index 82eeca4d7..000000000 --- a/libpixelflinger/include/pixelflinger/format.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2005 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_PIXELFLINGER_FORMAT_H -#define ANDROID_PIXELFLINGER_FORMAT_H - -#include -#include - -enum GGLPixelFormat { - // these constants need to match those - // in graphics/PixelFormat.java, ui/PixelFormat.h, BlitHardware.h - GGL_PIXEL_FORMAT_UNKNOWN = 0, - GGL_PIXEL_FORMAT_NONE = 0, - - GGL_PIXEL_FORMAT_RGBA_8888 = 1, // 4x8-bit ARGB - GGL_PIXEL_FORMAT_RGBX_8888 = 2, // 3x8-bit RGB stored in 32-bit chunks - GGL_PIXEL_FORMAT_RGB_888 = 3, // 3x8-bit RGB - GGL_PIXEL_FORMAT_RGB_565 = 4, // 16-bit RGB - GGL_PIXEL_FORMAT_BGRA_8888 = 5, // 4x8-bit BGRA - GGL_PIXEL_FORMAT_RGBA_5551 = 6, // 16-bit RGBA - GGL_PIXEL_FORMAT_RGBA_4444 = 7, // 16-bit RGBA - - GGL_PIXEL_FORMAT_A_8 = 8, // 8-bit A - GGL_PIXEL_FORMAT_L_8 = 9, // 8-bit L (R=G=B = L) - GGL_PIXEL_FORMAT_LA_88 = 0xA, // 16-bit LA - GGL_PIXEL_FORMAT_RGB_332 = 0xB, // 8-bit RGB (non paletted) - - // reserved range. don't use. - GGL_PIXEL_FORMAT_RESERVED_10 = 0x10, - GGL_PIXEL_FORMAT_RESERVED_11 = 0x11, - GGL_PIXEL_FORMAT_RESERVED_12 = 0x12, - GGL_PIXEL_FORMAT_RESERVED_13 = 0x13, - GGL_PIXEL_FORMAT_RESERVED_14 = 0x14, - GGL_PIXEL_FORMAT_RESERVED_15 = 0x15, - GGL_PIXEL_FORMAT_RESERVED_16 = 0x16, - GGL_PIXEL_FORMAT_RESERVED_17 = 0x17, - - // reserved/special formats - GGL_PIXEL_FORMAT_Z_16 = 0x18, - GGL_PIXEL_FORMAT_S_8 = 0x19, - GGL_PIXEL_FORMAT_SZ_24 = 0x1A, - GGL_PIXEL_FORMAT_SZ_8 = 0x1B, - - // reserved range. don't use. - GGL_PIXEL_FORMAT_RESERVED_20 = 0x20, - GGL_PIXEL_FORMAT_RESERVED_21 = 0x21, -}; - -enum GGLFormatComponents { - GGL_STENCIL_INDEX = 0x1901, - GGL_DEPTH_COMPONENT = 0x1902, - GGL_ALPHA = 0x1906, - GGL_RGB = 0x1907, - GGL_RGBA = 0x1908, - GGL_LUMINANCE = 0x1909, - GGL_LUMINANCE_ALPHA = 0x190A, -}; - -enum GGLFormatComponentIndex { - GGL_INDEX_ALPHA = 0, - GGL_INDEX_RED = 1, - GGL_INDEX_GREEN = 2, - GGL_INDEX_BLUE = 3, - GGL_INDEX_STENCIL = 0, - GGL_INDEX_DEPTH = 1, - GGL_INDEX_Y = 0, - GGL_INDEX_CB = 1, - GGL_INDEX_CR = 2, -}; - -typedef struct { -#ifdef __cplusplus - enum { - ALPHA = GGL_INDEX_ALPHA, - RED = GGL_INDEX_RED, - GREEN = GGL_INDEX_GREEN, - BLUE = GGL_INDEX_BLUE, - STENCIL = GGL_INDEX_STENCIL, - DEPTH = GGL_INDEX_DEPTH, - LUMA = GGL_INDEX_Y, - CHROMAB = GGL_INDEX_CB, - CHROMAR = GGL_INDEX_CR, - }; - inline uint32_t mask(int i) const { - return ((1<<(c[i].h-c[i].l))-1)< -#include - -#include - -// GGL types - -typedef int8_t GGLbyte; // b -typedef int16_t GGLshort; // s -typedef int32_t GGLint; // i -typedef ssize_t GGLsizei; // i -typedef int32_t GGLfixed; // x -typedef int32_t GGLclampx; // x -typedef float GGLfloat; // f -typedef float GGLclampf; // f -typedef double GGLdouble; // d -typedef double GGLclampd; // d -typedef uint8_t GGLubyte; // ub -typedef uint8_t GGLboolean; // ub -typedef uint16_t GGLushort; // us -typedef uint32_t GGLuint; // ui -typedef unsigned int GGLenum; // ui -typedef unsigned int GGLbitfield; // ui -typedef void GGLvoid; -typedef int32_t GGLfixed32; -typedef int32_t GGLcolor; -typedef int32_t GGLcoord; - -// ---------------------------------------------------------------------------- - -#define GGL_MAX_VIEWPORT_DIMS 4096 -#define GGL_MAX_TEXTURE_SIZE 4096 -#define GGL_MAX_ALIASED_POINT_SIZE 0x7FFFFFF -#define GGL_MAX_SMOOTH_POINT_SIZE 2048 -#define GGL_MAX_SMOOTH_LINE_WIDTH 2048 - -// ---------------------------------------------------------------------------- - -// All these names are compatible with their OpenGL equivalents -// some of them are listed only for completeness -enum GGLNames { - GGL_FALSE = 0, - GGL_TRUE = 1, - - // enable/disable - GGL_SCISSOR_TEST = 0x0C11, - GGL_TEXTURE_2D = 0x0DE1, - GGL_ALPHA_TEST = 0x0BC0, - GGL_BLEND = 0x0BE2, - GGL_COLOR_LOGIC_OP = 0x0BF2, - GGL_DITHER = 0x0BD0, - GGL_STENCIL_TEST = 0x0B90, - GGL_DEPTH_TEST = 0x0B71, - GGL_AA = 0x80000001, - GGL_W_LERP = 0x80000004, - GGL_POINT_SMOOTH_NICE = 0x80000005, - - // buffers, pixel drawing/reading - GGL_COLOR = 0x1800, - - // fog - GGL_FOG = 0x0B60, - - // shade model - GGL_FLAT = 0x1D00, - GGL_SMOOTH = 0x1D01, - - // Texture parameter name - GGL_TEXTURE_MIN_FILTER = 0x2801, - GGL_TEXTURE_MAG_FILTER = 0x2800, - GGL_TEXTURE_WRAP_S = 0x2802, - GGL_TEXTURE_WRAP_T = 0x2803, - GGL_TEXTURE_WRAP_R = 0x2804, - - // Texture Filter - GGL_NEAREST = 0x2600, - GGL_LINEAR = 0x2601, - GGL_NEAREST_MIPMAP_NEAREST = 0x2700, - GGL_LINEAR_MIPMAP_NEAREST = 0x2701, - GGL_NEAREST_MIPMAP_LINEAR = 0x2702, - GGL_LINEAR_MIPMAP_LINEAR = 0x2703, - - // Texture Wrap Mode - GGL_CLAMP = 0x2900, - GGL_REPEAT = 0x2901, - GGL_CLAMP_TO_EDGE = 0x812F, - - // Texture Env Mode - GGL_REPLACE = 0x1E01, - GGL_MODULATE = 0x2100, - GGL_DECAL = 0x2101, - GGL_ADD = 0x0104, - - // Texture Env Parameter - GGL_TEXTURE_ENV_MODE = 0x2200, - GGL_TEXTURE_ENV_COLOR = 0x2201, - - // Texture Env Target - GGL_TEXTURE_ENV = 0x2300, - - // Texture coord generation - GGL_TEXTURE_GEN_MODE = 0x2500, - GGL_S = 0x2000, - GGL_T = 0x2001, - GGL_R = 0x2002, - GGL_Q = 0x2003, - GGL_ONE_TO_ONE = 0x80000002, - GGL_AUTOMATIC = 0x80000003, - - // AlphaFunction - GGL_NEVER = 0x0200, - GGL_LESS = 0x0201, - GGL_EQUAL = 0x0202, - GGL_LEQUAL = 0x0203, - GGL_GREATER = 0x0204, - GGL_NOTEQUAL = 0x0205, - GGL_GEQUAL = 0x0206, - GGL_ALWAYS = 0x0207, - - // LogicOp - GGL_CLEAR = 0x1500, // 0 - GGL_AND = 0x1501, // s & d - GGL_AND_REVERSE = 0x1502, // s & ~d - GGL_COPY = 0x1503, // s - GGL_AND_INVERTED = 0x1504, // ~s & d - GGL_NOOP = 0x1505, // d - GGL_XOR = 0x1506, // s ^ d - GGL_OR = 0x1507, // s | d - GGL_NOR = 0x1508, // ~(s | d) - GGL_EQUIV = 0x1509, // ~(s ^ d) - GGL_INVERT = 0x150A, // ~d - GGL_OR_REVERSE = 0x150B, // s | ~d - GGL_COPY_INVERTED = 0x150C, // ~s - GGL_OR_INVERTED = 0x150D, // ~s | d - GGL_NAND = 0x150E, // ~(s & d) - GGL_SET = 0x150F, // 1 - - // blending equation & function - GGL_ZERO = 0, // SD - GGL_ONE = 1, // SD - GGL_SRC_COLOR = 0x0300, // D - GGL_ONE_MINUS_SRC_COLOR = 0x0301, // D - GGL_SRC_ALPHA = 0x0302, // SD - GGL_ONE_MINUS_SRC_ALPHA = 0x0303, // SD - GGL_DST_ALPHA = 0x0304, // SD - GGL_ONE_MINUS_DST_ALPHA = 0x0305, // SD - GGL_DST_COLOR = 0x0306, // S - GGL_ONE_MINUS_DST_COLOR = 0x0307, // S - GGL_SRC_ALPHA_SATURATE = 0x0308, // S - - // clear bits - GGL_DEPTH_BUFFER_BIT = 0x00000100, - GGL_STENCIL_BUFFER_BIT = 0x00000400, - GGL_COLOR_BUFFER_BIT = 0x00004000, - - // errors - GGL_NO_ERROR = 0, - GGL_INVALID_ENUM = 0x0500, - GGL_INVALID_VALUE = 0x0501, - GGL_INVALID_OPERATION = 0x0502, - GGL_STACK_OVERFLOW = 0x0503, - GGL_STACK_UNDERFLOW = 0x0504, - GGL_OUT_OF_MEMORY = 0x0505 -}; - -// ---------------------------------------------------------------------------- - -typedef struct { - GGLsizei version; // always set to sizeof(GGLSurface) - GGLuint width; // width in pixels - GGLuint height; // height in pixels - GGLint stride; // stride in pixels - GGLubyte* data; // pointer to the bits - GGLubyte format; // pixel format - GGLubyte rfu[3]; // must be zero - // these values are dependent on the used format - union { - GGLint compressedFormat; - GGLint vstride; - }; - void* reserved; -} GGLSurface; - - -typedef struct { - // immediate rendering - void (*pointx)(void *con, const GGLcoord* v, GGLcoord r); - void (*linex)(void *con, - const GGLcoord* v0, const GGLcoord* v1, GGLcoord width); - void (*recti)(void* c, GGLint l, GGLint t, GGLint r, GGLint b); - void (*trianglex)(void* c, - GGLcoord const* v0, GGLcoord const* v1, GGLcoord const* v2); - - // scissor - void (*scissor)(void* c, GGLint x, GGLint y, GGLsizei width, GGLsizei height); - - // Set the textures and color buffers - void (*activeTexture)(void* c, GGLuint tmu); - void (*bindTexture)(void* c, const GGLSurface* surface); - void (*colorBuffer)(void* c, const GGLSurface* surface); - void (*readBuffer)(void* c, const GGLSurface* surface); - void (*depthBuffer)(void* c, const GGLSurface* surface); - void (*bindTextureLod)(void* c, GGLuint tmu, const GGLSurface* surface); - - // enable/disable features - void (*enable)(void* c, GGLenum name); - void (*disable)(void* c, GGLenum name); - void (*enableDisable)(void* c, GGLenum name, GGLboolean en); - - // specify the fragment's color - void (*shadeModel)(void* c, GGLenum mode); - void (*color4xv)(void* c, const GGLclampx* color); - // specify color iterators (16.16) - void (*colorGrad12xv)(void* c, const GGLcolor* grad); - - // specify Z coordinate iterators (0.32) - void (*zGrad3xv)(void* c, const GGLfixed32* grad); - - // specify W coordinate iterators (16.16) - void (*wGrad3xv)(void* c, const GGLfixed* grad); - - // specify fog iterator & color (16.16) - void (*fogGrad3xv)(void* c, const GGLfixed* grad); - void (*fogColor3xv)(void* c, const GGLclampx* color); - - // specify blending parameters - void (*blendFunc)(void* c, GGLenum src, GGLenum dst); - void (*blendFuncSeparate)(void* c, GGLenum src, GGLenum dst, - GGLenum srcAlpha, GGLenum dstAplha); - - // texture environnement (REPLACE / MODULATE / DECAL / BLEND) - void (*texEnvi)(void* c, GGLenum target, - GGLenum pname, - GGLint param); - - void (*texEnvxv)(void* c, GGLenum target, - GGLenum pname, const GGLfixed* params); - - // texture parameters (Wrapping, filter) - void (*texParameteri)(void* c, GGLenum target, - GGLenum pname, - GGLint param); - - // texture iterators (16.16) - void (*texCoord2i)(void* c, GGLint s, GGLint t); - void (*texCoord2x)(void* c, GGLfixed s, GGLfixed t); - - // s, dsdx, dsdy, scale, t, dtdx, dtdy, tscale - // This api uses block floating-point for S and T texture coordinates. - // All values are given in 16.16, scaled by 'scale'. In other words, - // set scale to 0, for 16.16 values. - void (*texCoordGradScale8xv)(void* c, GGLint tmu, const int32_t* grad8); - - void (*texGeni)(void* c, GGLenum coord, GGLenum pname, GGLint param); - - // masking - void (*colorMask)(void* c, GGLboolean red, - GGLboolean green, - GGLboolean blue, - GGLboolean alpha); - - void (*depthMask)(void* c, GGLboolean flag); - - void (*stencilMask)(void* c, GGLuint mask); - - // alpha func - void (*alphaFuncx)(void* c, GGLenum func, GGLclampx ref); - - // depth func - void (*depthFunc)(void* c, GGLenum func); - - // logic op - void (*logicOp)(void* c, GGLenum opcode); - - // clear - void (*clear)(void* c, GGLbitfield mask); - void (*clearColorx)(void* c, - GGLclampx r, GGLclampx g, GGLclampx b, GGLclampx a); - void (*clearDepthx)(void* c, GGLclampx depth); - void (*clearStencil)(void* c, GGLint s); - - // framebuffer operations - void (*copyPixels)(void* c, GGLint x, GGLint y, - GGLsizei width, GGLsizei height, GGLenum type); - void (*rasterPos2x)(void* c, GGLfixed x, GGLfixed y); - void (*rasterPos2i)(void* c, GGLint x, GGLint y); -} GGLContext; - -// ---------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -// construct / destroy the context -ssize_t gglInit(GGLContext** context); -ssize_t gglUninit(GGLContext* context); - -GGLint gglBitBlit( - GGLContext* c, - int tmu, - GGLint crop[4], - GGLint where[4]); - -#ifdef __cplusplus -}; -#endif - -// ---------------------------------------------------------------------------- - -#endif // ANDROID_PIXELFLINGER_H diff --git a/libpixelflinger/include/private/pixelflinger/ggl_context.h b/libpixelflinger/include/private/pixelflinger/ggl_context.h deleted file mode 100644 index 563b0f119..000000000 --- a/libpixelflinger/include/private/pixelflinger/ggl_context.h +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright (C) 2006 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_GGL_CONTEXT_H -#define ANDROID_GGL_CONTEXT_H - -#include -#include -#include -#include -#include - -#include -#include - -namespace android { - -// ---------------------------------------------------------------------------- - -#if BYTE_ORDER == LITTLE_ENDIAN - -inline uint32_t GGL_RGBA_TO_HOST(uint32_t v) { - return v; -} -inline uint32_t GGL_HOST_TO_RGBA(uint32_t v) { - return v; -} - -#else - -inline uint32_t GGL_RGBA_TO_HOST(uint32_t v) { -#if defined(__mips__) && __mips_isa_rev>=2 - uint32_t r; - __asm__("wsbh %0, %1;" - "rotr %0, %0, 16" - : "=r" (r) - : "r" (v) - ); - return r; -#else - return (v<<24) | (v>>24) | ((v<<8)&0xff0000) | ((v>>8)&0xff00); -#endif -} -inline uint32_t GGL_HOST_TO_RGBA(uint32_t v) { -#if defined(__mips__) && __mips_isa_rev>=2 - uint32_t r; - __asm__("wsbh %0, %1;" - "rotr %0, %0, 16" - : "=r" (r) - : "r" (v) - ); - return r; -#else - return (v<<24) | (v>>24) | ((v<<8)&0xff0000) | ((v>>8)&0xff00); -#endif -} - -#endif - -// ---------------------------------------------------------------------------- - -const int GGL_DITHER_BITS = 6; // dither weights stored on 6 bits -const int GGL_DITHER_ORDER_SHIFT= 3; -const int GGL_DITHER_ORDER = (1<> (16-TRI_FRACTION_BITS)) - -#define TRI_SNAP_NEXT_HALF(x) (TRI_CEIL((x)+TRI_HALF) - TRI_HALF) -#define TRI_SNAP_PREV_HALF(x) (TRI_CEIL((x)-TRI_HALF) - TRI_HALF) - -// ---------------------------------------------------------------------------- - -const int GGL_COLOR_BITS = 24; - -// To maintain 8-bits color chanels, with a maximum GGLSurface -// size of 4096 and GGL_SUBPIXEL_BITS=4, we need 8 + 12 + 4 = 24 bits -// for encoding the color iterators - -inline GGLcolor gglFixedToIteratedColor(GGLfixed c) { - return (c << 8) - c; -} - -// ---------------------------------------------------------------------------- - -template struct CTA; -template<> struct CTA { }; - -#define GGL_CONTEXT(con, c) context_t *(con) = static_cast(c) /* NOLINT */ -#define GGL_OFFSETOF(field) uintptr_t(&(((context_t*)0)->field)) -#define GGL_INIT_PROC(p, f) p.f = ggl_ ## f; -#define GGL_BETWEEN(x, L, H) (uint32_t((x)-(L)) <= ((H)-(L))) - -#define ggl_likely(x) __builtin_expect(!!(x), 1) -#define ggl_unlikely(x) __builtin_expect(!!(x), 0) - -const int GGL_TEXTURE_UNIT_COUNT = 2; -const int GGL_TMU_STATE = 0x00000001; -const int GGL_CB_STATE = 0x00000002; -const int GGL_PIXEL_PIPELINE_STATE = 0x00000004; - -// ---------------------------------------------------------------------------- - -#define GGL_RESERVE_NEEDS(name, l, s) \ - const uint32_t GGL_NEEDS_##name##_MASK = (((1LU<<(s))-1)<<(l)); \ - const uint32_t GGL_NEEDS_##name##_SHIFT = (l); - -#define GGL_BUILD_NEEDS(val, name) \ - (((val)<<(GGL_NEEDS_##name##_SHIFT)) & GGL_NEEDS_##name##_MASK) - -#define GGL_READ_NEEDS(name, n) \ - (uint32_t((n) & GGL_NEEDS_##name##_MASK) >> GGL_NEEDS_##name##_SHIFT) - -#define GGL_NEED_MASK(name) (uint32_t(GGL_NEEDS_##name##_MASK)) -#define GGL_NEED(name, val) GGL_BUILD_NEEDS(val, name) - -GGL_RESERVE_NEEDS( CB_FORMAT, 0, 6 ) -GGL_RESERVE_NEEDS( SHADE, 6, 1 ) -GGL_RESERVE_NEEDS( W, 7, 1 ) -GGL_RESERVE_NEEDS( BLEND_SRC, 8, 4 ) -GGL_RESERVE_NEEDS( BLEND_DST, 12, 4 ) -GGL_RESERVE_NEEDS( BLEND_SRCA, 16, 4 ) -GGL_RESERVE_NEEDS( BLEND_DSTA, 20, 4 ) -GGL_RESERVE_NEEDS( LOGIC_OP, 24, 4 ) -GGL_RESERVE_NEEDS( MASK_ARGB, 28, 4 ) - -GGL_RESERVE_NEEDS( P_ALPHA_TEST, 0, 3 ) -GGL_RESERVE_NEEDS( P_AA, 3, 1 ) -GGL_RESERVE_NEEDS( P_DEPTH_TEST, 4, 3 ) -GGL_RESERVE_NEEDS( P_MASK_Z, 7, 1 ) -GGL_RESERVE_NEEDS( P_DITHER, 8, 1 ) -GGL_RESERVE_NEEDS( P_FOG, 9, 1 ) -GGL_RESERVE_NEEDS( P_RESERVED1, 10,22 ) - -GGL_RESERVE_NEEDS( T_FORMAT, 0, 6 ) -GGL_RESERVE_NEEDS( T_RESERVED0, 6, 1 ) -GGL_RESERVE_NEEDS( T_POT, 7, 1 ) -GGL_RESERVE_NEEDS( T_S_WRAP, 8, 2 ) -GGL_RESERVE_NEEDS( T_T_WRAP, 10, 2 ) -GGL_RESERVE_NEEDS( T_ENV, 12, 3 ) -GGL_RESERVE_NEEDS( T_LINEAR, 15, 1 ) - -const int GGL_NEEDS_WRAP_CLAMP_TO_EDGE = 0; -const int GGL_NEEDS_WRAP_REPEAT = 1; -const int GGL_NEEDS_WRAP_11 = 2; - -inline uint32_t ggl_wrap_to_needs(uint32_t e) { - switch (e) { - case GGL_CLAMP: return GGL_NEEDS_WRAP_CLAMP_TO_EDGE; - case GGL_REPEAT: return GGL_NEEDS_WRAP_REPEAT; - } - return 0; -} - -inline uint32_t ggl_blendfactor_to_needs(uint32_t b) { - if (b <= 1) return b; - return (b & 0xF)+2; -} - -inline uint32_t ggl_needs_to_blendfactor(uint32_t n) { - if (n <= 1) return n; - return (n - 2) + 0x300; -} - -inline uint32_t ggl_env_to_needs(uint32_t e) { - switch (e) { - case GGL_REPLACE: return 0; - case GGL_MODULATE: return 1; - case GGL_DECAL: return 2; - case GGL_BLEND: return 3; - case GGL_ADD: return 4; - } - return 0; -} - -inline uint32_t ggl_needs_to_env(uint32_t n) { - const uint32_t envs[] = { GGL_REPLACE, GGL_MODULATE, - GGL_DECAL, GGL_BLEND, GGL_ADD }; - return envs[n]; - -} - -// ---------------------------------------------------------------------------- - -enum { - GGL_ENABLE_BLENDING = 0x00000001, - GGL_ENABLE_SMOOTH = 0x00000002, - GGL_ENABLE_AA = 0x00000004, - GGL_ENABLE_LOGIC_OP = 0x00000008, - GGL_ENABLE_ALPHA_TEST = 0x00000010, - GGL_ENABLE_SCISSOR_TEST = 0x00000020, - GGL_ENABLE_TMUS = 0x00000040, - GGL_ENABLE_DEPTH_TEST = 0x00000080, - GGL_ENABLE_STENCIL_TEST = 0x00000100, - GGL_ENABLE_W = 0x00000200, - GGL_ENABLE_DITHER = 0x00000400, - GGL_ENABLE_FOG = 0x00000800, - GGL_ENABLE_POINT_AA_NICE= 0x00001000 -}; - -// ---------------------------------------------------------------------------- - -struct needs_filter_t; -struct needs_t { - inline int match(const needs_filter_t& filter); - inline bool operator == (const needs_t& rhs) const { - return (n==rhs.n) && - (p==rhs.p) && - (t[0]==rhs.t[0]) && - (t[1]==rhs.t[1]); - } - inline bool operator != (const needs_t& rhs) const { - return !operator == (rhs); - } - uint32_t n; - uint32_t p; - uint32_t t[GGL_TEXTURE_UNIT_COUNT]; -}; - -inline int compare_type(const needs_t& lhs, const needs_t& rhs) { - return memcmp(&lhs, &rhs, sizeof(needs_t)); -} - -struct needs_filter_t { - needs_t value; - needs_t mask; -}; - -int needs_t::match(const needs_filter_t& filter) { - uint32_t result = - ((filter.value.n ^ n) & filter.mask.n) | - ((filter.value.p ^ p) & filter.mask.p) | - ((filter.value.t[0] ^ t[0]) & filter.mask.t[0]) | - ((filter.value.t[1] ^ t[1]) & filter.mask.t[1]); - return (result == 0); -} - -// ---------------------------------------------------------------------------- - -struct context_t; -class Assembly; - -struct blend_state_t { - uint32_t src; - uint32_t dst; - uint32_t src_alpha; - uint32_t dst_alpha; - uint8_t reserved; - uint8_t alpha_separate; - uint8_t operation; - uint8_t equation; -}; - -struct mask_state_t { - uint8_t color; - uint8_t depth; - uint32_t stencil; -}; - -struct clear_state_t { - GGLclampx r; - GGLclampx g; - GGLclampx b; - GGLclampx a; - GGLclampx depth; - GGLint stencil; - uint32_t colorPacked; - uint32_t depthPacked; - uint32_t stencilPacked; - uint32_t dirty; -}; - -struct fog_state_t { - uint8_t color[4]; -}; - -struct logic_op_state_t { - uint16_t opcode; -}; - -struct alpha_test_state_t { - uint16_t func; - GGLcolor ref; -}; - -struct depth_test_state_t { - uint16_t func; - GGLclampx clearValue; -}; - -struct scissor_t { - uint32_t user_left; - uint32_t user_right; - uint32_t user_top; - uint32_t user_bottom; - uint32_t left; - uint32_t right; - uint32_t top; - uint32_t bottom; -}; - -struct pixel_t { - uint32_t c[4]; - uint8_t s[4]; -}; - -struct surface_t { - union { - GGLSurface s; - // Keep the following struct field types in line with the corresponding - // GGLSurface fields to avoid mismatches leading to errors. - struct { - GGLsizei reserved; - GGLuint width; - GGLuint height; - GGLint stride; - GGLubyte* data; - GGLubyte format; - GGLubyte dirty; - GGLubyte pad[2]; - }; - }; - void (*read) (const surface_t* s, context_t* c, - uint32_t x, uint32_t y, pixel_t* pixel); - void (*write)(const surface_t* s, context_t* c, - uint32_t x, uint32_t y, const pixel_t* pixel); -}; - -// ---------------------------------------------------------------------------- - -struct texture_shade_t { - union { - struct { - int32_t is0; - int32_t idsdx; - int32_t idsdy; - int sscale; - int32_t it0; - int32_t idtdx; - int32_t idtdy; - int tscale; - }; - struct { - int32_t v; - int32_t dx; - int32_t dy; - int scale; - } st[2]; - }; -}; - -struct texture_iterators_t { - // these are not encoded in the same way than in the - // texture_shade_t structure - union { - struct { - GGLfixed ydsdy; - GGLfixed dsdx; - GGLfixed dsdy; - int sscale; - GGLfixed ydtdy; - GGLfixed dtdx; - GGLfixed dtdy; - int tscale; - }; - struct { - GGLfixed ydvdy; - GGLfixed dvdx; - GGLfixed dvdy; - int scale; - } st[2]; - }; -}; - -struct texture_t { - surface_t surface; - texture_iterators_t iterators; - texture_shade_t shade; - uint32_t s_coord; - uint32_t t_coord; - uint16_t s_wrap; - uint16_t t_wrap; - uint16_t min_filter; - uint16_t mag_filter; - uint16_t env; - uint8_t env_color[4]; - uint8_t enable; - uint8_t dirty; -}; - -struct raster_t { - GGLfixed x; - GGLfixed y; -}; - -struct framebuffer_t { - surface_t color; - surface_t read; - surface_t depth; - surface_t stencil; - int16_t *coverage; - size_t coverageBufferSize; -}; - -// ---------------------------------------------------------------------------- - -struct iterators_t { - int32_t xl; - int32_t xr; - int32_t y; - GGLcolor ydady; - GGLcolor ydrdy; - GGLcolor ydgdy; - GGLcolor ydbdy; - GGLfixed ydzdy; - GGLfixed ydwdy; - GGLfixed ydfdy; -}; - -struct shade_t { - GGLcolor a0; - GGLcolor dadx; - GGLcolor dady; - GGLcolor r0; - GGLcolor drdx; - GGLcolor drdy; - GGLcolor g0; - GGLcolor dgdx; - GGLcolor dgdy; - GGLcolor b0; - GGLcolor dbdx; - GGLcolor dbdy; - uint32_t z0; - GGLfixed32 dzdx; - GGLfixed32 dzdy; - GGLfixed w0; - GGLfixed dwdx; - GGLfixed dwdy; - uint32_t f0; - GGLfixed dfdx; - GGLfixed dfdy; -}; - -// these are used in the generated code -// we use this mirror structure to improve -// data locality in the pixel pipeline -struct generated_tex_vars_t { - uint32_t width; - uint32_t height; - uint32_t stride; - uintptr_t data; - int32_t dsdx; - int32_t dtdx; - int32_t spill[2]; -}; - -struct generated_vars_t { - struct { - int32_t c; - int32_t dx; - } argb[4]; - int32_t aref; - int32_t dzdx; - int32_t zbase; - int32_t f; - int32_t dfdx; - int32_t spill[3]; - generated_tex_vars_t texture[GGL_TEXTURE_UNIT_COUNT]; - int32_t rt; - int32_t lb; -}; - -// ---------------------------------------------------------------------------- - -struct state_t { - framebuffer_t buffers; - texture_t texture[GGL_TEXTURE_UNIT_COUNT]; - scissor_t scissor; - raster_t raster; - blend_state_t blend; - alpha_test_state_t alpha_test; - depth_test_state_t depth_test; - mask_state_t mask; - clear_state_t clear; - fog_state_t fog; - logic_op_state_t logic_op; - uint32_t enables; - uint32_t enabled_tmu; - needs_t needs; -}; - -// ---------------------------------------------------------------------------- - -struct context_t { - GGLContext procs; - state_t state; - shade_t shade; - iterators_t iterators; - generated_vars_t generated_vars __attribute__((aligned(32))); - uint8_t ditherMatrix[GGL_DITHER_SIZE] __attribute__((aligned(32))); - uint32_t packed; - uint32_t packed8888; - const GGLFormat* formats; - uint32_t dirty; - texture_t* activeTMU; - uint32_t activeTMUIndex; - - void (*init_y)(context_t* c, int32_t y); - void (*step_y)(context_t* c); - void (*scanline)(context_t* c); - void (*span)(context_t* c); - void (*rect)(context_t* c, size_t yc); - - void* base; - Assembly* scanline_as; - GGLenum error; -}; - -// ---------------------------------------------------------------------------- - -void ggl_init_context(context_t* context); -void ggl_uninit_context(context_t* context); -void ggl_error(context_t* c, GGLenum error); -int64_t ggl_system_time(); - -// ---------------------------------------------------------------------------- - -}; - -#endif // ANDROID_GGL_CONTEXT_H - diff --git a/libpixelflinger/include/private/pixelflinger/ggl_fixed.h b/libpixelflinger/include/private/pixelflinger/ggl_fixed.h deleted file mode 100644 index 4217a8997..000000000 --- a/libpixelflinger/include/private/pixelflinger/ggl_fixed.h +++ /dev/null @@ -1,878 +0,0 @@ -/* - * Copyright (C) 2005 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_GGL_FIXED_H -#define ANDROID_GGL_FIXED_H - -#include -#include - -// ---------------------------------------------------------------------------- - -#define CONST __attribute__((const)) -#define ALWAYS_INLINE __attribute__((always_inline)) - -const GGLfixed FIXED_BITS = 16; -const GGLfixed FIXED_EPSILON = 1; -const GGLfixed FIXED_ONE = 1L<>FIXED_BITS; -} -GGLfixed gglFixedToIntFloor(GGLfixed f) { - return f>>FIXED_BITS; -} -GGLfixed gglFixedToIntCeil(GGLfixed f) { - return (f + ((1<>FIXED_BITS; -} - -GGLfixed gglFracx(GGLfixed v) { - return v & ((1<>1)<<10 ) -#define GGL_S_TO_X(_x) GGLfixed( ((int32_t(_x)+1)>>1)<<2 ) -#define GGL_I_TO_X(_x) GGLfixed( ((int32_t(_x)>>1)+1)>>14 ) -#define GGL_UB_TO_X(_x) GGLfixed( uint32_t(_x) + \ - (uint32_t(_x)<<8) + \ - (uint32_t(_x)>>7) ) -#define GGL_US_TO_X(_x) GGLfixed( (_x) + ((_x)>>15) ) -#define GGL_UI_TO_X(_x) GGLfixed( (((_x)>>1)+1)>>15 ) - -// ---------------------------------------------------------------------------- - -GGLfixed gglPowx(GGLfixed x, GGLfixed y) CONST; -GGLfixed gglSqrtx(GGLfixed a) CONST; -GGLfixed gglSqrtRecipx(GGLfixed x) CONST; -int32_t gglMulDivi(int32_t a, int32_t b, int32_t c); - -int32_t gglRecipQNormalized(int32_t x, int* exponent); -int32_t gglRecipQ(GGLfixed x, int q) CONST; - -inline GGLfixed gglRecip(GGLfixed x) CONST; -inline GGLfixed gglRecip(GGLfixed x) { - return gglRecipQ(x, 16); -} - -inline GGLfixed gglRecip28(GGLfixed x) CONST; -int32_t gglRecip28(GGLfixed x) { - return gglRecipQ(x, 28); -} - -// ---------------------------------------------------------------------------- - -#if defined(__arm__) && !defined(__thumb__) - -// inline ARM implementations -inline GGLfixed gglMulx(GGLfixed x, GGLfixed y, int shift) CONST; -__attribute__((always_inline)) inline GGLfixed gglMulx(GGLfixed x, GGLfixed y, int shift) { - GGLfixed result, t; - if (__builtin_constant_p(shift)) { - asm("smull %[lo], %[hi], %[x], %[y] \n" - "movs %[lo], %[lo], lsr %[rshift] \n" - "adc %[lo], %[lo], %[hi], lsl %[lshift] \n" - : [lo]"=r"(result), [hi]"=r"(t), [x]"=r"(x) - : "%[x]"(x), [y]"r"(y), [lshift] "I"(32-shift), [rshift] "I"(shift) - : "cc" - ); - } else { - asm("smull %[lo], %[hi], %[x], %[y] \n" - "movs %[lo], %[lo], lsr %[rshift] \n" - "adc %[lo], %[lo], %[hi], lsl %[lshift] \n" - : [lo]"=&r"(result), [hi]"=&r"(t), [x]"=&r"(x) - : "%[x]"(x), [y]"r"(y), [lshift] "r"(32-shift), [rshift] "r"(shift) - : "cc" - ); - } - return result; -} - -inline GGLfixed gglMulAddx(GGLfixed x, GGLfixed y, GGLfixed a, int shift) CONST; -__attribute__((always_inline)) inline GGLfixed gglMulAddx(GGLfixed x, GGLfixed y, GGLfixed a, - int shift) { - GGLfixed result, t; - if (__builtin_constant_p(shift)) { - asm("smull %[lo], %[hi], %[x], %[y] \n" - "add %[lo], %[a], %[lo], lsr %[rshift] \n" - "add %[lo], %[lo], %[hi], lsl %[lshift] \n" - : [lo]"=&r"(result), [hi]"=&r"(t), [x]"=&r"(x) - : "%[x]"(x), [y]"r"(y), [a]"r"(a), [lshift] "I"(32-shift), [rshift] "I"(shift) - ); - } else { - asm("smull %[lo], %[hi], %[x], %[y] \n" - "add %[lo], %[a], %[lo], lsr %[rshift] \n" - "add %[lo], %[lo], %[hi], lsl %[lshift] \n" - : [lo]"=&r"(result), [hi]"=&r"(t), [x]"=&r"(x) - : "%[x]"(x), [y]"r"(y), [a]"r"(a), [lshift] "r"(32-shift), [rshift] "r"(shift) - ); - } - return result; -} - -inline GGLfixed gglMulSubx(GGLfixed x, GGLfixed y, GGLfixed a, int shift) CONST; -inline GGLfixed gglMulSubx(GGLfixed x, GGLfixed y, GGLfixed a, int shift) { - GGLfixed result, t; - if (__builtin_constant_p(shift)) { - asm("smull %[lo], %[hi], %[x], %[y] \n" - "rsb %[lo], %[a], %[lo], lsr %[rshift] \n" - "add %[lo], %[lo], %[hi], lsl %[lshift] \n" - : [lo]"=&r"(result), [hi]"=&r"(t), [x]"=&r"(x) - : "%[x]"(x), [y]"r"(y), [a]"r"(a), [lshift] "I"(32-shift), [rshift] "I"(shift) - ); - } else { - asm("smull %[lo], %[hi], %[x], %[y] \n" - "rsb %[lo], %[a], %[lo], lsr %[rshift] \n" - "add %[lo], %[lo], %[hi], lsl %[lshift] \n" - : [lo]"=&r"(result), [hi]"=&r"(t), [x]"=&r"(x) - : "%[x]"(x), [y]"r"(y), [a]"r"(a), [lshift] "r"(32-shift), [rshift] "r"(shift) - ); - } - return result; -} - -inline int64_t gglMulii(int32_t x, int32_t y) CONST; -inline int64_t gglMulii(int32_t x, int32_t y) -{ - // 64-bits result: r0=low, r1=high - union { - struct { - int32_t lo; - int32_t hi; - } s; - int64_t res; - }; - asm("smull %0, %1, %2, %3 \n" - : "=r"(s.lo), "=&r"(s.hi) - : "%r"(x), "r"(y) - : - ); - return res; -} -#elif defined(__mips__) && __mips_isa_rev < 6 - -/*inline MIPS implementations*/ -inline GGLfixed gglMulx(GGLfixed a, GGLfixed b, int shift) CONST; -inline GGLfixed gglMulx(GGLfixed a, GGLfixed b, int shift) { - GGLfixed result,tmp,tmp1,tmp2; - - if (__builtin_constant_p(shift)) { - if (shift == 0) { - asm ("mult %[a], %[b] \t\n" - "mflo %[res] \t\n" - : [res]"=&r"(result),[tmp]"=&r"(tmp) - : [a]"r"(a),[b]"r"(b) - : "%hi","%lo" - ); - } else if (shift == 32) - { - asm ("mult %[a], %[b] \t\n" - "li %[tmp],1\t\n" - "sll %[tmp],%[tmp],0x1f\t\n" - "mflo %[res] \t\n" - "addu %[tmp1],%[tmp],%[res] \t\n" - "sltu %[tmp1],%[tmp1],%[tmp]\t\n" /*obit*/ - "sra %[tmp],%[tmp],0x1f \t\n" - "mfhi %[res] \t\n" - "addu %[res],%[res],%[tmp]\t\n" - "addu %[res],%[res],%[tmp1]\t\n" - : [res]"=&r"(result),[tmp]"=&r"(tmp),[tmp1]"=&r"(tmp1) - : [a]"r"(a),[b]"r"(b),[shift]"I"(shift) - : "%hi","%lo" - ); - } else if ((shift >0) && (shift < 32)) - { - asm ("mult %[a], %[b] \t\n" - "li %[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[shiftm1] \t\n" - "mflo %[res] \t\n" - "addu %[tmp1],%[tmp],%[res] \t\n" - "sltu %[tmp1],%[tmp1],%[tmp] \t\n" /*obit?*/ - "addu %[res],%[res],%[tmp] \t\n" - "mfhi %[tmp] \t\n" - "addu %[tmp],%[tmp],%[tmp1] \t\n" - "sll %[tmp],%[tmp],%[lshift] \t\n" - "srl %[res],%[res],%[rshift] \t\n" - "or %[res],%[res],%[tmp] \t\n" - : [res]"=&r"(result),[tmp]"=&r"(tmp),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[lshift]"I"(32-shift),[rshift]"I"(shift),[shiftm1]"I"(shift-1) - : "%hi","%lo" - ); - } else { - asm ("mult %[a], %[b] \t\n" - "li %[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[shiftm1] \t\n" - "mflo %[res] \t\n" - "addu %[tmp1],%[tmp],%[res] \t\n" - "sltu %[tmp1],%[tmp1],%[tmp] \t\n" /*obit?*/ - "sra %[tmp2],%[tmp],0x1f \t\n" - "addu %[res],%[res],%[tmp] \t\n" - "mfhi %[tmp] \t\n" - "addu %[tmp],%[tmp],%[tmp2] \t\n" - "addu %[tmp],%[tmp],%[tmp1] \t\n" /*tmp=hi*/ - "srl %[tmp2],%[res],%[rshift] \t\n" - "srav %[res], %[tmp],%[rshift]\t\n" - "sll %[tmp],%[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[norbits] \t\n" - "or %[tmp],%[tmp],%[tmp2] \t\n" - "movz %[res],%[tmp],%[bit5] \t\n" - : [res]"=&r"(result),[tmp]"=&r"(tmp),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[norbits]"I"(~(shift)),[rshift]"I"(shift),[shiftm1] "I"(shift-1),[bit5]"I"(shift & 0x20) - : "%hi","%lo" - ); - } - } else { - asm ("mult %[a], %[b] \t\n" - "li %[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[shiftm1] \t\n" - "mflo %[res] \t\n" - "addu %[tmp1],%[tmp],%[res] \t\n" - "sltu %[tmp1],%[tmp1],%[tmp] \t\n" /*obit?*/ - "sra %[tmp2],%[tmp],0x1f \t\n" - "addu %[res],%[res],%[tmp] \t\n" - "mfhi %[tmp] \t\n" - "addu %[tmp],%[tmp],%[tmp2] \t\n" - "addu %[tmp],%[tmp],%[tmp1] \t\n" /*tmp=hi*/ - "srl %[tmp2],%[res],%[rshift] \t\n" - "srav %[res], %[tmp],%[rshift]\t\n" - "sll %[tmp],%[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[norbits] \t\n" - "or %[tmp],%[tmp],%[tmp2] \t\n" - "movz %[res],%[tmp],%[bit5] \t\n" - : [res]"=&r"(result),[tmp]"=&r"(tmp),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[norbits]"r"(~(shift)),[rshift] "r"(shift),[shiftm1]"r"(shift-1),[bit5] "r"(shift & 0x20) - : "%hi","%lo" - ); - } - - return result; -} - -inline GGLfixed gglMulAddx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) CONST; -inline GGLfixed gglMulAddx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) { - GGLfixed result,t,tmp1,tmp2; - - if (__builtin_constant_p(shift)) { - if (shift == 0) { - asm ("mult %[a], %[b] \t\n" - "mflo %[lo] \t\n" - "addu %[lo],%[lo],%[c] \t\n" - : [lo]"=&r"(result) - : [a]"r"(a),[b]"r"(b),[c]"r"(c) - : "%hi","%lo" - ); - } else if (shift == 32) { - asm ("mult %[a], %[b] \t\n" - "mfhi %[lo] \t\n" - "addu %[lo],%[lo],%[c] \t\n" - : [lo]"=&r"(result) - : [a]"r"(a),[b]"r"(b),[c]"r"(c) - : "%hi","%lo" - ); - } else if ((shift>0) && (shift<32)) { - asm ("mult %[a], %[b] \t\n" - "mflo %[res] \t\n" - "mfhi %[t] \t\n" - "srl %[res],%[res],%[rshift] \t\n" - "sll %[t],%[t],%[lshift] \t\n" - "or %[res],%[res],%[t] \t\n" - "addu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[lshift]"I"(32-shift),[rshift]"I"(shift) - : "%hi","%lo" - ); - } else { - asm ("mult %[a], %[b] \t\n" - "nor %[tmp1],$zero,%[shift]\t\n" - "mflo %[res] \t\n" - "mfhi %[t] \t\n" - "srl %[res],%[res],%[shift] \t\n" - "sll %[tmp2],%[t],1 \t\n" - "sllv %[tmp2],%[tmp2],%[tmp1] \t\n" - "or %[tmp1],%[tmp2],%[res] \t\n" - "srav %[res],%[t],%[shift] \t\n" - "andi %[tmp2],%[shift],0x20\t\n" - "movz %[res],%[tmp1],%[tmp2]\t\n" - "addu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[shift]"I"(shift) - : "%hi","%lo" - ); - } - } else { - asm ("mult %[a], %[b] \t\n" - "nor %[tmp1],$zero,%[shift]\t\n" - "mflo %[res] \t\n" - "mfhi %[t] \t\n" - "srl %[res],%[res],%[shift] \t\n" - "sll %[tmp2],%[t],1 \t\n" - "sllv %[tmp2],%[tmp2],%[tmp1] \t\n" - "or %[tmp1],%[tmp2],%[res] \t\n" - "srav %[res],%[t],%[shift] \t\n" - "andi %[tmp2],%[shift],0x20\t\n" - "movz %[res],%[tmp1],%[tmp2]\t\n" - "addu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[shift]"r"(shift) - : "%hi","%lo" - ); - } - return result; -} - -inline GGLfixed gglMulSubx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) CONST; -inline GGLfixed gglMulSubx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) { - GGLfixed result,t,tmp1,tmp2; - - if (__builtin_constant_p(shift)) { - if (shift == 0) { - asm ("mult %[a], %[b] \t\n" - "mflo %[lo] \t\n" - "subu %[lo],%[lo],%[c] \t\n" - : [lo]"=&r"(result) - : [a]"r"(a),[b]"r"(b),[c]"r"(c) - : "%hi","%lo" - ); - } else if (shift == 32) { - asm ("mult %[a], %[b] \t\n" - "mfhi %[lo] \t\n" - "subu %[lo],%[lo],%[c] \t\n" - : [lo]"=&r"(result) - : [a]"r"(a),[b]"r"(b),[c]"r"(c) - : "%hi","%lo" - ); - } else if ((shift>0) && (shift<32)) { - asm ("mult %[a], %[b] \t\n" - "mflo %[res] \t\n" - "mfhi %[t] \t\n" - "srl %[res],%[res],%[rshift] \t\n" - "sll %[t],%[t],%[lshift] \t\n" - "or %[res],%[res],%[t] \t\n" - "subu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[lshift]"I"(32-shift),[rshift]"I"(shift) - : "%hi","%lo" - ); - } else { - asm ("mult %[a], %[b] \t\n" - "nor %[tmp1],$zero,%[shift]\t\n" - "mflo %[res] \t\n" - "mfhi %[t] \t\n" - "srl %[res],%[res],%[shift] \t\n" - "sll %[tmp2],%[t],1 \t\n" - "sllv %[tmp2],%[tmp2],%[tmp1] \t\n" - "or %[tmp1],%[tmp2],%[res] \t\n" - "srav %[res],%[t],%[shift] \t\n" - "andi %[tmp2],%[shift],0x20\t\n" - "movz %[res],%[tmp1],%[tmp2]\t\n" - "subu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[shift]"I"(shift) - : "%hi","%lo" - ); - } - } else { - asm ("mult %[a], %[b] \t\n" - "nor %[tmp1],$zero,%[shift]\t\n" - "mflo %[res] \t\n" - "mfhi %[t] \t\n" - "srl %[res],%[res],%[shift] \t\n" - "sll %[tmp2],%[t],1 \t\n" - "sllv %[tmp2],%[tmp2],%[tmp1] \t\n" - "or %[tmp1],%[tmp2],%[res] \t\n" - "srav %[res],%[t],%[shift] \t\n" - "andi %[tmp2],%[shift],0x20\t\n" - "movz %[res],%[tmp1],%[tmp2]\t\n" - "subu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[shift]"r"(shift) - : "%hi","%lo" - ); - } - return result; -} - -inline int64_t gglMulii(int32_t x, int32_t y) CONST; -inline int64_t gglMulii(int32_t x, int32_t y) { - union { - struct { -#if defined(__MIPSEL__) - int32_t lo; - int32_t hi; -#elif defined(__MIPSEB__) - int32_t hi; - int32_t lo; -#endif - } s; - int64_t res; - }u; - asm("mult %2, %3 \t\n" - "mfhi %1 \t\n" - "mflo %0 \t\n" - : "=r"(u.s.lo), "=&r"(u.s.hi) - : "%r"(x), "r"(y) - : "%hi","%lo" - ); - return u.res; -} - -#elif defined(__aarch64__) - -// inline AArch64 implementations - -inline GGLfixed gglMulx(GGLfixed x, GGLfixed y, int shift) CONST; -inline GGLfixed gglMulx(GGLfixed x, GGLfixed y, int shift) -{ - GGLfixed result; - GGLfixed round; - - asm("mov %x[round], #1 \n" - "lsl %x[round], %x[round], %x[shift] \n" - "lsr %x[round], %x[round], #1 \n" - "smaddl %x[result], %w[x], %w[y],%x[round] \n" - "lsr %x[result], %x[result], %x[shift] \n" - : [round]"=&r"(round), [result]"=&r"(result) \ - : [x]"r"(x), [y]"r"(y), [shift] "r"(shift) \ - : - ); - return result; -} -inline GGLfixed gglMulAddx(GGLfixed x, GGLfixed y, GGLfixed a, int shift) CONST; -inline GGLfixed gglMulAddx(GGLfixed x, GGLfixed y, GGLfixed a, int shift) -{ - GGLfixed result; - asm("smull %x[result], %w[x], %w[y] \n" - "lsr %x[result], %x[result], %x[shift] \n" - "add %w[result], %w[result], %w[a] \n" - : [result]"=&r"(result) \ - : [x]"r"(x), [y]"r"(y), [a]"r"(a), [shift] "r"(shift) \ - : - ); - return result; -} - -inline GGLfixed gglMulSubx(GGLfixed x, GGLfixed y, GGLfixed a, int shift) CONST; -inline GGLfixed gglMulSubx(GGLfixed x, GGLfixed y, GGLfixed a, int shift) -{ - - GGLfixed result; - - asm("smull %x[result], %w[x], %w[y] \n" - "lsr %x[result], %x[result], %x[shift] \n" - "sub %w[result], %w[result], %w[a] \n" - : [result]"=&r"(result) \ - : [x]"r"(x), [y]"r"(y), [a]"r"(a), [shift] "r"(shift) \ - : - ); - return result; -} -inline int64_t gglMulii(int32_t x, int32_t y) CONST; -inline int64_t gglMulii(int32_t x, int32_t y) -{ - int64_t res; - asm("smull %x0, %w1, %w2 \n" - : "=r"(res) - : "%r"(x), "r"(y) - : - ); - return res; -} - -#elif defined(__mips__) && __mips_isa_rev == 6 - -/*inline MIPS implementations*/ -inline GGLfixed gglMulx(GGLfixed a, GGLfixed b, int shift) CONST; -inline GGLfixed gglMulx(GGLfixed a, GGLfixed b, int shift) { - GGLfixed result,tmp,tmp1,tmp2; - - if (__builtin_constant_p(shift)) { - if (shift == 0) { - asm ("mul %[res], %[a], %[b] \t\n" - : [res]"=&r"(result) - : [a]"r"(a),[b]"r"(b) - ); - } else if (shift == 32) - { - asm ("mul %[res], %[a], %[b] \t\n" - "li %[tmp],1\t\n" - "sll %[tmp],%[tmp],0x1f\t\n" - "addu %[tmp1],%[tmp],%[res] \t\n" - "muh %[res], %[a], %[b] \t\n" - "sltu %[tmp1],%[tmp1],%[tmp]\t\n" /*obit*/ - "sra %[tmp],%[tmp],0x1f \t\n" - "addu %[res],%[res],%[tmp]\t\n" - "addu %[res],%[res],%[tmp1]\t\n" - : [res]"=&r"(result),[tmp]"=&r"(tmp),[tmp1]"=&r"(tmp1) - : [a]"r"(a),[b]"r"(b),[shift]"I"(shift) - ); - } else if ((shift >0) && (shift < 32)) - { - asm ("mul %[res], %[a], %[b] \t\n" - "li %[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[shiftm1] \t\n" - "addu %[tmp1],%[tmp],%[res] \t\n" - "sltu %[tmp1],%[tmp1],%[tmp] \t\n" /*obit?*/ - "addu %[res],%[res],%[tmp] \t\n" - "muh %[tmp], %[a], %[b] \t\n" - "addu %[tmp],%[tmp],%[tmp1] \t\n" - "sll %[tmp],%[tmp],%[lshift] \t\n" - "srl %[res],%[res],%[rshift] \t\n" - "or %[res],%[res],%[tmp] \t\n" - : [res]"=&r"(result),[tmp]"=&r"(tmp),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[lshift]"I"(32-shift),[rshift]"I"(shift),[shiftm1]"I"(shift-1) - ); - } else { - asm ("mul %[res], %[a], %[b] \t\n" - "li %[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[shiftm1] \t\n" - "addu %[tmp1],%[tmp],%[res] \t\n" - "sltu %[tmp1],%[tmp1],%[tmp] \t\n" /*obit?*/ - "sra %[tmp2],%[tmp],0x1f \t\n" - "addu %[res],%[res],%[tmp] \t\n" - "muh %[tmp], %[a], %[b] \t\n" - "addu %[tmp],%[tmp],%[tmp2] \t\n" - "addu %[tmp],%[tmp],%[tmp1] \t\n" /*tmp=hi*/ - "srl %[tmp2],%[res],%[rshift] \t\n" - "srav %[res], %[tmp],%[rshift]\t\n" - "sll %[tmp],%[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[norbits] \t\n" - "or %[tmp],%[tmp],%[tmp2] \t\n" - "seleqz %[tmp],%[tmp],%[bit5] \t\n" - "selnez %[res],%[res],%[bit5] \t\n" - "or %[res],%[res],%[tmp] \t\n" - : [res]"=&r"(result),[tmp]"=&r"(tmp),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[norbits]"I"(~(shift)),[rshift]"I"(shift),[shiftm1] "I"(shift-1),[bit5]"I"(shift & 0x20) - ); - } - } else { - asm ("mul %[res], %[a], %[b] \t\n" - "li %[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[shiftm1] \t\n" - "addu %[tmp1],%[tmp],%[res] \t\n" - "sltu %[tmp1],%[tmp1],%[tmp] \t\n" /*obit?*/ - "sra %[tmp2],%[tmp],0x1f \t\n" - "addu %[res],%[res],%[tmp] \t\n" - "muh %[tmp], %[a], %[b] \t\n" - "addu %[tmp],%[tmp],%[tmp2] \t\n" - "addu %[tmp],%[tmp],%[tmp1] \t\n" /*tmp=hi*/ - "srl %[tmp2],%[res],%[rshift] \t\n" - "srav %[res], %[tmp],%[rshift]\t\n" - "sll %[tmp],%[tmp],1 \t\n" - "sll %[tmp],%[tmp],%[norbits] \t\n" - "or %[tmp],%[tmp],%[tmp2] \t\n" - "seleqz %[tmp],%[tmp],%[bit5] \t\n" - "selnez %[res],%[res],%[bit5] \t\n" - "or %[res],%[res],%[tmp] \t\n" - : [res]"=&r"(result),[tmp]"=&r"(tmp),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[norbits]"r"(~(shift)),[rshift] "r"(shift),[shiftm1]"r"(shift-1),[bit5] "r"(shift & 0x20) - ); - } - return result; -} - -inline GGLfixed gglMulAddx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) CONST; -inline GGLfixed gglMulAddx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) { - GGLfixed result,t,tmp1,tmp2; - - if (__builtin_constant_p(shift)) { - if (shift == 0) { - asm ("mul %[lo], %[a], %[b] \t\n" - "addu %[lo],%[lo],%[c] \t\n" - : [lo]"=&r"(result) - : [a]"r"(a),[b]"r"(b),[c]"r"(c) - ); - } else if (shift == 32) { - asm ("muh %[lo], %[a], %[b] \t\n" - "addu %[lo],%[lo],%[c] \t\n" - : [lo]"=&r"(result) - : [a]"r"(a),[b]"r"(b),[c]"r"(c) - ); - } else if ((shift>0) && (shift<32)) { - asm ("mul %[res], %[a], %[b] \t\n" - "muh %[t], %[a], %[b] \t\n" - "srl %[res],%[res],%[rshift] \t\n" - "sll %[t],%[t],%[lshift] \t\n" - "or %[res],%[res],%[t] \t\n" - "addu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[lshift]"I"(32-shift),[rshift]"I"(shift) - ); - } else { - asm ("mul %[res], %[a], %[b] \t\n" - "muh %[t], %[a], %[b] \t\n" - "nor %[tmp1],$zero,%[shift]\t\n" - "srl %[res],%[res],%[shift] \t\n" - "sll %[tmp2],%[t],1 \t\n" - "sllv %[tmp2],%[tmp2],%[tmp1] \t\n" - "or %[tmp1],%[tmp2],%[res] \t\n" - "srav %[res],%[t],%[shift] \t\n" - "andi %[tmp2],%[shift],0x20\t\n" - "seleqz %[tmp1],%[tmp1],%[tmp2]\t\n" - "selnez %[res],%[res],%[tmp2]\t\n" - "or %[res],%[res],%[tmp1]\t\n" - "addu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[shift]"I"(shift) - ); - } - } else { - asm ("mul %[res], %[a], %[b] \t\n" - "muh %[t], %[a], %[b] \t\n" - "nor %[tmp1],$zero,%[shift]\t\n" - "srl %[res],%[res],%[shift] \t\n" - "sll %[tmp2],%[t],1 \t\n" - "sllv %[tmp2],%[tmp2],%[tmp1] \t\n" - "or %[tmp1],%[tmp2],%[res] \t\n" - "srav %[res],%[t],%[shift] \t\n" - "andi %[tmp2],%[shift],0x20\t\n" - "seleqz %[tmp1],%[tmp1],%[tmp2]\t\n" - "selnez %[res],%[res],%[tmp2]\t\n" - "or %[res],%[res],%[tmp1]\t\n" - "addu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[shift]"r"(shift) - ); - } - return result; -} - -inline GGLfixed gglMulSubx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) CONST; -inline GGLfixed gglMulSubx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) { - GGLfixed result,t,tmp1,tmp2; - - if (__builtin_constant_p(shift)) { - if (shift == 0) { - asm ("mul %[lo], %[a], %[b] \t\n" - "subu %[lo],%[lo],%[c] \t\n" - : [lo]"=&r"(result) - : [a]"r"(a),[b]"r"(b),[c]"r"(c) - ); - } else if (shift == 32) { - asm ("muh %[lo], %[a], %[b] \t\n" - "subu %[lo],%[lo],%[c] \t\n" - : [lo]"=&r"(result) - : [a]"r"(a),[b]"r"(b),[c]"r"(c) - ); - } else if ((shift>0) && (shift<32)) { - asm ("mul %[res], %[a], %[b] \t\n" - "muh %[t], %[a], %[b] \t\n" - "srl %[res],%[res],%[rshift] \t\n" - "sll %[t],%[t],%[lshift] \t\n" - "or %[res],%[res],%[t] \t\n" - "subu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[lshift]"I"(32-shift),[rshift]"I"(shift) - ); - } else { - asm ("mul %[res], %[a], %[b] \t\n" - "muh %[t], %[a], %[b] \t\n" - "nor %[tmp1],$zero,%[shift]\t\n" - "srl %[res],%[res],%[shift] \t\n" - "sll %[tmp2],%[t],1 \t\n" - "sllv %[tmp2],%[tmp2],%[tmp1] \t\n" - "or %[tmp1],%[tmp2],%[res] \t\n" - "srav %[res],%[t],%[shift] \t\n" - "andi %[tmp2],%[shift],0x20\t\n" - "seleqz %[tmp1],%[tmp1],%[tmp2]\t\n" - "selnez %[res],%[res],%[tmp2]\t\n" - "or %[res],%[res],%[tmp1]\t\n" - "subu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[shift]"I"(shift) - ); - } - } else { - asm ("mul %[res], %[a], %[b] \t\n" - "muh %[t], %[a], %[b] \t\n" - "nor %[tmp1],$zero,%[shift]\t\n" - "srl %[res],%[res],%[shift] \t\n" - "sll %[tmp2],%[t],1 \t\n" - "sllv %[tmp2],%[tmp2],%[tmp1] \t\n" - "or %[tmp1],%[tmp2],%[res] \t\n" - "srav %[res],%[t],%[shift] \t\n" - "andi %[tmp2],%[shift],0x20\t\n" - "seleqz %[tmp1],%[tmp1],%[tmp2]\t\n" - "selnez %[res],%[res],%[tmp2]\t\n" - "or %[res],%[res],%[tmp1]\t\n" - "subu %[res],%[res],%[c] \t\n" - : [res]"=&r"(result),[t]"=&r"(t),[tmp1]"=&r"(tmp1),[tmp2]"=&r"(tmp2) - : [a]"r"(a),[b]"r"(b),[c]"r"(c),[shift]"r"(shift) - ); - } - return result; -} - -inline int64_t gglMulii(int32_t x, int32_t y) CONST; -inline int64_t gglMulii(int32_t x, int32_t y) { - union { - struct { -#if defined(__MIPSEL__) - int32_t lo; - int32_t hi; -#elif defined(__MIPSEB__) - int32_t hi; - int32_t lo; -#endif - } s; - int64_t res; - }u; - asm("mul %0, %2, %3 \t\n" - "muh %1, %2, %3 \t\n" - : "=r"(u.s.lo), "=&r"(u.s.hi) - : "%r"(x), "r"(y) - ); - return u.res; -} - -#else // ---------------------------------------------------------------------- - -inline GGLfixed gglMulx(GGLfixed a, GGLfixed b, int shift) CONST; -inline GGLfixed gglMulx(GGLfixed a, GGLfixed b, int shift) { - return GGLfixed((int64_t(a)*b + (1<<(shift-1)))>>shift); -} -inline GGLfixed gglMulAddx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) CONST; -inline GGLfixed gglMulAddx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) { - return GGLfixed((int64_t(a)*b)>>shift) + c; -} -inline GGLfixed gglMulSubx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) CONST; -inline GGLfixed gglMulSubx(GGLfixed a, GGLfixed b, GGLfixed c, int shift) { - return GGLfixed((int64_t(a)*b)>>shift) - c; -} -inline int64_t gglMulii(int32_t a, int32_t b) CONST; -inline int64_t gglMulii(int32_t a, int32_t b) { - return int64_t(a)*b; -} - -#endif - -// ------------------------------------------------------------------------ - -inline GGLfixed gglMulx(GGLfixed a, GGLfixed b) CONST; -inline GGLfixed gglMulx(GGLfixed a, GGLfixed b) { - return gglMulx(a, b, 16); -} -inline GGLfixed gglMulAddx(GGLfixed a, GGLfixed b, GGLfixed c) CONST; -inline GGLfixed gglMulAddx(GGLfixed a, GGLfixed b, GGLfixed c) { - return gglMulAddx(a, b, c, 16); -} -inline GGLfixed gglMulSubx(GGLfixed a, GGLfixed b, GGLfixed c) CONST; -inline GGLfixed gglMulSubx(GGLfixed a, GGLfixed b, GGLfixed c) { - return gglMulSubx(a, b, c, 16); -} - -// ------------------------------------------------------------------------ - -inline int32_t gglClz(int32_t x) CONST; -inline int32_t gglClz(int32_t x) -{ -#if (defined(__arm__) && !defined(__thumb__)) || defined(__mips__) || defined(__aarch64__) - return __builtin_clz(x); -#else - if (!x) return 32; - int32_t exp = 31; - if (x & 0xFFFF0000) { exp -=16; x >>= 16; } - if (x & 0x0000ff00) { exp -= 8; x >>= 8; } - if (x & 0x000000f0) { exp -= 4; x >>= 4; } - if (x & 0x0000000c) { exp -= 2; x >>= 2; } - if (x & 0x00000002) { exp -= 1; } - return exp; -#endif -} - -// ------------------------------------------------------------------------ - -int32_t gglDivQ(GGLfixed n, GGLfixed d, int32_t i) CONST; - -inline int32_t gglDivQ16(GGLfixed n, GGLfixed d) CONST; -inline int32_t gglDivQ16(GGLfixed n, GGLfixed d) { - return gglDivQ(n, d, 16); -} - -inline int32_t gglDivx(GGLfixed n, GGLfixed d) CONST; -inline int32_t gglDivx(GGLfixed n, GGLfixed d) { - return gglDivQ(n, d, 16); -} - -// ------------------------------------------------------------------------ - -inline GGLfixed gglRecipFast(GGLfixed x) CONST; -inline GGLfixed gglRecipFast(GGLfixed x) -{ - // This is a really bad approximation of 1/x, but it's also - // very fast. x must be strictly positive. - // if x between [0.5, 1[ , then 1/x = 3-2*x - // (we use 2.30 fixed-point) - const int32_t lz = gglClz(x); - return (0xC0000000 - (x << (lz - 1))) >> (30-lz); -} - -// ------------------------------------------------------------------------ - -inline GGLfixed gglClampx(GGLfixed c) CONST; -inline GGLfixed gglClampx(GGLfixed c) -{ -#if defined(__thumb__) - // clamp without branches - c &= ~(c>>31); c = FIXED_ONE - c; - c &= ~(c>>31); c = FIXED_ONE - c; -#else -#if defined(__arm__) - // I don't know why gcc thinks its smarter than me! The code below - // clamps to zero in one instruction, but gcc won't generate it and - // replace it by a cmp + movlt (it's quite amazing actually). - asm("bic %0, %1, %1, asr #31\n" : "=r"(c) : "r"(c)); -#elif defined(__aarch64__) - asm("bic %w0, %w1, %w1, asr #31\n" : "=r"(c) : "r"(c)); -#else - c &= ~(c>>31); -#endif - if (c>FIXED_ONE) - c = FIXED_ONE; -#endif - return c; -} - -// ------------------------------------------------------------------------ - -#endif // ANDROID_GGL_FIXED_H diff --git a/libpixelflinger/picker.cpp b/libpixelflinger/picker.cpp deleted file mode 100644 index aa55229a0..000000000 --- a/libpixelflinger/picker.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* libs/pixelflinger/picker.cpp -** -** Copyright 2006, 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 "buffer.h" -#include "scanline.h" -#include "picker.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -void ggl_init_picker(context_t* /*c*/) -{ -} - -void ggl_pick(context_t* c) -{ - if (ggl_likely(!c->dirty)) - return; - - // compute needs, see if they changed... - const uint32_t enables = c->state.enables; - needs_t new_needs(c->state.needs); - - if (c->dirty & GGL_CB_STATE) { - new_needs.n &= ~GGL_NEEDS_CB_FORMAT_MASK; - new_needs.n |= GGL_BUILD_NEEDS(c->state.buffers.color.format, CB_FORMAT); - if (enables & GGL_ENABLE_BLENDING) - c->dirty |= GGL_PIXEL_PIPELINE_STATE; - } - - if (c->dirty & GGL_PIXEL_PIPELINE_STATE) { - uint32_t n = GGL_BUILD_NEEDS(c->state.buffers.color.format, CB_FORMAT); - uint32_t p = 0; - if (enables & GGL_ENABLE_BLENDING) { - uint32_t src = c->state.blend.src; - uint32_t dst = c->state.blend.dst; - uint32_t src_alpha = c->state.blend.src_alpha; - uint32_t dst_alpha = c->state.blend.dst_alpha; - const GGLFormat& cbf = c->formats[ c->state.buffers.color.format ]; - if (!cbf.c[GGLFormat::ALPHA].h) { - if ((src == GGL_ONE_MINUS_DST_ALPHA) || - (src == GGL_DST_ALPHA)) { - src = GGL_ONE; - } - if ((src_alpha == GGL_ONE_MINUS_DST_ALPHA) || - (src_alpha == GGL_DST_ALPHA)) { - src_alpha = GGL_ONE; - } - if ((dst == GGL_ONE_MINUS_DST_ALPHA) || - (dst == GGL_DST_ALPHA)) { - dst = GGL_ONE; - } - if ((dst_alpha == GGL_ONE_MINUS_DST_ALPHA) || - (dst_alpha == GGL_DST_ALPHA)) { - dst_alpha = GGL_ONE; - } - } - - src = ggl_blendfactor_to_needs(src); - dst = ggl_blendfactor_to_needs(dst); - src_alpha = ggl_blendfactor_to_needs(src_alpha); - dst_alpha = ggl_blendfactor_to_needs(dst_alpha); - - n |= GGL_BUILD_NEEDS( src, BLEND_SRC ); - n |= GGL_BUILD_NEEDS( dst, BLEND_DST ); - if (c->state.blend.alpha_separate) { - n |= GGL_BUILD_NEEDS( src_alpha, BLEND_SRCA ); - n |= GGL_BUILD_NEEDS( dst_alpha, BLEND_DSTA ); - } else { - n |= GGL_BUILD_NEEDS( src, BLEND_SRCA ); - n |= GGL_BUILD_NEEDS( dst, BLEND_DSTA ); - } - } else { - n |= GGL_BUILD_NEEDS( GGL_ONE, BLEND_SRC ); - n |= GGL_BUILD_NEEDS( GGL_ZERO, BLEND_DST ); - n |= GGL_BUILD_NEEDS( GGL_ONE, BLEND_SRCA ); - n |= GGL_BUILD_NEEDS( GGL_ZERO, BLEND_DSTA ); - } - - - n |= GGL_BUILD_NEEDS(c->state.mask.color^0xF, MASK_ARGB); - n |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_SMOOTH) ?1:0, SHADE); - if (enables & GGL_ENABLE_TMUS) { - n |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_W) ?1:0, W); - } - p |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_DITHER) ?1:0, P_DITHER); - p |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_AA) ?1:0, P_AA); - p |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_FOG) ?1:0, P_FOG); - - if (enables & GGL_ENABLE_LOGIC_OP) { - n |= GGL_BUILD_NEEDS(c->state.logic_op.opcode, LOGIC_OP); - } else { - n |= GGL_BUILD_NEEDS(GGL_COPY, LOGIC_OP); - } - - if (enables & GGL_ENABLE_ALPHA_TEST) { - p |= GGL_BUILD_NEEDS(c->state.alpha_test.func, P_ALPHA_TEST); - } else { - p |= GGL_BUILD_NEEDS(GGL_ALWAYS, P_ALPHA_TEST); - } - - if (enables & GGL_ENABLE_DEPTH_TEST) { - p |= GGL_BUILD_NEEDS(c->state.depth_test.func, P_DEPTH_TEST); - p |= GGL_BUILD_NEEDS(c->state.mask.depth&1, P_MASK_Z); - } else { - p |= GGL_BUILD_NEEDS(GGL_ALWAYS, P_DEPTH_TEST); - // writing to the z-buffer is always disabled if depth-test - // is disabled. - } - new_needs.n = n; - new_needs.p = p; - } - - if (c->dirty & GGL_TMU_STATE) { - int idx = 0; - for (int i=0 ; istate.texture[i]; - if (tx.enable) { - uint32_t t = 0; - t |= GGL_BUILD_NEEDS(tx.surface.format, T_FORMAT); - t |= GGL_BUILD_NEEDS(ggl_env_to_needs(tx.env), T_ENV); - t |= GGL_BUILD_NEEDS(0, T_POT); // XXX: not used yet - if (tx.s_coord==GGL_ONE_TO_ONE && tx.t_coord==GGL_ONE_TO_ONE) { - // we encode 1-to-1 into the wrap mode - t |= GGL_BUILD_NEEDS(GGL_NEEDS_WRAP_11, T_S_WRAP); - t |= GGL_BUILD_NEEDS(GGL_NEEDS_WRAP_11, T_T_WRAP); - } else { - t |= GGL_BUILD_NEEDS(ggl_wrap_to_needs(tx.s_wrap), T_S_WRAP); - t |= GGL_BUILD_NEEDS(ggl_wrap_to_needs(tx.t_wrap), T_T_WRAP); - } - if (tx.mag_filter == GGL_LINEAR) { - t |= GGL_BUILD_NEEDS(1, T_LINEAR); - } - if (tx.min_filter == GGL_LINEAR) { - t |= GGL_BUILD_NEEDS(1, T_LINEAR); - } - new_needs.t[idx++] = t; - } else { - new_needs.t[i] = 0; - } - } - } - - if (new_needs != c->state.needs) { - c->state.needs = new_needs; - ggl_pick_texture(c); - ggl_pick_cb(c); - ggl_pick_scanline(c); - } - c->dirty = 0; -} - -// ---------------------------------------------------------------------------- -}; // namespace android - diff --git a/libpixelflinger/picker.h b/libpixelflinger/picker.h deleted file mode 100644 index 9cdbc3c12..000000000 --- a/libpixelflinger/picker.h +++ /dev/null @@ -1,31 +0,0 @@ -/* libs/pixelflinger/picker.h -** -** Copyright 2006, 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_PICKER_H -#define ANDROID_PICKER_H - -#include - -namespace android { - -void ggl_init_picker(context_t* c); -void ggl_pick(context_t* c); - -}; // namespace android - -#endif diff --git a/libpixelflinger/pixelflinger.cpp b/libpixelflinger/pixelflinger.cpp deleted file mode 100644 index fd449b2eb..000000000 --- a/libpixelflinger/pixelflinger.cpp +++ /dev/null @@ -1,836 +0,0 @@ -/* libs/pixelflinger/pixelflinger.cpp -** -** Copyright 2006, 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 - -#include -#include - -#include "buffer.h" -#include "clear.h" -#include "picker.h" -#include "raster.h" -#include "scanline.h" -#include "trap.h" - -#include "codeflinger/GGLAssembler.h" -#include "codeflinger/CodeCache.h" - -#include - - -namespace android { - -// ---------------------------------------------------------------------------- - -// 8x8 Bayer dither matrix -static const uint8_t gDitherMatrix[GGL_DITHER_SIZE] = { - 0, 32, 8, 40, 2, 34, 10, 42, - 48, 16, 56, 24, 50, 18, 58, 26, - 12, 44, 4, 36, 14, 46, 6, 38, - 60, 28, 52, 20, 62, 30, 54, 22, - 3, 35, 11, 43, 1, 33, 9, 41, - 51, 19, 59, 27, 49, 17, 57, 25, - 15, 47, 7, 39, 13, 45, 5, 37, - 63, 31, 55, 23, 61, 29, 53, 21 -}; - -static void ggl_init_procs(context_t* c); -static void ggl_set_scissor(context_t* c); - -static void ggl_enable_blending(context_t* c, int enable); -static void ggl_enable_scissor_test(context_t* c, int enable); -static void ggl_enable_alpha_test(context_t* c, int enable); -static void ggl_enable_logic_op(context_t* c, int enable); -static void ggl_enable_dither(context_t* c, int enable); -static void ggl_enable_stencil_test(context_t* c, int enable); -static void ggl_enable_depth_test(context_t* c, int enable); -static void ggl_enable_aa(context_t* c, int enable); -static void ggl_enable_point_aa_nice(context_t* c, int enable); -static void ggl_enable_texture2d(context_t* c, int enable); -static void ggl_enable_w_lerp(context_t* c, int enable); -static void ggl_enable_fog(context_t* c, int enable); - -static inline int min(int a, int b) CONST; -static inline int min(int a, int b) { - return a < b ? a : b; -} - -static inline int max(int a, int b) CONST; -static inline int max(int a, int b) { - return a < b ? b : a; -} - -// ---------------------------------------------------------------------------- - -void ggl_error(context_t* c, GGLenum error) -{ - if (c->error == GGL_NO_ERROR) - c->error = error; -} - -// ---------------------------------------------------------------------------- - -static void ggl_bindTexture(void* con, const GGLSurface* surface) -{ - GGL_CONTEXT(c, con); - if (surface->format != c->activeTMU->surface.format) - ggl_state_changed(c, GGL_TMU_STATE); - ggl_set_surface(c, &(c->activeTMU->surface), surface); -} - - -static void ggl_bindTextureLod(void* con, GGLuint tmu,const GGLSurface* surface) -{ - GGL_CONTEXT(c, con); - // All LODs must have the same format - ggl_set_surface(c, &c->state.texture[tmu].surface, surface); -} - -static void ggl_colorBuffer(void* con, const GGLSurface* surface) -{ - GGL_CONTEXT(c, con); - if (surface->format != c->state.buffers.color.format) - ggl_state_changed(c, GGL_CB_STATE); - - if (surface->width > c->state.buffers.coverageBufferSize) { - // allocate the coverage factor buffer - free(c->state.buffers.coverage); - c->state.buffers.coverage = (int16_t*)malloc(surface->width * 2); - c->state.buffers.coverageBufferSize = - c->state.buffers.coverage ? surface->width : 0; - } - ggl_set_surface(c, &(c->state.buffers.color), surface); - if (c->state.buffers.read.format == 0) { - ggl_set_surface(c, &(c->state.buffers.read), surface); - } - ggl_set_scissor(c); -} - -static void ggl_readBuffer(void* con, const GGLSurface* surface) -{ - GGL_CONTEXT(c, con); - ggl_set_surface(c, &(c->state.buffers.read), surface); -} - -static void ggl_depthBuffer(void* con, const GGLSurface* surface) -{ - GGL_CONTEXT(c, con); - if (surface->format == GGL_PIXEL_FORMAT_Z_16) { - ggl_set_surface(c, &(c->state.buffers.depth), surface); - } else { - c->state.buffers.depth.format = GGL_PIXEL_FORMAT_NONE; - ggl_enable_depth_test(c, 0); - } -} - -static void ggl_scissor(void* con, GGLint x, GGLint y, - GGLsizei width, GGLsizei height) -{ - GGL_CONTEXT(c, con); - c->state.scissor.user_left = x; - c->state.scissor.user_top = y; - c->state.scissor.user_right = x + width; - c->state.scissor.user_bottom = y + height; - ggl_set_scissor(c); -} - -// ---------------------------------------------------------------------------- - -static void enable_disable(context_t* c, GGLenum name, int en) -{ - switch (name) { - case GGL_BLEND: ggl_enable_blending(c, en); break; - case GGL_SCISSOR_TEST: ggl_enable_scissor_test(c, en); break; - case GGL_ALPHA_TEST: ggl_enable_alpha_test(c, en); break; - case GGL_COLOR_LOGIC_OP: ggl_enable_logic_op(c, en); break; - case GGL_DITHER: ggl_enable_dither(c, en); break; - case GGL_STENCIL_TEST: ggl_enable_stencil_test(c, en); break; - case GGL_DEPTH_TEST: ggl_enable_depth_test(c, en); break; - case GGL_AA: ggl_enable_aa(c, en); break; - case GGL_TEXTURE_2D: ggl_enable_texture2d(c, en); break; - case GGL_W_LERP: ggl_enable_w_lerp(c, en); break; - case GGL_FOG: ggl_enable_fog(c, en); break; - case GGL_POINT_SMOOTH_NICE: ggl_enable_point_aa_nice(c, en); break; - } -} - -static void ggl_enable(void* con, GGLenum name) -{ - GGL_CONTEXT(c, con); - enable_disable(c, name, 1); -} - -static void ggl_disable(void* con, GGLenum name) -{ - GGL_CONTEXT(c, con); - enable_disable(c, name, 0); -} - -static void ggl_enableDisable(void* con, GGLenum name, GGLboolean en) -{ - GGL_CONTEXT(c, con); - enable_disable(c, name, en ? 1 : 0); -} - -// ---------------------------------------------------------------------------- - -static void ggl_shadeModel(void* con, GGLenum mode) -{ - GGL_CONTEXT(c, con); - switch (mode) { - case GGL_FLAT: - if (c->state.enables & GGL_ENABLE_SMOOTH) { - c->state.enables &= ~GGL_ENABLE_SMOOTH; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } - break; - case GGL_SMOOTH: - if (!(c->state.enables & GGL_ENABLE_SMOOTH)) { - c->state.enables |= GGL_ENABLE_SMOOTH; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } - break; - default: - ggl_error(c, GGL_INVALID_ENUM); - } -} - -static void ggl_color4xv(void* con, const GGLclampx* color) -{ - GGL_CONTEXT(c, con); - c->shade.r0 = gglFixedToIteratedColor(color[0]); - c->shade.g0 = gglFixedToIteratedColor(color[1]); - c->shade.b0 = gglFixedToIteratedColor(color[2]); - c->shade.a0 = gglFixedToIteratedColor(color[3]); -} - -static void ggl_colorGrad12xv(void* con, const GGLcolor* grad) -{ - GGL_CONTEXT(c, con); - // it is very important to round the iterated value here because - // the rasterizer doesn't clamp them, therefore the iterated value - //must absolutely be correct. - // GGLColor is encoded as 8.16 value - const int32_t round = 0x8000; - c->shade.r0 = grad[ 0] + round; - c->shade.drdx = grad[ 1]; - c->shade.drdy = grad[ 2]; - c->shade.g0 = grad[ 3] + round; - c->shade.dgdx = grad[ 4]; - c->shade.dgdy = grad[ 5]; - c->shade.b0 = grad[ 6] + round; - c->shade.dbdx = grad[ 7]; - c->shade.dbdy = grad[ 8]; - c->shade.a0 = grad[ 9] + round; - c->shade.dadx = grad[10]; - c->shade.dady = grad[11]; -} - -static void ggl_zGrad3xv(void* con, const GGLfixed32* grad) -{ - GGL_CONTEXT(c, con); - // z iterators are encoded as 0.32 fixed point and the z-buffer - // holds 16 bits, the rounding value is 0x8000. - const uint32_t round = 0x8000; - c->shade.z0 = grad[0] + round; - c->shade.dzdx = grad[1]; - c->shade.dzdy = grad[2]; -} - -static void ggl_wGrad3xv(void* con, const GGLfixed* grad) -{ - GGL_CONTEXT(c, con); - c->shade.w0 = grad[0]; - c->shade.dwdx = grad[1]; - c->shade.dwdy = grad[2]; -} - -// ---------------------------------------------------------------------------- - -static void ggl_fogGrad3xv(void* con, const GGLfixed* grad) -{ - GGL_CONTEXT(c, con); - c->shade.f0 = grad[0]; - c->shade.dfdx = grad[1]; - c->shade.dfdy = grad[2]; -} - -static void ggl_fogColor3xv(void* con, const GGLclampx* color) -{ - GGL_CONTEXT(c, con); - const int32_t r = gglClampx(color[0]); - const int32_t g = gglClampx(color[1]); - const int32_t b = gglClampx(color[2]); - c->state.fog.color[GGLFormat::ALPHA]= 0xFF; // unused - c->state.fog.color[GGLFormat::RED] = (r - (r>>8))>>8; - c->state.fog.color[GGLFormat::GREEN]= (g - (g>>8))>>8; - c->state.fog.color[GGLFormat::BLUE] = (b - (b>>8))>>8; -} - -static void ggl_enable_fog(context_t* c, int enable) -{ - const int e = (c->state.enables & GGL_ENABLE_FOG)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_FOG; - else c->state.enables &= ~GGL_ENABLE_FOG; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -// ---------------------------------------------------------------------------- - -static void ggl_blendFunc(void* con, GGLenum src, GGLenum dst) -{ - GGL_CONTEXT(c, con); - c->state.blend.src = src; - c->state.blend.src_alpha = src; - c->state.blend.dst = dst; - c->state.blend.dst_alpha = dst; - c->state.blend.alpha_separate = 0; - if (c->state.enables & GGL_ENABLE_BLENDING) { - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -static void ggl_blendFuncSeparate(void* con, - GGLenum src, GGLenum dst, - GGLenum srcAlpha, GGLenum dstAplha) -{ - GGL_CONTEXT(c, con); - c->state.blend.src = src; - c->state.blend.src_alpha = srcAlpha; - c->state.blend.dst = dst; - c->state.blend.dst_alpha = dstAplha; - c->state.blend.alpha_separate = 1; - if (c->state.enables & GGL_ENABLE_BLENDING) { - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -// ---------------------------------------------------------------------------- - -static void ggl_texEnvi(void* con, GGLenum target, - GGLenum pname, - GGLint param) -{ - GGL_CONTEXT(c, con); - if (target != GGL_TEXTURE_ENV || pname != GGL_TEXTURE_ENV_MODE) { - ggl_error(c, GGL_INVALID_ENUM); - return; - } - switch (param) { - case GGL_REPLACE: - case GGL_MODULATE: - case GGL_DECAL: - case GGL_BLEND: - case GGL_ADD: - if (c->activeTMU->env != param) { - c->activeTMU->env = param; - ggl_state_changed(c, GGL_TMU_STATE); - } - break; - default: - ggl_error(c, GGL_INVALID_ENUM); - } -} - -static void ggl_texEnvxv(void* con, GGLenum target, - GGLenum pname, const GGLfixed* params) -{ - GGL_CONTEXT(c, con); - if (target != GGL_TEXTURE_ENV) { - ggl_error(c, GGL_INVALID_ENUM); - return; - } - switch (pname) { - case GGL_TEXTURE_ENV_MODE: - ggl_texEnvi(con, target, pname, params[0]); - break; - case GGL_TEXTURE_ENV_COLOR: { - uint8_t* const color = c->activeTMU->env_color; - const GGLclampx r = gglClampx(params[0]); - const GGLclampx g = gglClampx(params[1]); - const GGLclampx b = gglClampx(params[2]); - const GGLclampx a = gglClampx(params[3]); - color[0] = (a-(a>>8))>>8; - color[1] = (r-(r>>8))>>8; - color[2] = (g-(g>>8))>>8; - color[3] = (b-(b>>8))>>8; - break; - } - default: - ggl_error(c, GGL_INVALID_ENUM); - return; - } -} - - -static void ggl_texParameteri(void* con, - GGLenum target, - GGLenum pname, - GGLint param) -{ - GGL_CONTEXT(c, con); - if (target != GGL_TEXTURE_2D) { - ggl_error(c, GGL_INVALID_ENUM); - return; - } - - if (param == GGL_CLAMP_TO_EDGE) - param = GGL_CLAMP; - - uint16_t* what = 0; - switch (pname) { - case GGL_TEXTURE_WRAP_S: - if ((param == GGL_CLAMP) || - (param == GGL_REPEAT)) { - what = &c->activeTMU->s_wrap; - } - break; - case GGL_TEXTURE_WRAP_T: - if ((param == GGL_CLAMP) || - (param == GGL_REPEAT)) { - what = &c->activeTMU->t_wrap; - } - break; - case GGL_TEXTURE_MIN_FILTER: - if ((param == GGL_NEAREST) || - (param == GGL_NEAREST_MIPMAP_NEAREST) || - (param == GGL_NEAREST_MIPMAP_LINEAR)) { - what = &c->activeTMU->min_filter; - param = GGL_NEAREST; - } - if ((param == GGL_LINEAR) || - (param == GGL_LINEAR_MIPMAP_NEAREST) || - (param == GGL_LINEAR_MIPMAP_LINEAR)) { - what = &c->activeTMU->min_filter; - param = GGL_LINEAR; - } - break; - case GGL_TEXTURE_MAG_FILTER: - if ((param == GGL_NEAREST) || - (param == GGL_LINEAR)) { - what = &c->activeTMU->mag_filter; - } - break; - } - - if (!what) { - ggl_error(c, GGL_INVALID_ENUM); - return; - } - - if (*what != param) { - *what = param; - ggl_state_changed(c, GGL_TMU_STATE); - } -} - -static void ggl_texCoordGradScale8xv(void* con, GGLint tmu, const int32_t* grad) -{ - GGL_CONTEXT(c, con); - texture_t& u = c->state.texture[tmu]; - u.shade.is0 = grad[0]; - u.shade.idsdx = grad[1]; - u.shade.idsdy = grad[2]; - u.shade.it0 = grad[3]; - u.shade.idtdx = grad[4]; - u.shade.idtdy = grad[5]; - u.shade.sscale= grad[6]; - u.shade.tscale= grad[7]; -} - -static void ggl_texCoord2x(void* con, GGLfixed s, GGLfixed t) -{ - GGL_CONTEXT(c, con); - c->activeTMU->shade.is0 = s; - c->activeTMU->shade.it0 = t; - c->activeTMU->shade.sscale= 0; - c->activeTMU->shade.tscale= 0; -} - -static void ggl_texCoord2i(void* con, GGLint s, GGLint t) -{ - ggl_texCoord2x(con, s<<16, t<<16); -} - -static void ggl_texGeni(void* con, GGLenum coord, GGLenum pname, GGLint param) -{ - GGL_CONTEXT(c, con); - if (pname != GGL_TEXTURE_GEN_MODE) { - ggl_error(c, GGL_INVALID_ENUM); - return; - } - - uint32_t* coord_ptr = 0; - if (coord == GGL_S) coord_ptr = &(c->activeTMU->s_coord); - else if (coord == GGL_T) coord_ptr = &(c->activeTMU->t_coord); - - if (coord_ptr) { - if (*coord_ptr != uint32_t(param)) { - *coord_ptr = uint32_t(param); - ggl_state_changed(c, GGL_TMU_STATE); - } - } else { - ggl_error(c, GGL_INVALID_ENUM); - } -} - -static void ggl_activeTexture(void* con, GGLuint tmu) -{ - GGL_CONTEXT(c, con); - if (tmu >= GGLuint(GGL_TEXTURE_UNIT_COUNT)) { - ggl_error(c, GGL_INVALID_ENUM); - return; - } - c->activeTMUIndex = tmu; - c->activeTMU = &(c->state.texture[tmu]); -} - -// ---------------------------------------------------------------------------- - -static void ggl_colorMask(void* con, GGLboolean r, - GGLboolean g, - GGLboolean b, - GGLboolean a) -{ - GGL_CONTEXT(c, con); - int mask = 0; - if (a) mask |= 1 << GGLFormat::ALPHA; - if (r) mask |= 1 << GGLFormat::RED; - if (g) mask |= 1 << GGLFormat::GREEN; - if (b) mask |= 1 << GGLFormat::BLUE; - if (c->state.mask.color != mask) { - c->state.mask.color = mask; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -static void ggl_depthMask(void* con, GGLboolean flag) -{ - GGL_CONTEXT(c, con); - if (c->state.mask.depth != flag?1:0) { - c->state.mask.depth = flag?1:0; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -static void ggl_stencilMask(void* con, GGLuint mask) -{ - GGL_CONTEXT(c, con); - if (c->state.mask.stencil != mask) { - c->state.mask.stencil = mask; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -// ---------------------------------------------------------------------------- - -static void ggl_alphaFuncx(void* con, GGLenum func, GGLclampx ref) -{ - GGL_CONTEXT(c, con); - if ((func < GGL_NEVER) || (func > GGL_ALWAYS)) { - ggl_error(c, GGL_INVALID_ENUM); - return; - } - c->state.alpha_test.ref = gglFixedToIteratedColor(gglClampx(ref)); - if (c->state.alpha_test.func != func) { - c->state.alpha_test.func = func; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -// ---------------------------------------------------------------------------- - -static void ggl_depthFunc(void* con, GGLenum func) -{ - GGL_CONTEXT(c, con); - if ((func < GGL_NEVER) || (func > GGL_ALWAYS)) { - ggl_error(c, GGL_INVALID_ENUM); - return; - } - if (c->state.depth_test.func != func) { - c->state.depth_test.func = func; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -// ---------------------------------------------------------------------------- - -static void ggl_logicOp(void* con, GGLenum opcode) -{ - GGL_CONTEXT(c, con); - if ((opcode < GGL_CLEAR) || (opcode > GGL_SET)) { - ggl_error(c, GGL_INVALID_ENUM); - return; - } - if (c->state.logic_op.opcode != opcode) { - c->state.logic_op.opcode = opcode; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - - -// ---------------------------------------------------------------------------- - -void ggl_set_scissor(context_t* c) -{ - if (c->state.enables & GGL_ENABLE_SCISSOR_TEST) { - const int32_t l = c->state.scissor.user_left; - const int32_t t = c->state.scissor.user_top; - const int32_t r = c->state.scissor.user_right; - const int32_t b = c->state.scissor.user_bottom; - c->state.scissor.left = max(0, l); - c->state.scissor.right = min(c->state.buffers.color.width, r); - c->state.scissor.top = max(0, t); - c->state.scissor.bottom = min(c->state.buffers.color.height, b); - } else { - c->state.scissor.left = 0; - c->state.scissor.top = 0; - c->state.scissor.right = c->state.buffers.color.width; - c->state.scissor.bottom = c->state.buffers.color.height; - } -} - -void ggl_enable_blending(context_t* c, int enable) -{ - const int e = (c->state.enables & GGL_ENABLE_BLENDING)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_BLENDING; - else c->state.enables &= ~GGL_ENABLE_BLENDING; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -void ggl_enable_scissor_test(context_t* c, int enable) -{ - const int e = (c->state.enables & GGL_ENABLE_SCISSOR_TEST)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_SCISSOR_TEST; - else c->state.enables &= ~GGL_ENABLE_SCISSOR_TEST; - ggl_set_scissor(c); - } -} - -void ggl_enable_alpha_test(context_t* c, int enable) -{ - const int e = (c->state.enables & GGL_ENABLE_ALPHA_TEST)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_ALPHA_TEST; - else c->state.enables &= ~GGL_ENABLE_ALPHA_TEST; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -void ggl_enable_logic_op(context_t* c, int enable) -{ - const int e = (c->state.enables & GGL_ENABLE_LOGIC_OP)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_LOGIC_OP; - else c->state.enables &= ~GGL_ENABLE_LOGIC_OP; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -void ggl_enable_dither(context_t* c, int enable) -{ - const int e = (c->state.enables & GGL_ENABLE_DITHER)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_DITHER; - else c->state.enables &= ~GGL_ENABLE_DITHER; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -void ggl_enable_stencil_test(context_t* /*c*/, int /*enable*/) -{ -} - -void ggl_enable_depth_test(context_t* c, int enable) -{ - if (c->state.buffers.depth.format == 0) - enable = 0; - const int e = (c->state.enables & GGL_ENABLE_DEPTH_TEST)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_DEPTH_TEST; - else c->state.enables &= ~GGL_ENABLE_DEPTH_TEST; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -void ggl_enable_aa(context_t* c, int enable) -{ - const int e = (c->state.enables & GGL_ENABLE_AA)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_AA; - else c->state.enables &= ~GGL_ENABLE_AA; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -void ggl_enable_point_aa_nice(context_t* c, int enable) -{ - const int e = (c->state.enables & GGL_ENABLE_POINT_AA_NICE)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_POINT_AA_NICE; - else c->state.enables &= ~GGL_ENABLE_POINT_AA_NICE; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -void ggl_enable_w_lerp(context_t* c, int enable) -{ - const int e = (c->state.enables & GGL_ENABLE_W)?1:0; - if (e != enable) { - if (enable) c->state.enables |= GGL_ENABLE_W; - else c->state.enables &= ~GGL_ENABLE_W; - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE); - } -} - -void ggl_enable_texture2d(context_t* c, int enable) -{ - if (c->activeTMU->enable != enable) { - const uint32_t tmu = c->activeTMUIndex; - c->activeTMU->enable = enable; - const uint32_t mask = 1UL << tmu; - if (enable) c->state.enabled_tmu |= mask; - else c->state.enabled_tmu &= ~mask; - if (c->state.enabled_tmu) c->state.enables |= GGL_ENABLE_TMUS; - else c->state.enables &= ~GGL_ENABLE_TMUS; - ggl_state_changed(c, GGL_TMU_STATE); - } -} - - -// ---------------------------------------------------------------------------- - -int64_t ggl_system_time() -{ - struct timespec t; - t.tv_sec = t.tv_nsec = 0; - clock_gettime(CLOCK_THREAD_CPUTIME_ID, &t); - return int64_t(t.tv_sec)*1000000000LL + t.tv_nsec; -} - -// ---------------------------------------------------------------------------- - -void ggl_init_procs(context_t* c) -{ - GGLContext& procs = *(GGLContext*)c; - GGL_INIT_PROC(procs, scissor); - GGL_INIT_PROC(procs, activeTexture); - GGL_INIT_PROC(procs, bindTexture); - GGL_INIT_PROC(procs, bindTextureLod); - GGL_INIT_PROC(procs, colorBuffer); - GGL_INIT_PROC(procs, readBuffer); - GGL_INIT_PROC(procs, depthBuffer); - GGL_INIT_PROC(procs, enable); - GGL_INIT_PROC(procs, disable); - GGL_INIT_PROC(procs, enableDisable); - GGL_INIT_PROC(procs, shadeModel); - GGL_INIT_PROC(procs, color4xv); - GGL_INIT_PROC(procs, colorGrad12xv); - GGL_INIT_PROC(procs, zGrad3xv); - GGL_INIT_PROC(procs, wGrad3xv); - GGL_INIT_PROC(procs, fogGrad3xv); - GGL_INIT_PROC(procs, fogColor3xv); - GGL_INIT_PROC(procs, blendFunc); - GGL_INIT_PROC(procs, blendFuncSeparate); - GGL_INIT_PROC(procs, texEnvi); - GGL_INIT_PROC(procs, texEnvxv); - GGL_INIT_PROC(procs, texParameteri); - GGL_INIT_PROC(procs, texCoord2i); - GGL_INIT_PROC(procs, texCoord2x); - GGL_INIT_PROC(procs, texCoordGradScale8xv); - GGL_INIT_PROC(procs, texGeni); - GGL_INIT_PROC(procs, colorMask); - GGL_INIT_PROC(procs, depthMask); - GGL_INIT_PROC(procs, stencilMask); - GGL_INIT_PROC(procs, alphaFuncx); - GGL_INIT_PROC(procs, depthFunc); - GGL_INIT_PROC(procs, logicOp); - ggl_init_clear(c); -} - -void ggl_init_context(context_t* c) -{ - memset(c, 0, sizeof(context_t)); - ggl_init_procs(c); - ggl_init_trap(c); - ggl_init_scanline(c); - ggl_init_texture(c); - ggl_init_picker(c); - ggl_init_raster(c); - c->formats = gglGetPixelFormatTable(); - c->state.blend.src = GGL_ONE; - c->state.blend.dst = GGL_ZERO; - c->state.blend.src_alpha = GGL_ONE; - c->state.blend.dst_alpha = GGL_ZERO; - c->state.mask.color = 0xF; - c->state.mask.depth = 0; - c->state.mask.stencil = 0xFFFFFFFF; - c->state.logic_op.opcode = GGL_COPY; - c->state.alpha_test.func = GGL_ALWAYS; - c->state.depth_test.func = GGL_LESS; - c->state.depth_test.clearValue = FIXED_ONE; - c->shade.w0 = FIXED_ONE; - memcpy(c->ditherMatrix, gDitherMatrix, sizeof(gDitherMatrix)); -} - -void ggl_uninit_context(context_t* c) -{ - ggl_uninit_scanline(c); -} - -// ---------------------------------------------------------------------------- -}; // namespace android -// ---------------------------------------------------------------------------- - - - -using namespace android; - -ssize_t gglInit(GGLContext** context) -{ - void* const base = malloc(sizeof(context_t) + 32); - if (base) { - // always align the context on cache lines - context_t *c = (context_t *)((ptrdiff_t(base)+31) & ~0x1FL); - ggl_init_context(c); - c->base = base; - *context = (GGLContext*)c; - } else { - return -1; - } - return 0; -} - -ssize_t gglUninit(GGLContext* con) -{ - GGL_CONTEXT(c, (void*)con); - ggl_uninit_context(c); - free(c->base); - return 0; -} - diff --git a/libpixelflinger/raster.cpp b/libpixelflinger/raster.cpp deleted file mode 100644 index e95c2c8ab..000000000 --- a/libpixelflinger/raster.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* libs/pixelflinger/raster.cpp -** -** Copyright 2006, 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 "raster.h" -#include "trap.h" - -namespace android { - -static void ggl_rasterPos2x(void* con, GGLfixed x, GGLfixed y); -static void ggl_rasterPos2i(void* con, GGLint x, GGLint y); -static void ggl_copyPixels(void* con, GGLint xs, GGLint ys, - GGLsizei width, GGLsizei height, GGLenum type); - -void ggl_init_raster(context_t* c) -{ - GGLContext& procs = *(GGLContext*)c; - GGL_INIT_PROC(procs, copyPixels); - GGL_INIT_PROC(procs, rasterPos2x); - GGL_INIT_PROC(procs, rasterPos2i); -} - -void ggl_rasterPos2x(void* con, GGLfixed x, GGLfixed y) -{ - GGL_CONTEXT(c, con); - // raster pos should be processed just like glVertex - c->state.raster.x = x; - c->state.raster.y = y; -} - -void ggl_rasterPos2i(void* con, GGLint x, GGLint y) -{ - ggl_rasterPos2x(con, gglIntToFixed(x), gglIntToFixed(y)); -} - -void ggl_copyPixels(void* con, GGLint xs, GGLint ys, - GGLsizei width, GGLsizei height, GGLenum /*type*/) -{ - GGL_CONTEXT(c, con); - - // color-buffer - surface_t* cb = &(c->state.buffers.color); - - // undefined behaviour if we try to copy from outside the surface - if (uint32_t(xs) > cb->width) - return; - if (uint32_t(ys) > cb->height) - return; - if (uint32_t(xs + width) > cb->width) - return; - if (uint32_t(ys + height) > cb->height) - return; - - // copy to current raster position - GGLint xd = gglFixedToIntRound(c->state.raster.x); - GGLint yd = gglFixedToIntRound(c->state.raster.y); - - // clip to scissor - if (xd < GGLint(c->state.scissor.left)) { - GGLint offset = GGLint(c->state.scissor.left) - xd; - xd = GGLint(c->state.scissor.left); - xs += offset; - width -= offset; - } - if (yd < GGLint(c->state.scissor.top)) { - GGLint offset = GGLint(c->state.scissor.top) - yd; - yd = GGLint(c->state.scissor.top); - ys += offset; - height -= offset; - } - if ((xd + width) > GGLint(c->state.scissor.right)) { - width = GGLint(c->state.scissor.right) - xd; - } - if ((yd + height) > GGLint(c->state.scissor.bottom)) { - height = GGLint(c->state.scissor.bottom) - yd; - } - - if (width<=0 || height<=0) { - return; // nothing to copy - } - - if (xs==xd && ys==yd) { - // nothing to do, but be careful, this might not be true when we support - // gglPixelTransfer, gglPixelMap and gglPixelZoom - return; - } - - const GGLFormat* fp = &(c->formats[cb->format]); - uint8_t* src = reinterpret_cast(cb->data) - + (xs + (cb->stride * ys)) * fp->size; - uint8_t* dst = reinterpret_cast(cb->data) - + (xd + (cb->stride * yd)) * fp->size; - const size_t bpr = cb->stride * fp->size; - const size_t rowsize = width * fp->size; - size_t yc = height; - - if (ys < yd) { - // bottom to top - src += height * bpr; - dst += height * bpr; - do { - dst -= bpr; - src -= bpr; - memcpy(dst, src, rowsize); - } while (--yc); - } else { - if (ys == yd) { - // might be right to left - do { - memmove(dst, src, rowsize); - dst += bpr; - src += bpr; - } while (--yc); - } else { - // top to bottom - do { - memcpy(dst, src, rowsize); - dst += bpr; - src += bpr; - } while (--yc); - } - } -} - -}; // namespace android - -using namespace android; - -GGLint gglBitBlit(GGLContext* con, int tmu, GGLint crop[4], GGLint where[4]) -{ - GGL_CONTEXT(c, (void*)con); - - GGLint x = where[0]; - GGLint y = where[1]; - GGLint w = where[2]; - GGLint h = where[3]; - - // exclsively enable this tmu - c->procs.activeTexture(c, tmu); - c->procs.disable(c, GGL_W_LERP); - - uint32_t tmus = 1UL<state.enabled_tmu != tmus) { - c->activeTMU->enable = 1; - c->state.enabled_tmu = tmus; - c->state.enables |= GGL_ENABLE_TMUS; - ggl_state_changed(c, GGL_TMU_STATE); - } - - const GGLint Wcr = crop[2]; - const GGLint Hcr = crop[3]; - if ((w == Wcr) && (h == Hcr)) { - c->procs.texGeni(c, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); - c->procs.texGeni(c, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); - const GGLint Ucr = crop[0]; - const GGLint Vcr = crop[1]; - const GGLint s0 = Ucr - x; - const GGLint t0 = Vcr - y; - c->procs.texCoord2i(c, s0, t0); - c->procs.recti(c, x, y, x+w, y+h); - } else { - int32_t texcoords[8]; - x = gglIntToFixed(x); - y = gglIntToFixed(y); - - // we CLAMP here, which works with premultiplied (s,t) - c->procs.texParameteri(c, GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_S, GGL_CLAMP); - c->procs.texParameteri(c, GGL_TEXTURE_2D, GGL_TEXTURE_WRAP_T, GGL_CLAMP); - c->procs.texGeni(c, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_AUTOMATIC); - c->procs.texGeni(c, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_AUTOMATIC); - - const GGLint Ucr = crop[0] << 16; - const GGLint Vcr = crop[1] << 16; - const GGLint Wcr = crop[2] << 16; - const GGLint Hcr = crop[3] << 16; - - // computes texture coordinates (pre-multiplied) - int32_t dsdx = Wcr / w; // dsdx = ((Wcr/w)/Wt)*Wt - int32_t dtdy = Hcr / h; // dtdy = ((Hcr/h)/Ht)*Ht - int32_t s0 = Ucr - gglMulx(dsdx, x); // s0 = Ucr - x * dsdx - int32_t t0 = Vcr - gglMulx(dtdy, y); // t0 = Vcr - y * dtdy - texcoords[0] = s0; - texcoords[1] = dsdx; - texcoords[2] = 0; - texcoords[3] = t0; - texcoords[4] = 0; - texcoords[5] = dtdy; - texcoords[6] = 0; - texcoords[7] = 0; - c->procs.texCoordGradScale8xv(c, tmu, texcoords); - c->procs.recti(c, - gglFixedToIntRound(x), - gglFixedToIntRound(y), - gglFixedToIntRound(x)+w, - gglFixedToIntRound(y)+h); - } - return 0; -} - diff --git a/libpixelflinger/raster.h b/libpixelflinger/raster.h deleted file mode 100644 index 9f0f240aa..000000000 --- a/libpixelflinger/raster.h +++ /dev/null @@ -1,33 +0,0 @@ -/* libs/pixelflinger/raster.h -** -** Copyright 2006, 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_GGL_RASTER_H -#define ANDROID_GGL_RASTER_H - -#include - -namespace android { - -void ggl_init_raster(context_t* c); - -void gglCopyPixels(void* c, GGLint x, GGLint y, GGLsizei width, GGLsizei height, GGLenum type); -void gglRasterPos2d(void* c, GGLint x, GGLint y); - -}; // namespace android - -#endif // ANDROID_GGL_RASTER_H diff --git a/libpixelflinger/scanline.cpp b/libpixelflinger/scanline.cpp deleted file mode 100644 index 4cc23c773..000000000 --- a/libpixelflinger/scanline.cpp +++ /dev/null @@ -1,2373 +0,0 @@ -/* libs/pixelflinger/scanline.cpp -** -** Copyright 2006-2011, 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 "pixelflinger" - -#include -#include -#include -#include - -#include -#include - -#include "buffer.h" -#include "scanline.h" - -#include "codeflinger/CodeCache.h" -#include "codeflinger/GGLAssembler.h" -#if defined(__arm__) -#include "codeflinger/ARMAssembler.h" -#elif defined(__aarch64__) -#include "codeflinger/Arm64Assembler.h" -#elif defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6 -#include "codeflinger/MIPSAssembler.h" -#elif defined(__mips__) && defined(__LP64__) -#include "codeflinger/MIPS64Assembler.h" -#endif -//#include "codeflinger/ARMAssemblerOptimizer.h" - -// ---------------------------------------------------------------------------- - -#define ANDROID_CODEGEN_GENERIC 0 // force generic pixel pipeline -#define ANDROID_CODEGEN_C 1 // hand-written C, fallback generic -#define ANDROID_CODEGEN_ASM 2 // hand-written asm, fallback generic -#define ANDROID_CODEGEN_GENERATED 3 // hand-written asm, fallback codegen - -#ifdef NDEBUG -# define ANDROID_RELEASE -# define ANDROID_CODEGEN ANDROID_CODEGEN_GENERATED -#else -# define ANDROID_DEBUG -# define ANDROID_CODEGEN ANDROID_CODEGEN_GENERATED -#endif - -#if defined(__arm__) || (defined(__mips__) && ((!defined(__LP64__) && __mips_isa_rev < 6) || defined(__LP64__))) || defined(__aarch64__) -# define ANDROID_ARM_CODEGEN 1 -#else -# define ANDROID_ARM_CODEGEN 0 -#endif - -#define DEBUG__CODEGEN_ONLY 0 - -/* Set to 1 to dump to the log the states that need a new - * code-generated scanline callback, i.e. those that don't - * have a corresponding shortcut function. - */ -#define DEBUG_NEEDS 0 - -#if defined( __mips__) && ((!defined(__LP64__) && __mips_isa_rev < 6) || defined(__LP64__)) -#define ASSEMBLY_SCRATCH_SIZE 4096 -#elif defined(__aarch64__) -#define ASSEMBLY_SCRATCH_SIZE 8192 -#else -#define ASSEMBLY_SCRATCH_SIZE 2048 -#endif - -// ---------------------------------------------------------------------------- -namespace android { -// ---------------------------------------------------------------------------- - -static void init_y(context_t*, int32_t); -static void init_y_noop(context_t*, int32_t); -static void init_y_packed(context_t*, int32_t); -static void init_y_error(context_t*, int32_t); - -static void step_y__generic(context_t* c); -static void step_y__nop(context_t*); -static void step_y__smooth(context_t* c); -static void step_y__tmu(context_t* c); -static void step_y__w(context_t* c); - -static void scanline(context_t* c); -static void scanline_perspective(context_t* c); -static void scanline_perspective_single(context_t* c); -static void scanline_t32cb16blend(context_t* c); -static void scanline_t32cb16blend_dither(context_t* c); -static void scanline_t32cb16blend_srca(context_t* c); -static void scanline_t32cb16blend_clamp(context_t* c); -static void scanline_t32cb16blend_clamp_dither(context_t* c); -static void scanline_t32cb16blend_clamp_mod(context_t* c); -static void scanline_x32cb16blend_clamp_mod(context_t* c); -static void scanline_t32cb16blend_clamp_mod_dither(context_t* c); -static void scanline_x32cb16blend_clamp_mod_dither(context_t* c); -static void scanline_t32cb16(context_t* c); -static void scanline_t32cb16_dither(context_t* c); -static void scanline_t32cb16_clamp(context_t* c); -static void scanline_t32cb16_clamp_dither(context_t* c); -static void scanline_col32cb16blend(context_t* c); -static void scanline_t16cb16_clamp(context_t* c); -static void scanline_t16cb16blend_clamp_mod(context_t* c); -static void scanline_memcpy(context_t* c); -static void scanline_memset8(context_t* c); -static void scanline_memset16(context_t* c); -static void scanline_memset32(context_t* c); -static void scanline_noop(context_t* c); -static void scanline_set(context_t* c); -static void scanline_clear(context_t* c); - -static void rect_generic(context_t* c, size_t yc); -static void rect_memcpy(context_t* c, size_t yc); - -#if defined( __arm__) -extern "C" void scanline_t32cb16blend_arm(uint16_t*, uint32_t*, size_t); -extern "C" void scanline_t32cb16_arm(uint16_t *dst, uint32_t *src, size_t ct); -extern "C" void scanline_col32cb16blend_neon(uint16_t *dst, uint32_t *col, size_t ct); -extern "C" void scanline_col32cb16blend_arm(uint16_t *dst, uint32_t col, size_t ct); -#elif defined(__aarch64__) -extern "C" void scanline_t32cb16blend_arm64(uint16_t*, uint32_t*, size_t); -extern "C" void scanline_col32cb16blend_arm64(uint16_t *dst, uint32_t col, size_t ct); -#elif defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6 -extern "C" void scanline_t32cb16blend_mips(uint16_t*, uint32_t*, size_t); -#elif defined(__mips__) && defined(__LP64__) -extern "C" void scanline_t32cb16blend_mips64(uint16_t*, uint32_t*, size_t); -extern "C" void scanline_col32cb16blend_mips64(uint16_t *dst, uint32_t col, size_t ct); -#endif - -// ---------------------------------------------------------------------------- - -static inline uint16_t convertAbgr8888ToRgb565(uint32_t pix) -{ - return uint16_t( ((pix << 8) & 0xf800) | - ((pix >> 5) & 0x07e0) | - ((pix >> 19) & 0x001f) ); -} - -struct shortcut_t { - needs_filter_t filter; - const char* desc; - void (*scanline)(context_t*); - void (*init_y)(context_t*, int32_t); -}; - -// Keep in sync with needs - -/* To understand the values here, have a look at: - * system/core/include/private/pixelflinger/ggl_context.h - * - * Especially the lines defining and using GGL_RESERVE_NEEDS - * - * Quick reminders: - * - the last nibble of the first value is the destination buffer format. - * - the last nibble of the third value is the source texture format - * - formats: 4=rgb565 1=abgr8888 2=xbgr8888 - * - * In the descriptions below: - * - * SRC means we copy the source pixels to the destination - * - * SRC_OVER means we blend the source pixels to the destination - * with dstFactor = 1-srcA, srcFactor=1 (premultiplied source). - * This mode is otherwise called 'blend'. - * - * SRCA_OVER means we blend the source pixels to the destination - * with dstFactor=srcA*(1-srcA) srcFactor=srcA (non-premul source). - * This mode is otherwise called 'blend_srca' - * - * clamp means we fetch source pixels from a texture with u/v clamping - * - * mod means the source pixels are modulated (multiplied) by the - * a/r/g/b of the current context's color. Typically used for - * fade-in / fade-out. - * - * dither means we dither 32 bit values to 16 bits - */ -static shortcut_t shortcuts[] = { - { { { 0x03515104, 0x00000077, { 0x00000A01, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, blend SRC_OVER", scanline_t32cb16blend, init_y_noop }, - { { { 0x03010104, 0x00000077, { 0x00000A01, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, SRC", scanline_t32cb16, init_y_noop }, - /* same as first entry, but with dithering */ - { { { 0x03515104, 0x00000177, { 0x00000A01, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, blend SRC_OVER dither", scanline_t32cb16blend_dither, init_y_noop }, - /* same as second entry, but with dithering */ - { { { 0x03010104, 0x00000177, { 0x00000A01, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, SRC dither", scanline_t32cb16_dither, init_y_noop }, - /* this is used during the boot animation - CHEAT: ignore dithering */ - { { { 0x03545404, 0x00000077, { 0x00000A01, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFEFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, blend dst:ONE_MINUS_SRCA src:SRCA", scanline_t32cb16blend_srca, init_y_noop }, - /* special case for arbitrary texture coordinates (think scaling) */ - { { { 0x03515104, 0x00000077, { 0x00000001, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, SRC_OVER clamp", scanline_t32cb16blend_clamp, init_y }, - { { { 0x03515104, 0x00000177, { 0x00000001, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, SRC_OVER clamp dither", scanline_t32cb16blend_clamp_dither, init_y }, - /* another case used during emulation */ - { { { 0x03515104, 0x00000077, { 0x00001001, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, SRC_OVER clamp modulate", scanline_t32cb16blend_clamp_mod, init_y }, - /* and this */ - { { { 0x03515104, 0x00000077, { 0x00001002, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, x888 tx, SRC_OVER clamp modulate", scanline_x32cb16blend_clamp_mod, init_y }, - { { { 0x03515104, 0x00000177, { 0x00001001, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, SRC_OVER clamp modulate dither", scanline_t32cb16blend_clamp_mod_dither, init_y }, - { { { 0x03515104, 0x00000177, { 0x00001002, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, x888 tx, SRC_OVER clamp modulate dither", scanline_x32cb16blend_clamp_mod_dither, init_y }, - { { { 0x03010104, 0x00000077, { 0x00000001, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, SRC clamp", scanline_t32cb16_clamp, init_y }, - { { { 0x03010104, 0x00000077, { 0x00000002, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, x888 tx, SRC clamp", scanline_t32cb16_clamp, init_y }, - { { { 0x03010104, 0x00000177, { 0x00000001, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 8888 tx, SRC clamp dither", scanline_t32cb16_clamp_dither, init_y }, - { { { 0x03010104, 0x00000177, { 0x00000002, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, x888 tx, SRC clamp dither", scanline_t32cb16_clamp_dither, init_y }, - { { { 0x03010104, 0x00000077, { 0x00000004, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 565 tx, SRC clamp", scanline_t16cb16_clamp, init_y }, - { { { 0x03515104, 0x00000077, { 0x00001004, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, - "565 fb, 565 tx, SRC_OVER clamp", scanline_t16cb16blend_clamp_mod, init_y }, - { { { 0x03515104, 0x00000077, { 0x00000000, 0x00000000 } }, - { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0xFFFFFFFF } } }, - "565 fb, 8888 fixed color", scanline_col32cb16blend, init_y_packed }, - { { { 0x00000000, 0x00000000, { 0x00000000, 0x00000000 } }, - { 0x00000000, 0x00000007, { 0x00000000, 0x00000000 } } }, - "(nop) alpha test", scanline_noop, init_y_noop }, - { { { 0x00000000, 0x00000000, { 0x00000000, 0x00000000 } }, - { 0x00000000, 0x00000070, { 0x00000000, 0x00000000 } } }, - "(nop) depth test", scanline_noop, init_y_noop }, - { { { 0x05000000, 0x00000000, { 0x00000000, 0x00000000 } }, - { 0x0F000000, 0x00000080, { 0x00000000, 0x00000000 } } }, - "(nop) logic_op", scanline_noop, init_y_noop }, - { { { 0xF0000000, 0x00000000, { 0x00000000, 0x00000000 } }, - { 0xF0000000, 0x00000080, { 0x00000000, 0x00000000 } } }, - "(nop) color mask", scanline_noop, init_y_noop }, - { { { 0x0F000000, 0x00000077, { 0x00000000, 0x00000000 } }, - { 0xFF000000, 0x000000F7, { 0x00000000, 0x00000000 } } }, - "(set) logic_op", scanline_set, init_y_noop }, - { { { 0x00000000, 0x00000077, { 0x00000000, 0x00000000 } }, - { 0xFF000000, 0x000000F7, { 0x00000000, 0x00000000 } } }, - "(clear) logic_op", scanline_clear, init_y_noop }, - { { { 0x03000000, 0x00000077, { 0x00000000, 0x00000000 } }, - { 0xFFFFFF00, 0x000000F7, { 0x00000000, 0x00000000 } } }, - "(clear) blending 0/0", scanline_clear, init_y_noop }, - { { { 0x00000000, 0x00000000, { 0x00000000, 0x00000000 } }, - { 0x0000003F, 0x00000000, { 0x00000000, 0x00000000 } } }, - "(error) invalid color-buffer format", scanline_noop, init_y_error }, -}; -static const needs_filter_t noblend1to1 = { - // (disregard dithering, see below) - { 0x03010100, 0x00000077, { 0x00000A00, 0x00000000 } }, - { 0xFFFFFFC0, 0xFFFFFEFF, { 0xFFFFFFC0, 0x0000003F } } -}; -static const needs_filter_t fill16noblend = { - { 0x03010100, 0x00000077, { 0x00000000, 0x00000000 } }, - { 0xFFFFFFC0, 0xFFFFFFFF, { 0x0000003F, 0x0000003F } } -}; - -// ---------------------------------------------------------------------------- - -#if ANDROID_ARM_CODEGEN - -#if defined(__mips__) && ((!defined(__LP64__) && __mips_isa_rev < 6) || defined(__LP64__)) -static CodeCache gCodeCache(32 * 1024); -#elif defined(__aarch64__) -static CodeCache gCodeCache(48 * 1024); -#else -static CodeCache gCodeCache(12 * 1024); -#endif - -class ScanlineAssembly : public Assembly { - AssemblyKey mKey; -public: - ScanlineAssembly(needs_t needs, size_t size) - : Assembly(size), mKey(needs) { } - const AssemblyKey& key() const { return mKey; } -}; -#endif - -// ---------------------------------------------------------------------------- - -void ggl_init_scanline(context_t* c) -{ - c->init_y = init_y; - c->step_y = step_y__generic; - c->scanline = scanline; -} - -void ggl_uninit_scanline(context_t* c) -{ - if (c->state.buffers.coverage) - free(c->state.buffers.coverage); -#if ANDROID_ARM_CODEGEN - if (c->scanline_as) - c->scanline_as->decStrong(c); -#endif -} - -// ---------------------------------------------------------------------------- - -static void pick_scanline(context_t* c) -{ -#if (!defined(DEBUG__CODEGEN_ONLY) || (DEBUG__CODEGEN_ONLY == 0)) - -#if ANDROID_CODEGEN == ANDROID_CODEGEN_GENERIC - c->init_y = init_y; - c->step_y = step_y__generic; - c->scanline = scanline; - return; -#endif - - //printf("*** needs [%08lx:%08lx:%08lx:%08lx]\n", - // c->state.needs.n, c->state.needs.p, - // c->state.needs.t[0], c->state.needs.t[1]); - - // first handle the special case that we cannot test with a filter - const uint32_t cb_format = GGL_READ_NEEDS(CB_FORMAT, c->state.needs.n); - if (GGL_READ_NEEDS(T_FORMAT, c->state.needs.t[0]) == cb_format) { - if (c->state.needs.match(noblend1to1)) { - // this will match regardless of dithering state, since both - // src and dest have the same format anyway, there is no dithering - // to be done. - const GGLFormat* f = - &(c->formats[GGL_READ_NEEDS(T_FORMAT, c->state.needs.t[0])]); - if ((f->components == GGL_RGB) || - (f->components == GGL_RGBA) || - (f->components == GGL_LUMINANCE) || - (f->components == GGL_LUMINANCE_ALPHA)) - { - // format must have all of RGB components - // (so the current color doesn't show through) - c->scanline = scanline_memcpy; - c->init_y = init_y_noop; - return; - } - } - } - - if (c->state.needs.match(fill16noblend)) { - c->init_y = init_y_packed; - switch (c->formats[cb_format].size) { - case 1: c->scanline = scanline_memset8; return; - case 2: c->scanline = scanline_memset16; return; - case 4: c->scanline = scanline_memset32; return; - } - } - - const int numFilters = sizeof(shortcuts)/sizeof(shortcut_t); - for (int i=0 ; istate.needs.match(shortcuts[i].filter)) { - c->scanline = shortcuts[i].scanline; - c->init_y = shortcuts[i].init_y; - return; - } - } - -#if DEBUG_NEEDS - ALOGI("Needs: n=0x%08x p=0x%08x t0=0x%08x t1=0x%08x", - c->state.needs.n, c->state.needs.p, - c->state.needs.t[0], c->state.needs.t[1]); -#endif - -#endif // DEBUG__CODEGEN_ONLY - - c->init_y = init_y; - c->step_y = step_y__generic; - -#if ANDROID_ARM_CODEGEN - // we're going to have to generate some code... - // here, generate code for our pixel pipeline - const AssemblyKey key(c->state.needs); - sp assembly = gCodeCache.lookup(key); - if (assembly == 0) { - // create a new assembly region - sp a = new ScanlineAssembly(c->state.needs, - ASSEMBLY_SCRATCH_SIZE); - // initialize our assembler -#if defined(__arm__) - GGLAssembler assembler( new ARMAssembler(a) ); - //GGLAssembler assembler( - // new ARMAssemblerOptimizer(new ARMAssembler(a)) ); -#endif -#if defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6 - GGLAssembler assembler( new ArmToMipsAssembler(a) ); -#elif defined(__mips__) && defined(__LP64__) - GGLAssembler assembler( new ArmToMips64Assembler(a) ); -#elif defined(__aarch64__) - GGLAssembler assembler( new ArmToArm64Assembler(a) ); -#endif - // generate the scanline code for the given needs - bool err = assembler.scanline(c->state.needs, c) != 0; - if (ggl_likely(!err)) { - // finally, cache this assembly - err = gCodeCache.cache(a->key(), a) < 0; - } - if (ggl_unlikely(err)) { - ALOGE("error generating or caching assembly. Reverting to NOP."); - c->scanline = scanline_noop; - c->init_y = init_y_noop; - c->step_y = step_y__nop; - return; - } - assembly = a; - } - - // release the previous assembly - if (c->scanline_as) { - c->scanline_as->decStrong(c); - } - - //ALOGI("using generated pixel-pipeline"); - c->scanline_as = assembly.get(); - c->scanline_as->incStrong(c); // hold on to assembly - c->scanline = (void(*)(context_t* c))assembly->base(); -#else -// ALOGW("using generic (slow) pixel-pipeline"); - c->scanline = scanline; -#endif -} - -void ggl_pick_scanline(context_t* c) -{ - pick_scanline(c); - if ((c->state.enables & GGL_ENABLE_W) && - (c->state.enables & GGL_ENABLE_TMUS)) - { - c->span = c->scanline; - c->scanline = scanline_perspective; - if (!(c->state.enabled_tmu & (c->state.enabled_tmu - 1))) { - // only one TMU enabled - c->scanline = scanline_perspective_single; - } - } -} - -// ---------------------------------------------------------------------------- - -static void blending(context_t* c, pixel_t* fragment, pixel_t* fb); -static void blend_factor(context_t* c, pixel_t* r, uint32_t factor, - const pixel_t* src, const pixel_t* dst); -static void rescale(uint32_t& u, uint8_t& su, uint32_t& v, uint8_t& sv); - -#if ANDROID_ARM_CODEGEN && (ANDROID_CODEGEN == ANDROID_CODEGEN_GENERATED) - -// no need to compile the generic-pipeline, it can't be reached -void scanline(context_t*) -{ -} - -#else - -void rescale(uint32_t& u, uint8_t& su, uint32_t& v, uint8_t& sv) -{ - if (su && sv) { - if (su > sv) { - v = ggl_expand(v, sv, su); - sv = su; - } else if (su < sv) { - u = ggl_expand(u, su, sv); - su = sv; - } - } -} - -void blending(context_t* c, pixel_t* fragment, pixel_t* fb) -{ - rescale(fragment->c[0], fragment->s[0], fb->c[0], fb->s[0]); - rescale(fragment->c[1], fragment->s[1], fb->c[1], fb->s[1]); - rescale(fragment->c[2], fragment->s[2], fb->c[2], fb->s[2]); - rescale(fragment->c[3], fragment->s[3], fb->c[3], fb->s[3]); - - pixel_t sf, df; - blend_factor(c, &sf, c->state.blend.src, fragment, fb); - blend_factor(c, &df, c->state.blend.dst, fragment, fb); - - fragment->c[1] = - gglMulAddx(fragment->c[1], sf.c[1], gglMulx(fb->c[1], df.c[1])); - fragment->c[2] = - gglMulAddx(fragment->c[2], sf.c[2], gglMulx(fb->c[2], df.c[2])); - fragment->c[3] = - gglMulAddx(fragment->c[3], sf.c[3], gglMulx(fb->c[3], df.c[3])); - - if (c->state.blend.alpha_separate) { - blend_factor(c, &sf, c->state.blend.src_alpha, fragment, fb); - blend_factor(c, &df, c->state.blend.dst_alpha, fragment, fb); - } - - fragment->c[0] = - gglMulAddx(fragment->c[0], sf.c[0], gglMulx(fb->c[0], df.c[0])); - - // clamp to 1.0 - if (fragment->c[0] >= (1LU<s[0])) - fragment->c[0] = (1<s[0])-1; - if (fragment->c[1] >= (1LU<s[1])) - fragment->c[1] = (1<s[1])-1; - if (fragment->c[2] >= (1LU<s[2])) - fragment->c[2] = (1<s[2])-1; - if (fragment->c[3] >= (1LU<s[3])) - fragment->c[3] = (1<s[3])-1; -} - -static inline int blendfactor(uint32_t x, uint32_t size, uint32_t def = 0) -{ - if (!size) - return def; - - // scale to 16 bits - if (size > 16) { - x >>= (size - 16); - } else if (size < 16) { - x = ggl_expand(x, size, 16); - } - x += x >> 15; - return x; -} - -void blend_factor(context_t* /*c*/, pixel_t* r, - uint32_t factor, const pixel_t* src, const pixel_t* dst) -{ - switch (factor) { - case GGL_ZERO: - r->c[1] = - r->c[2] = - r->c[3] = - r->c[0] = 0; - break; - case GGL_ONE: - r->c[1] = - r->c[2] = - r->c[3] = - r->c[0] = FIXED_ONE; - break; - case GGL_DST_COLOR: - r->c[1] = blendfactor(dst->c[1], dst->s[1]); - r->c[2] = blendfactor(dst->c[2], dst->s[2]); - r->c[3] = blendfactor(dst->c[3], dst->s[3]); - r->c[0] = blendfactor(dst->c[0], dst->s[0]); - break; - case GGL_SRC_COLOR: - r->c[1] = blendfactor(src->c[1], src->s[1]); - r->c[2] = blendfactor(src->c[2], src->s[2]); - r->c[3] = blendfactor(src->c[3], src->s[3]); - r->c[0] = blendfactor(src->c[0], src->s[0]); - break; - case GGL_ONE_MINUS_DST_COLOR: - r->c[1] = FIXED_ONE - blendfactor(dst->c[1], dst->s[1]); - r->c[2] = FIXED_ONE - blendfactor(dst->c[2], dst->s[2]); - r->c[3] = FIXED_ONE - blendfactor(dst->c[3], dst->s[3]); - r->c[0] = FIXED_ONE - blendfactor(dst->c[0], dst->s[0]); - break; - case GGL_ONE_MINUS_SRC_COLOR: - r->c[1] = FIXED_ONE - blendfactor(src->c[1], src->s[1]); - r->c[2] = FIXED_ONE - blendfactor(src->c[2], src->s[2]); - r->c[3] = FIXED_ONE - blendfactor(src->c[3], src->s[3]); - r->c[0] = FIXED_ONE - blendfactor(src->c[0], src->s[0]); - break; - case GGL_SRC_ALPHA: - r->c[1] = - r->c[2] = - r->c[3] = - r->c[0] = blendfactor(src->c[0], src->s[0], FIXED_ONE); - break; - case GGL_ONE_MINUS_SRC_ALPHA: - r->c[1] = - r->c[2] = - r->c[3] = - r->c[0] = FIXED_ONE - blendfactor(src->c[0], src->s[0], FIXED_ONE); - break; - case GGL_DST_ALPHA: - r->c[1] = - r->c[2] = - r->c[3] = - r->c[0] = blendfactor(dst->c[0], dst->s[0], FIXED_ONE); - break; - case GGL_ONE_MINUS_DST_ALPHA: - r->c[1] = - r->c[2] = - r->c[3] = - r->c[0] = FIXED_ONE - blendfactor(dst->c[0], dst->s[0], FIXED_ONE); - break; - case GGL_SRC_ALPHA_SATURATE: - // XXX: GGL_SRC_ALPHA_SATURATE - break; - } -} - -static GGLfixed wrapping(int32_t coord, uint32_t size, int tx_wrap) -{ - GGLfixed d; - if (tx_wrap == GGL_REPEAT) { - d = (uint32_t(coord)>>16) * size; - } else if (tx_wrap == GGL_CLAMP) { // CLAMP_TO_EDGE semantics - const GGLfixed clamp_min = FIXED_HALF; - const GGLfixed clamp_max = (size << 16) - FIXED_HALF; - if (coord < clamp_min) coord = clamp_min; - if (coord > clamp_max) coord = clamp_max; - d = coord; - } else { // 1:1 - const GGLfixed clamp_min = 0; - const GGLfixed clamp_max = (size << 16); - if (coord < clamp_min) coord = clamp_min; - if (coord > clamp_max) coord = clamp_max; - d = coord; - } - return d; -} - -static inline -GGLcolor ADJUST_COLOR_ITERATOR(GGLcolor v, GGLcolor dvdx, int len) -{ - const int32_t end = dvdx * (len-1) + v; - if (end < 0) - v -= end; - v &= ~(v>>31); - return v; -} - -void scanline(context_t* c) -{ - const uint32_t enables = c->state.enables; - const int xs = c->iterators.xl; - const int x1 = c->iterators.xr; - int xc = x1 - xs; - const int16_t* covPtr = c->state.buffers.coverage + xs; - - // All iterated values are sampled at the pixel center - - // reset iterators for that scanline... - GGLcolor r, g, b, a; - iterators_t& ci = c->iterators; - if (enables & GGL_ENABLE_SMOOTH) { - r = (xs * c->shade.drdx) + ci.ydrdy; - g = (xs * c->shade.dgdx) + ci.ydgdy; - b = (xs * c->shade.dbdx) + ci.ydbdy; - a = (xs * c->shade.dadx) + ci.ydady; - r = ADJUST_COLOR_ITERATOR(r, c->shade.drdx, xc); - g = ADJUST_COLOR_ITERATOR(g, c->shade.dgdx, xc); - b = ADJUST_COLOR_ITERATOR(b, c->shade.dbdx, xc); - a = ADJUST_COLOR_ITERATOR(a, c->shade.dadx, xc); - } else { - r = ci.ydrdy; - g = ci.ydgdy; - b = ci.ydbdy; - a = ci.ydady; - } - - // z iterators are 1.31 - GGLfixed z = (xs * c->shade.dzdx) + ci.ydzdy; - GGLfixed f = (xs * c->shade.dfdx) + ci.ydfdy; - - struct { - GGLfixed s, t; - } tc[GGL_TEXTURE_UNIT_COUNT]; - if (enables & GGL_ENABLE_TMUS) { - for (int i=0 ; istate.texture[i].enable) { - texture_iterators_t& ti = c->state.texture[i].iterators; - if (enables & GGL_ENABLE_W) { - tc[i].s = ti.ydsdy; - tc[i].t = ti.ydtdy; - } else { - tc[i].s = (xs * ti.dsdx) + ti.ydsdy; - tc[i].t = (xs * ti.dtdx) + ti.ydtdy; - } - } - } - } - - pixel_t fragment; - pixel_t texel; - pixel_t fb; - - uint32_t x = xs; - uint32_t y = c->iterators.y; - - while (xc--) { - - { // just a scope - - // read color (convert to 8 bits by keeping only the integer part) - fragment.s[1] = fragment.s[2] = - fragment.s[3] = fragment.s[0] = 8; - fragment.c[1] = r >> (GGL_COLOR_BITS-8); - fragment.c[2] = g >> (GGL_COLOR_BITS-8); - fragment.c[3] = b >> (GGL_COLOR_BITS-8); - fragment.c[0] = a >> (GGL_COLOR_BITS-8); - - // texturing - if (enables & GGL_ENABLE_TMUS) { - for (int i=0 ; istate.texture[i]; - if (!tx.enable) - continue; - texture_iterators_t& ti = tx.iterators; - int32_t u, v; - - // s-coordinate - if (tx.s_coord != GGL_ONE_TO_ONE) { - const int w = tx.surface.width; - u = wrapping(tc[i].s, w, tx.s_wrap); - tc[i].s += ti.dsdx; - } else { - u = (((tx.shade.is0>>16) + x)<<16) + FIXED_HALF; - } - - // t-coordinate - if (tx.t_coord != GGL_ONE_TO_ONE) { - const int h = tx.surface.height; - v = wrapping(tc[i].t, h, tx.t_wrap); - tc[i].t += ti.dtdx; - } else { - v = (((tx.shade.it0>>16) + y)<<16) + FIXED_HALF; - } - - // read texture - if (tx.mag_filter == GGL_NEAREST && - tx.min_filter == GGL_NEAREST) - { - u >>= 16; - v >>= 16; - tx.surface.read(&tx.surface, c, u, v, &texel); - } else { - const int w = tx.surface.width; - const int h = tx.surface.height; - u -= FIXED_HALF; - v -= FIXED_HALF; - int u0 = u >> 16; - int v0 = v >> 16; - int u1 = u0 + 1; - int v1 = v0 + 1; - if (tx.s_wrap == GGL_REPEAT) { - if (u0<0) u0 += w; - if (u1<0) u1 += w; - if (u0>=w) u0 -= w; - if (u1>=w) u1 -= w; - } else { - if (u0<0) u0 = 0; - if (u1<0) u1 = 0; - if (u0>=w) u0 = w-1; - if (u1>=w) u1 = w-1; - } - if (tx.t_wrap == GGL_REPEAT) { - if (v0<0) v0 += h; - if (v1<0) v1 += h; - if (v0>=h) v0 -= h; - if (v1>=h) v1 -= h; - } else { - if (v0<0) v0 = 0; - if (v1<0) v1 = 0; - if (v0>=h) v0 = h-1; - if (v1>=h) v1 = h-1; - } - pixel_t texels[4]; - uint32_t mm[4]; - tx.surface.read(&tx.surface, c, u0, v0, &texels[0]); - tx.surface.read(&tx.surface, c, u0, v1, &texels[1]); - tx.surface.read(&tx.surface, c, u1, v0, &texels[2]); - tx.surface.read(&tx.surface, c, u1, v1, &texels[3]); - u = (u >> 12) & 0xF; - v = (v >> 12) & 0xF; - u += u>>3; - v += v>>3; - mm[0] = (0x10 - u) * (0x10 - v); - mm[1] = (0x10 - u) * v; - mm[2] = u * (0x10 - v); - mm[3] = 0x100 - (mm[0] + mm[1] + mm[2]); - for (int j=0 ; j<4 ; j++) { - texel.s[j] = texels[0].s[j]; - if (!texel.s[j]) continue; - texel.s[j] += 8; - texel.c[j] = texels[0].c[j]*mm[0] + - texels[1].c[j]*mm[1] + - texels[2].c[j]*mm[2] + - texels[3].c[j]*mm[3] ; - } - } - - // Texture environnement... - for (int j=0 ; j<4 ; j++) { - uint32_t& Cf = fragment.c[j]; - uint32_t& Ct = texel.c[j]; - uint8_t& sf = fragment.s[j]; - uint8_t& st = texel.s[j]; - uint32_t At = texel.c[0]; - uint8_t sat = texel.s[0]; - switch (tx.env) { - case GGL_REPLACE: - if (st) { - Cf = Ct; - sf = st; - } - break; - case GGL_MODULATE: - if (st) { - uint32_t factor = Ct + (Ct>>(st-1)); - Cf = (Cf * factor) >> st; - } - break; - case GGL_DECAL: - if (sat) { - rescale(Cf, sf, Ct, st); - Cf += ((Ct - Cf) * (At + (At>>(sat-1)))) >> sat; - } - break; - case GGL_BLEND: - if (st) { - uint32_t Cc = tx.env_color[i]; - if (sf>8) Cc = (Cc * ((1<>8; - else if (sf<8) Cc = (Cc - (Cc>>(8-sf)))>>(8-sf); - uint32_t factor = Ct + (Ct>>(st-1)); - Cf = ((((1<>st; - } - break; - case GGL_ADD: - if (st) { - rescale(Cf, sf, Ct, st); - Cf += Ct; - } - break; - } - } - } - } - - // coverage application - if (enables & GGL_ENABLE_AA) { - int16_t cf = *covPtr++; - fragment.c[0] = (int64_t(fragment.c[0]) * cf) >> 15; - } - - // alpha-test - if (enables & GGL_ENABLE_ALPHA_TEST) { - GGLcolor ref = c->state.alpha_test.ref; - GGLcolor alpha = (uint64_t(fragment.c[0]) * - ((1<state.alpha_test.func) { - case GGL_NEVER: goto discard; - case GGL_LESS: if (alpharef) break; goto discard; - case GGL_NOTEQUAL: if (alpha!=ref) break; goto discard; - case GGL_GEQUAL: if (alpha>=ref) break; goto discard; - } - } - - // depth test - if (c->state.buffers.depth.format) { - if (enables & GGL_ENABLE_DEPTH_TEST) { - surface_t* cb = &(c->state.buffers.depth); - uint16_t* p = (uint16_t*)(cb->data)+(x+(cb->stride*y)); - uint16_t zz = uint32_t(z)>>(16); - uint16_t depth = *p; - switch (c->state.depth_test.func) { - case GGL_NEVER: goto discard; - case GGL_LESS: if (zzdepth) break; goto discard; - case GGL_NOTEQUAL: if (zz!=depth) break; goto discard; - case GGL_GEQUAL: if (zz>=depth) break; goto discard; - } - // depth buffer is not enabled, if depth-test is not enabled -/* - fragment.s[1] = fragment.s[2] = - fragment.s[3] = fragment.s[0] = 8; - fragment.c[1] = - fragment.c[2] = - fragment.c[3] = - fragment.c[0] = 255 - (zz>>8); -*/ - if (c->state.mask.depth) { - *p = zz; - } - } - } - - // fog - if (enables & GGL_ENABLE_FOG) { - for (int i=1 ; i<=3 ; i++) { - GGLfixed fc = (c->state.fog.color[i] * 0x10000) / 0xFF; - uint32_t& c = fragment.c[i]; - uint8_t& s = fragment.s[i]; - c = (c * 0x10000) / ((1<state.buffers.color.read( - &(c->state.buffers.color), c, x, y, &fb); - blending( c, &fragment, &fb ); - } - - // write - c->state.buffers.color.write( - &(c->state.buffers.color), c, x, y, &fragment); - } - -discard: - // iterate... - x += 1; - if (enables & GGL_ENABLE_SMOOTH) { - r += c->shade.drdx; - g += c->shade.dgdx; - b += c->shade.dbdx; - a += c->shade.dadx; - } - z += c->shade.dzdx; - f += c->shade.dfdx; - } -} - -#endif // ANDROID_ARM_CODEGEN && (ANDROID_CODEGEN == ANDROID_CODEGEN_GENERATED) - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark Scanline -#endif - -/* Used to parse a 32-bit source texture linearly. Usage is: - * - * horz_iterator32 hi(context); - * while (...) { - * uint32_t src_pixel = hi.get_pixel32(); - * ... - * } - * - * Use only for one-to-one texture mapping. - */ -struct horz_iterator32 { - explicit horz_iterator32(context_t* c) { - const int x = c->iterators.xl; - const int y = c->iterators.y; - texture_t& tx = c->state.texture[0]; - const int32_t u = (tx.shade.is0>>16) + x; - const int32_t v = (tx.shade.it0>>16) + y; - m_src = reinterpret_cast(tx.surface.data)+(u+(tx.surface.stride*v)); - } - uint32_t get_pixel32() { - return *m_src++; - } -protected: - uint32_t* m_src; -}; - -/* A variant for 16-bit source textures. */ -struct horz_iterator16 { - explicit horz_iterator16(context_t* c) { - const int x = c->iterators.xl; - const int y = c->iterators.y; - texture_t& tx = c->state.texture[0]; - const int32_t u = (tx.shade.is0>>16) + x; - const int32_t v = (tx.shade.it0>>16) + y; - m_src = reinterpret_cast(tx.surface.data)+(u+(tx.surface.stride*v)); - } - uint16_t get_pixel16() { - return *m_src++; - } -protected: - uint16_t* m_src; -}; - -/* A clamp iterator is used to iterate inside a texture with GGL_CLAMP. - * After initialization, call get_src16() or get_src32() to get the current - * texture pixel value. - */ -struct clamp_iterator { - explicit clamp_iterator(context_t* c) { - const int xs = c->iterators.xl; - texture_t& tx = c->state.texture[0]; - texture_iterators_t& ti = tx.iterators; - m_s = (xs * ti.dsdx) + ti.ydsdy; - m_t = (xs * ti.dtdx) + ti.ydtdy; - m_ds = ti.dsdx; - m_dt = ti.dtdx; - m_width_m1 = tx.surface.width - 1; - m_height_m1 = tx.surface.height - 1; - m_data = tx.surface.data; - m_stride = tx.surface.stride; - } - uint16_t get_pixel16() { - int u, v; - get_uv(u, v); - uint16_t* src = reinterpret_cast(m_data) + (u + (m_stride*v)); - return src[0]; - } - uint32_t get_pixel32() { - int u, v; - get_uv(u, v); - uint32_t* src = reinterpret_cast(m_data) + (u + (m_stride*v)); - return src[0]; - } -private: - void get_uv(int& u, int& v) { - int uu = m_s >> 16; - int vv = m_t >> 16; - if (uu < 0) - uu = 0; - if (uu > m_width_m1) - uu = m_width_m1; - if (vv < 0) - vv = 0; - if (vv > m_height_m1) - vv = m_height_m1; - u = uu; - v = vv; - m_s += m_ds; - m_t += m_dt; - } - - GGLfixed m_s, m_t; - GGLfixed m_ds, m_dt; - int m_width_m1, m_height_m1; - uint8_t* m_data; - int m_stride; -}; - -/* - * The 'horizontal clamp iterator' variant corresponds to the case where - * the 'v' coordinate doesn't change. This is useful to avoid one mult and - * extra adds / checks per pixels, if the blending/processing operation after - * this is very fast. - */ -static int is_context_horizontal(const context_t* c) { - return (c->state.texture[0].iterators.dtdx == 0); -} - -struct horz_clamp_iterator { - uint16_t get_pixel16() { - int u = m_s >> 16; - m_s += m_ds; - if (u < 0) - u = 0; - if (u > m_width_m1) - u = m_width_m1; - const uint16_t* src = reinterpret_cast(m_data); - return src[u]; - } - uint32_t get_pixel32() { - int u = m_s >> 16; - m_s += m_ds; - if (u < 0) - u = 0; - if (u > m_width_m1) - u = m_width_m1; - const uint32_t* src = reinterpret_cast(m_data); - return src[u]; - } -protected: - void init(const context_t* c, int shift); - GGLfixed m_s; - GGLfixed m_ds; - int m_width_m1; - const uint8_t* m_data; -}; - -void horz_clamp_iterator::init(const context_t* c, int shift) -{ - const int xs = c->iterators.xl; - const texture_t& tx = c->state.texture[0]; - const texture_iterators_t& ti = tx.iterators; - m_s = (xs * ti.dsdx) + ti.ydsdy; - m_ds = ti.dsdx; - m_width_m1 = tx.surface.width-1; - m_data = tx.surface.data; - - GGLfixed t = (xs * ti.dtdx) + ti.ydtdy; - int v = t >> 16; - if (v < 0) - v = 0; - else if (v >= (int)tx.surface.height) - v = (int)tx.surface.height-1; - - m_data += (tx.surface.stride*v) << shift; -} - -struct horz_clamp_iterator16 : horz_clamp_iterator { - explicit horz_clamp_iterator16(const context_t* c) { - init(c,1); - }; -}; - -struct horz_clamp_iterator32 : horz_clamp_iterator { - explicit horz_clamp_iterator32(context_t* c) { - init(c,2); - }; -}; - -/* This is used to perform dithering operations. - */ -struct ditherer { - explicit ditherer(const context_t* c) { - const int x = c->iterators.xl; - const int y = c->iterators.y; - m_line = &c->ditherMatrix[ ((y & GGL_DITHER_MASK)<> 8) & 0xff; - uint32_t b = (s >> 16) & 0xff; - return rgb888ToRgb565(r,g,b); - } - /* The following assumes that r/g/b are in the 0..255 range each */ - uint16_t rgb888ToRgb565(uint32_t& r, uint32_t& g, uint32_t &b) { - int threshold = get_value(); - /* dither in on GGL_DITHER_BITS, and each of r, g, b is on 8 bits */ - r += (threshold >> (GGL_DITHER_BITS-8 +5)); - g += (threshold >> (GGL_DITHER_BITS-8 +6)); - b += (threshold >> (GGL_DITHER_BITS-8 +5)); - if (r > 0xff) - r = 0xff; - if (g > 0xff) - g = 0xff; - if (b > 0xff) - b = 0xff; - return uint16_t(((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3)); - } -protected: - const uint8_t* m_line; - int m_index; -}; - -/* This structure is used to blend (SRC_OVER) 32-bit source pixels - * onto 16-bit destination ones. Usage is simply: - * - * blender.blend(<32-bit-src-pixel-value>,) - */ -struct blender_32to16 { - explicit blender_32to16(context_t* /*c*/) { } - void write(uint32_t s, uint16_t* dst) { - if (s == 0) - return; - s = GGL_RGBA_TO_HOST(s); - int sA = (s>>24); - if (sA == 0xff) { - *dst = convertAbgr8888ToRgb565(s); - } else { - int f = 0x100 - (sA + (sA>>7)); - int sR = (s >> ( 3))&0x1F; - int sG = (s >> ( 8+2))&0x3F; - int sB = (s >> (16+3))&0x1F; - uint16_t d = *dst; - int dR = (d>>11)&0x1f; - int dG = (d>>5)&0x3f; - int dB = (d)&0x1f; - sR += (f*dR)>>8; - sG += (f*dG)>>8; - sB += (f*dB)>>8; - *dst = uint16_t((sR<<11)|(sG<<5)|sB); - } - } - void write(uint32_t s, uint16_t* dst, ditherer& di) { - if (s == 0) { - di.step(); - return; - } - s = GGL_RGBA_TO_HOST(s); - int sA = (s>>24); - if (sA == 0xff) { - *dst = di.abgr8888ToRgb565(s); - } else { - int threshold = di.get_value() << (8 - GGL_DITHER_BITS); - int f = 0x100 - (sA + (sA>>7)); - int sR = (s >> ( 3))&0x1F; - int sG = (s >> ( 8+2))&0x3F; - int sB = (s >> (16+3))&0x1F; - uint16_t d = *dst; - int dR = (d>>11)&0x1f; - int dG = (d>>5)&0x3f; - int dB = (d)&0x1f; - sR = ((sR << 8) + f*dR + threshold)>>8; - sG = ((sG << 8) + f*dG + threshold)>>8; - sB = ((sB << 8) + f*dB + threshold)>>8; - if (sR > 0x1f) sR = 0x1f; - if (sG > 0x3f) sG = 0x3f; - if (sB > 0x1f) sB = 0x1f; - *dst = uint16_t((sR<<11)|(sG<<5)|sB); - } - } -}; - -/* This blender does the same for the 'blend_srca' operation. - * where dstFactor=srcA*(1-srcA) srcFactor=srcA - */ -struct blender_32to16_srcA { - explicit blender_32to16_srcA(const context_t* /*c*/) { } - void write(uint32_t s, uint16_t* dst) { - if (!s) { - return; - } - uint16_t d = *dst; - s = GGL_RGBA_TO_HOST(s); - int sR = (s >> ( 3))&0x1F; - int sG = (s >> ( 8+2))&0x3F; - int sB = (s >> (16+3))&0x1F; - int sA = (s>>24); - int f1 = (sA + (sA>>7)); - int f2 = 0x100-f1; - int dR = (d>>11)&0x1f; - int dG = (d>>5)&0x3f; - int dB = (d)&0x1f; - sR = (f1*sR + f2*dR)>>8; - sG = (f1*sG + f2*dG)>>8; - sB = (f1*sB + f2*dB)>>8; - *dst = uint16_t((sR<<11)|(sG<<5)|sB); - } -}; - -/* Common init code the modulating blenders */ -struct blender_modulate { - void init(const context_t* c) { - const int r = c->iterators.ydrdy >> (GGL_COLOR_BITS-8); - const int g = c->iterators.ydgdy >> (GGL_COLOR_BITS-8); - const int b = c->iterators.ydbdy >> (GGL_COLOR_BITS-8); - const int a = c->iterators.ydady >> (GGL_COLOR_BITS-8); - m_r = r + (r >> 7); - m_g = g + (g >> 7); - m_b = b + (b >> 7); - m_a = a + (a >> 7); - } -protected: - int m_r, m_g, m_b, m_a; -}; - -/* This blender does a normal blend after modulation. - */ -struct blender_32to16_modulate : blender_modulate { - explicit blender_32to16_modulate(const context_t* c) { - init(c); - } - void write(uint32_t s, uint16_t* dst) { - // blend source and destination - if (!s) { - return; - } - s = GGL_RGBA_TO_HOST(s); - - /* We need to modulate s */ - uint32_t sA = (s >> 24); - uint32_t sB = (s >> 16) & 0xff; - uint32_t sG = (s >> 8) & 0xff; - uint32_t sR = s & 0xff; - - sA = (sA*m_a) >> 8; - /* Keep R/G/B scaled to 5.8 or 6.8 fixed float format */ - sR = (sR*m_r) >> (8 - 5); - sG = (sG*m_g) >> (8 - 6); - sB = (sB*m_b) >> (8 - 5); - - /* Now do a normal blend */ - int f = 0x100 - (sA + (sA>>7)); - uint16_t d = *dst; - int dR = (d>>11)&0x1f; - int dG = (d>>5)&0x3f; - int dB = (d)&0x1f; - sR = (sR + f*dR)>>8; - sG = (sG + f*dG)>>8; - sB = (sB + f*dB)>>8; - *dst = uint16_t((sR<<11)|(sG<<5)|sB); - } - void write(uint32_t s, uint16_t* dst, ditherer& di) { - // blend source and destination - if (!s) { - di.step(); - return; - } - s = GGL_RGBA_TO_HOST(s); - - /* We need to modulate s */ - uint32_t sA = (s >> 24); - uint32_t sB = (s >> 16) & 0xff; - uint32_t sG = (s >> 8) & 0xff; - uint32_t sR = s & 0xff; - - sA = (sA*m_a) >> 8; - /* keep R/G/B scaled to 5.8 or 6.8 fixed float format */ - sR = (sR*m_r) >> (8 - 5); - sG = (sG*m_g) >> (8 - 6); - sB = (sB*m_b) >> (8 - 5); - - /* Scale threshold to 0.8 fixed float format */ - int threshold = di.get_value() << (8 - GGL_DITHER_BITS); - int f = 0x100 - (sA + (sA>>7)); - uint16_t d = *dst; - int dR = (d>>11)&0x1f; - int dG = (d>>5)&0x3f; - int dB = (d)&0x1f; - sR = (sR + f*dR + threshold)>>8; - sG = (sG + f*dG + threshold)>>8; - sB = (sB + f*dB + threshold)>>8; - if (sR > 0x1f) sR = 0x1f; - if (sG > 0x3f) sG = 0x3f; - if (sB > 0x1f) sB = 0x1f; - *dst = uint16_t((sR<<11)|(sG<<5)|sB); - } -}; - -/* same as 32to16_modulate, except that the input is xRGB, instead of ARGB */ -struct blender_x32to16_modulate : blender_modulate { - explicit blender_x32to16_modulate(const context_t* c) { - init(c); - } - void write(uint32_t s, uint16_t* dst) { - s = GGL_RGBA_TO_HOST(s); - - uint32_t sB = (s >> 16) & 0xff; - uint32_t sG = (s >> 8) & 0xff; - uint32_t sR = s & 0xff; - - /* Keep R/G/B in 5.8 or 6.8 format */ - sR = (sR*m_r) >> (8 - 5); - sG = (sG*m_g) >> (8 - 6); - sB = (sB*m_b) >> (8 - 5); - - int f = 0x100 - m_a; - uint16_t d = *dst; - int dR = (d>>11)&0x1f; - int dG = (d>>5)&0x3f; - int dB = (d)&0x1f; - sR = (sR + f*dR)>>8; - sG = (sG + f*dG)>>8; - sB = (sB + f*dB)>>8; - *dst = uint16_t((sR<<11)|(sG<<5)|sB); - } - void write(uint32_t s, uint16_t* dst, ditherer& di) { - s = GGL_RGBA_TO_HOST(s); - - uint32_t sB = (s >> 16) & 0xff; - uint32_t sG = (s >> 8) & 0xff; - uint32_t sR = s & 0xff; - - sR = (sR*m_r) >> (8 - 5); - sG = (sG*m_g) >> (8 - 6); - sB = (sB*m_b) >> (8 - 5); - - /* Now do a normal blend */ - int threshold = di.get_value() << (8 - GGL_DITHER_BITS); - int f = 0x100 - m_a; - uint16_t d = *dst; - int dR = (d>>11)&0x1f; - int dG = (d>>5)&0x3f; - int dB = (d)&0x1f; - sR = (sR + f*dR + threshold)>>8; - sG = (sG + f*dG + threshold)>>8; - sB = (sB + f*dB + threshold)>>8; - if (sR > 0x1f) sR = 0x1f; - if (sG > 0x3f) sG = 0x3f; - if (sB > 0x1f) sB = 0x1f; - *dst = uint16_t((sR<<11)|(sG<<5)|sB); - } -}; - -/* Same as above, but source is 16bit rgb565 */ -struct blender_16to16_modulate : blender_modulate { - explicit blender_16to16_modulate(const context_t* c) { - init(c); - } - void write(uint16_t s16, uint16_t* dst) { - uint32_t s = s16; - - uint32_t sR = s >> 11; - uint32_t sG = (s >> 5) & 0x3f; - uint32_t sB = s & 0x1f; - - sR = (sR*m_r); - sG = (sG*m_g); - sB = (sB*m_b); - - int f = 0x100 - m_a; - uint16_t d = *dst; - int dR = (d>>11)&0x1f; - int dG = (d>>5)&0x3f; - int dB = (d)&0x1f; - sR = (sR + f*dR)>>8; - sG = (sG + f*dG)>>8; - sB = (sB + f*dB)>>8; - *dst = uint16_t((sR<<11)|(sG<<5)|sB); - } -}; - -/* This is used to iterate over a 16-bit destination color buffer. - * Usage is: - * - * dst_iterator16 di(context); - * while (di.count--) { - * - * di.dst++; - * } - */ -struct dst_iterator16 { - explicit dst_iterator16(const context_t* c) { - const int x = c->iterators.xl; - const int width = c->iterators.xr - x; - const int32_t y = c->iterators.y; - const surface_t* cb = &(c->state.buffers.color); - count = width; - dst = reinterpret_cast(cb->data) + (x+(cb->stride*y)); - } - int count; - uint16_t* dst; -}; - - -static void scanline_t32cb16_clamp(context_t* c) -{ - dst_iterator16 di(c); - - if (is_context_horizontal(c)) { - /* Special case for simple horizontal scaling */ - horz_clamp_iterator32 ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - *di.dst++ = convertAbgr8888ToRgb565(s); - } - } else { - /* General case */ - clamp_iterator ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - *di.dst++ = convertAbgr8888ToRgb565(s); - } - } -} - -static void scanline_t32cb16_dither(context_t* c) -{ - horz_iterator32 si(c); - dst_iterator16 di(c); - ditherer dither(c); - - while (di.count--) { - uint32_t s = si.get_pixel32(); - *di.dst++ = dither.abgr8888ToRgb565(s); - } -} - -static void scanline_t32cb16_clamp_dither(context_t* c) -{ - dst_iterator16 di(c); - ditherer dither(c); - - if (is_context_horizontal(c)) { - /* Special case for simple horizontal scaling */ - horz_clamp_iterator32 ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - *di.dst++ = dither.abgr8888ToRgb565(s); - } - } else { - /* General case */ - clamp_iterator ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - *di.dst++ = dither.abgr8888ToRgb565(s); - } - } -} - -static void scanline_t32cb16blend_dither(context_t* c) -{ - dst_iterator16 di(c); - ditherer dither(c); - blender_32to16 bl(c); - horz_iterator32 hi(c); - while (di.count--) { - uint32_t s = hi.get_pixel32(); - bl.write(s, di.dst, dither); - di.dst++; - } -} - -static void scanline_t32cb16blend_clamp(context_t* c) -{ - dst_iterator16 di(c); - blender_32to16 bl(c); - - if (is_context_horizontal(c)) { - horz_clamp_iterator32 ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - bl.write(s, di.dst); - di.dst++; - } - } else { - clamp_iterator ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - bl.write(s, di.dst); - di.dst++; - } - } -} - -static void scanline_t32cb16blend_clamp_dither(context_t* c) -{ - dst_iterator16 di(c); - ditherer dither(c); - blender_32to16 bl(c); - - clamp_iterator ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - bl.write(s, di.dst, dither); - di.dst++; - } -} - -void scanline_t32cb16blend_clamp_mod(context_t* c) -{ - dst_iterator16 di(c); - blender_32to16_modulate bl(c); - - clamp_iterator ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - bl.write(s, di.dst); - di.dst++; - } -} - -void scanline_t32cb16blend_clamp_mod_dither(context_t* c) -{ - dst_iterator16 di(c); - blender_32to16_modulate bl(c); - ditherer dither(c); - - clamp_iterator ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - bl.write(s, di.dst, dither); - di.dst++; - } -} - -/* Variant of scanline_t32cb16blend_clamp_mod with a xRGB texture */ -void scanline_x32cb16blend_clamp_mod(context_t* c) -{ - dst_iterator16 di(c); - blender_x32to16_modulate bl(c); - - clamp_iterator ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - bl.write(s, di.dst); - di.dst++; - } -} - -void scanline_x32cb16blend_clamp_mod_dither(context_t* c) -{ - dst_iterator16 di(c); - blender_x32to16_modulate bl(c); - ditherer dither(c); - - clamp_iterator ci(c); - while (di.count--) { - uint32_t s = ci.get_pixel32(); - bl.write(s, di.dst, dither); - di.dst++; - } -} - -void scanline_t16cb16_clamp(context_t* c) -{ - dst_iterator16 di(c); - - /* Special case for simple horizontal scaling */ - if (is_context_horizontal(c)) { - horz_clamp_iterator16 ci(c); - while (di.count--) { - *di.dst++ = ci.get_pixel16(); - } - } else { - clamp_iterator ci(c); - while (di.count--) { - *di.dst++ = ci.get_pixel16(); - } - } -} - - - -template -static inline __attribute__((const)) -T interpolate(int y, T v0, U dvdx, U dvdy) { - // interpolates in pixel's centers - // v = v0 + (y + 0.5) * dvdy + (0.5 * dvdx) - return (y * dvdy) + (v0 + ((dvdy + dvdx) >> 1)); -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#endif - -void init_y(context_t* c, int32_t ys) -{ - const uint32_t enables = c->state.enables; - - // compute iterators... - iterators_t& ci = c->iterators; - - // sample in the center - ci.y = ys; - - if (enables & (GGL_ENABLE_DEPTH_TEST|GGL_ENABLE_W|GGL_ENABLE_FOG)) { - ci.ydzdy = interpolate(ys, c->shade.z0, c->shade.dzdx, c->shade.dzdy); - ci.ydwdy = interpolate(ys, c->shade.w0, c->shade.dwdx, c->shade.dwdy); - ci.ydfdy = interpolate(ys, c->shade.f0, c->shade.dfdx, c->shade.dfdy); - } - - if (ggl_unlikely(enables & GGL_ENABLE_SMOOTH)) { - ci.ydrdy = interpolate(ys, c->shade.r0, c->shade.drdx, c->shade.drdy); - ci.ydgdy = interpolate(ys, c->shade.g0, c->shade.dgdx, c->shade.dgdy); - ci.ydbdy = interpolate(ys, c->shade.b0, c->shade.dbdx, c->shade.dbdy); - ci.ydady = interpolate(ys, c->shade.a0, c->shade.dadx, c->shade.dady); - c->step_y = step_y__smooth; - } else { - ci.ydrdy = c->shade.r0; - ci.ydgdy = c->shade.g0; - ci.ydbdy = c->shade.b0; - ci.ydady = c->shade.a0; - // XXX: do only if needed, or make sure this is fast - c->packed = ggl_pack_color(c, c->state.buffers.color.format, - ci.ydrdy, ci.ydgdy, ci.ydbdy, ci.ydady); - c->packed8888 = ggl_pack_color(c, GGL_PIXEL_FORMAT_RGBA_8888, - ci.ydrdy, ci.ydgdy, ci.ydbdy, ci.ydady); - } - - // initialize the variables we need in the shader - generated_vars_t& gen = c->generated_vars; - gen.argb[GGLFormat::ALPHA].c = ci.ydady; - gen.argb[GGLFormat::ALPHA].dx = c->shade.dadx; - gen.argb[GGLFormat::RED ].c = ci.ydrdy; - gen.argb[GGLFormat::RED ].dx = c->shade.drdx; - gen.argb[GGLFormat::GREEN].c = ci.ydgdy; - gen.argb[GGLFormat::GREEN].dx = c->shade.dgdx; - gen.argb[GGLFormat::BLUE ].c = ci.ydbdy; - gen.argb[GGLFormat::BLUE ].dx = c->shade.dbdx; - gen.dzdx = c->shade.dzdx; - gen.f = ci.ydfdy; - gen.dfdx = c->shade.dfdx; - - if (enables & GGL_ENABLE_TMUS) { - for (int i=0 ; istate.texture[i]; - if (!t.enable) continue; - - texture_iterators_t& ti = t.iterators; - if (t.s_coord == GGL_ONE_TO_ONE && t.t_coord == GGL_ONE_TO_ONE) { - // we need to set all of these to 0 because in some cases - // step_y__generic() or step_y__tmu() will be used and - // therefore will update dtdy, however, in 1:1 mode - // this is always done by the scanline rasterizer. - ti.dsdx = ti.dsdy = ti.dtdx = ti.dtdy = 0; - ti.ydsdy = t.shade.is0; - ti.ydtdy = t.shade.it0; - } else { - const int adjustSWrap = ((t.s_wrap==GGL_CLAMP)?0:16); - const int adjustTWrap = ((t.t_wrap==GGL_CLAMP)?0:16); - ti.sscale = t.shade.sscale + adjustSWrap; - ti.tscale = t.shade.tscale + adjustTWrap; - if (!(enables & GGL_ENABLE_W)) { - // S coordinate - const int32_t sscale = ti.sscale; - const int32_t sy = interpolate(ys, - t.shade.is0, t.shade.idsdx, t.shade.idsdy); - if (sscale>=0) { - ti.ydsdy= sy << sscale; - ti.dsdx = t.shade.idsdx << sscale; - ti.dsdy = t.shade.idsdy << sscale; - } else { - ti.ydsdy= sy >> -sscale; - ti.dsdx = t.shade.idsdx >> -sscale; - ti.dsdy = t.shade.idsdy >> -sscale; - } - // T coordinate - const int32_t tscale = ti.tscale; - const int32_t ty = interpolate(ys, - t.shade.it0, t.shade.idtdx, t.shade.idtdy); - if (tscale>=0) { - ti.ydtdy= ty << tscale; - ti.dtdx = t.shade.idtdx << tscale; - ti.dtdy = t.shade.idtdy << tscale; - } else { - ti.ydtdy= ty >> -tscale; - ti.dtdx = t.shade.idtdx >> -tscale; - ti.dtdy = t.shade.idtdy >> -tscale; - } - } - } - // mirror for generated code... - generated_tex_vars_t& gen = c->generated_vars.texture[i]; - gen.width = t.surface.width; - gen.height = t.surface.height; - gen.stride = t.surface.stride; - gen.data = uintptr_t(t.surface.data); - gen.dsdx = ti.dsdx; - gen.dtdx = ti.dtdx; - } - } - - // choose the y-stepper - c->step_y = step_y__nop; - if (enables & GGL_ENABLE_FOG) { - c->step_y = step_y__generic; - } else if (enables & GGL_ENABLE_TMUS) { - if (enables & GGL_ENABLE_SMOOTH) { - c->step_y = step_y__generic; - } else if (enables & GGL_ENABLE_W) { - c->step_y = step_y__w; - } else { - c->step_y = step_y__tmu; - } - } else { - if (enables & GGL_ENABLE_SMOOTH) { - c->step_y = step_y__smooth; - } - } - - // choose the rectangle blitter - c->rect = rect_generic; - if ((c->step_y == step_y__nop) && - (c->scanline == scanline_memcpy)) - { - c->rect = rect_memcpy; - } -} - -void init_y_packed(context_t* c, int32_t y0) -{ - uint8_t f = c->state.buffers.color.format; - c->packed = ggl_pack_color(c, f, - c->shade.r0, c->shade.g0, c->shade.b0, c->shade.a0); - c->packed8888 = ggl_pack_color(c, GGL_PIXEL_FORMAT_RGBA_8888, - c->shade.r0, c->shade.g0, c->shade.b0, c->shade.a0); - c->iterators.y = y0; - c->step_y = step_y__nop; - // choose the rectangle blitter - c->rect = rect_generic; - if (c->scanline == scanline_memcpy) { - c->rect = rect_memcpy; - } -} - -void init_y_noop(context_t* c, int32_t y0) -{ - c->iterators.y = y0; - c->step_y = step_y__nop; - // choose the rectangle blitter - c->rect = rect_generic; - if (c->scanline == scanline_memcpy) { - c->rect = rect_memcpy; - } -} - -void init_y_error(context_t* c, int32_t y0) -{ - // woooops, shoud never happen, - // fail gracefully (don't display anything) - init_y_noop(c, y0); - ALOGE("color-buffer has an invalid format!"); -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#endif - -void step_y__generic(context_t* c) -{ - const uint32_t enables = c->state.enables; - - // iterate... - iterators_t& ci = c->iterators; - ci.y += 1; - - if (enables & GGL_ENABLE_SMOOTH) { - ci.ydrdy += c->shade.drdy; - ci.ydgdy += c->shade.dgdy; - ci.ydbdy += c->shade.dbdy; - ci.ydady += c->shade.dady; - } - - const uint32_t mask = - GGL_ENABLE_DEPTH_TEST | - GGL_ENABLE_W | - GGL_ENABLE_FOG; - if (enables & mask) { - ci.ydzdy += c->shade.dzdy; - ci.ydwdy += c->shade.dwdy; - ci.ydfdy += c->shade.dfdy; - } - - if ((enables & GGL_ENABLE_TMUS) && (!(enables & GGL_ENABLE_W))) { - for (int i=0 ; istate.texture[i].enable) { - texture_iterators_t& ti = c->state.texture[i].iterators; - ti.ydsdy += ti.dsdy; - ti.ydtdy += ti.dtdy; - } - } - } -} - -void step_y__nop(context_t* c) -{ - c->iterators.y += 1; - c->iterators.ydzdy += c->shade.dzdy; -} - -void step_y__smooth(context_t* c) -{ - iterators_t& ci = c->iterators; - ci.y += 1; - ci.ydrdy += c->shade.drdy; - ci.ydgdy += c->shade.dgdy; - ci.ydbdy += c->shade.dbdy; - ci.ydady += c->shade.dady; - ci.ydzdy += c->shade.dzdy; -} - -void step_y__w(context_t* c) -{ - iterators_t& ci = c->iterators; - ci.y += 1; - ci.ydzdy += c->shade.dzdy; - ci.ydwdy += c->shade.dwdy; -} - -void step_y__tmu(context_t* c) -{ - iterators_t& ci = c->iterators; - ci.y += 1; - ci.ydzdy += c->shade.dzdy; - for (int i=0 ; istate.texture[i].enable) { - texture_iterators_t& ti = c->state.texture[i].iterators; - ti.ydsdy += ti.dsdy; - ti.ydtdy += ti.dtdy; - } - } -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#endif - -void scanline_perspective(context_t* c) -{ - struct { - union { - struct { - int32_t s, sq; - int32_t t, tq; - } sqtq; - struct { - int32_t v, q; - } st[2]; - }; - } tc[GGL_TEXTURE_UNIT_COUNT] __attribute__((aligned(16))); - - // XXX: we should have a special case when dwdx = 0 - - // 32 pixels spans works okay. 16 is a lot better, - // but hey, it's a software renderer... - const uint32_t SPAN_BITS = 5; - const uint32_t ys = c->iterators.y; - const uint32_t xs = c->iterators.xl; - const uint32_t x1 = c->iterators.xr; - const uint32_t xc = x1 - xs; - uint32_t remainder = xc & ((1<> SPAN_BITS; - - const iterators_t& ci = c->iterators; - int32_t w0 = (xs * c->shade.dwdx) + ci.ydwdy; - int32_t q0 = gglRecipQ(w0, 30); - const int iwscale = 32 - gglClz(q0); - - const int32_t dwdx = c->shade.dwdx << SPAN_BITS; - int32_t xl = c->iterators.xl; - - // We process s & t with a loop to reduce the code size - // (and i-cache pressure). - - for (int i=0 ; istate.texture[i]; - if (!tmu.enable) continue; - int32_t s = tmu.shade.is0 + - (tmu.shade.idsdy * ys) + (tmu.shade.idsdx * xs) + - ((tmu.shade.idsdx + tmu.shade.idsdy)>>1); - int32_t t = tmu.shade.it0 + - (tmu.shade.idtdy * ys) + (tmu.shade.idtdx * xs) + - ((tmu.shade.idtdx + tmu.shade.idtdy)>>1); - tc[i].sqtq.s = s; - tc[i].sqtq.t = t; - tc[i].sqtq.sq = gglMulx(s, q0, iwscale); - tc[i].sqtq.tq = gglMulx(t, q0, iwscale); - } - - int32_t span = 0; - do { - int32_t w1; - if (ggl_likely(numSpans)) { - w1 = w0 + dwdx; - } else { - if (remainder) { - // finish off the scanline... - span = remainder; - w1 = (c->shade.dwdx * span) + w0; - } else { - break; - } - } - int32_t q1 = gglRecipQ(w1, 30); - for (int i=0 ; istate.texture[i]; - if (!tmu.enable) continue; - texture_iterators_t& ti = tmu.iterators; - - for (int j=0 ; j<2 ; j++) { - int32_t v = tc[i].st[j].v; - if (span) v += (tmu.shade.st[j].dx)*span; - else v += (tmu.shade.st[j].dx)<>= SPAN_BITS; - tc[i].st[j].v = v; - tc[i].st[j].q = v1; - - const int scale = ti.st[j].scale + (iwscale - 30); - if (scale >= 0) { - ti.st[j].ydvdy = v0 << scale; - ti.st[j].dvdx = dvdx << scale; - } else { - ti.st[j].ydvdy = v0 >> -scale; - ti.st[j].dvdx = dvdx >> -scale; - } - } - generated_tex_vars_t& gen = c->generated_vars.texture[i]; - gen.dsdx = ti.st[0].dvdx; - gen.dtdx = ti.st[1].dvdx; - } - c->iterators.xl = xl; - c->iterators.xr = xl = xl + (span ? span : (1<span(c); - } while(numSpans--); -} - -void scanline_perspective_single(context_t* c) -{ - // 32 pixels spans works okay. 16 is a lot better, - // but hey, it's a software renderer... - const uint32_t SPAN_BITS = 5; - const uint32_t ys = c->iterators.y; - const uint32_t xs = c->iterators.xl; - const uint32_t x1 = c->iterators.xr; - const uint32_t xc = x1 - xs; - - const iterators_t& ci = c->iterators; - int32_t w = (xs * c->shade.dwdx) + ci.ydwdy; - int32_t iw = gglRecipQ(w, 30); - const int iwscale = 32 - gglClz(iw); - - const int i = 31 - gglClz(c->state.enabled_tmu); - generated_tex_vars_t& gen = c->generated_vars.texture[i]; - texture_t& tmu = c->state.texture[i]; - texture_iterators_t& ti = tmu.iterators; - const int sscale = ti.sscale + (iwscale - 30); - const int tscale = ti.tscale + (iwscale - 30); - int32_t s = tmu.shade.is0 + - (tmu.shade.idsdy * ys) + (tmu.shade.idsdx * xs) + - ((tmu.shade.idsdx + tmu.shade.idsdy)>>1); - int32_t t = tmu.shade.it0 + - (tmu.shade.idtdy * ys) + (tmu.shade.idtdx * xs) + - ((tmu.shade.idtdx + tmu.shade.idtdy)>>1); - int32_t s0 = gglMulx(s, iw, iwscale); - int32_t t0 = gglMulx(t, iw, iwscale); - int32_t xl = c->iterators.xl; - - int32_t sq, tq, dsdx, dtdx; - int32_t premainder = xc & ((1<> SPAN_BITS; - if (c->shade.dwdx == 0) { - // XXX: we could choose to do this if the error is small enough - numSpans = 0; - premainder = xc; - goto no_perspective; - } - - if (premainder) { - w += c->shade.dwdx * premainder; - iw = gglRecipQ(w, 30); -no_perspective: - s += tmu.shade.idsdx * premainder; - t += tmu.shade.idtdx * premainder; - sq = gglMulx(s, iw, iwscale); - tq = gglMulx(t, iw, iwscale); - dsdx = (sq - s0) / premainder; - dtdx = (tq - t0) / premainder; - c->iterators.xl = xl; - c->iterators.xr = xl = xl + premainder; - goto finish; - } - - while (numSpans--) { - w += c->shade.dwdx << SPAN_BITS; - s += tmu.shade.idsdx << SPAN_BITS; - t += tmu.shade.idtdx << SPAN_BITS; - iw = gglRecipQ(w, 30); - sq = gglMulx(s, iw, iwscale); - tq = gglMulx(t, iw, iwscale); - dsdx = (sq - s0) >> SPAN_BITS; - dtdx = (tq - t0) >> SPAN_BITS; - c->iterators.xl = xl; - c->iterators.xr = xl = xl + (1<= 0) { - ti.ydsdy = s0 << sscale; - ti.dsdx = dsdx << sscale; - } else { - ti.ydsdy = s0 >>-sscale; - ti.dsdx = dsdx >>-sscale; - } - if (tscale >= 0) { - ti.ydtdy = t0 << tscale; - ti.dtdx = dtdx << tscale; - } else { - ti.ydtdy = t0 >>-tscale; - ti.dtdx = dtdx >>-tscale; - } - s0 = sq; - t0 = tq; - gen.dsdx = ti.dsdx; - gen.dtdx = ti.dtdx; - c->span(c); - } -} - -// ---------------------------------------------------------------------------- - -void scanline_col32cb16blend(context_t* c) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - union { - uint16_t* dst; - uint32_t* dst32; - }; - dst = reinterpret_cast(cb->data) + (x+(cb->stride*y)); - -#if ((ANDROID_CODEGEN >= ANDROID_CODEGEN_ASM) && defined(__arm__)) -#if defined(__ARM_HAVE_NEON) && BYTE_ORDER == LITTLE_ENDIAN - scanline_col32cb16blend_neon(dst, &(c->packed8888), ct); -#else // defined(__ARM_HAVE_NEON) && BYTE_ORDER == LITTLE_ENDIAN - scanline_col32cb16blend_arm(dst, GGL_RGBA_TO_HOST(c->packed8888), ct); -#endif // defined(__ARM_HAVE_NEON) && BYTE_ORDER == LITTLE_ENDIAN -#elif ((ANDROID_CODEGEN >= ANDROID_CODEGEN_ASM) && defined(__aarch64__)) - scanline_col32cb16blend_arm64(dst, GGL_RGBA_TO_HOST(c->packed8888), ct); -#elif ((ANDROID_CODEGEN >= ANDROID_CODEGEN_ASM) && (defined(__mips__) && defined(__LP64__))) - scanline_col32cb16blend_mips64(dst, GGL_RGBA_TO_HOST(c->packed8888), ct); -#else - uint32_t s = GGL_RGBA_TO_HOST(c->packed8888); - int sA = (s>>24); - int f = 0x100 - (sA + (sA>>7)); - while (ct--) { - uint16_t d = *dst; - int dR = (d>>11)&0x1f; - int dG = (d>>5)&0x3f; - int dB = (d)&0x1f; - int sR = (s >> ( 3))&0x1F; - int sG = (s >> ( 8+2))&0x3F; - int sB = (s >> (16+3))&0x1F; - sR += (f*dR)>>8; - sG += (f*dG)>>8; - sB += (f*dB)>>8; - *dst++ = uint16_t((sR<<11)|(sG<<5)|sB); - } -#endif - -} - -void scanline_t32cb16(context_t* c) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - union { - uint16_t* dst; - uint32_t* dst32; - }; - dst = reinterpret_cast(cb->data) + (x+(cb->stride*y)); - - surface_t* tex = &(c->state.texture[0].surface); - const int32_t u = (c->state.texture[0].shade.is0>>16) + x; - const int32_t v = (c->state.texture[0].shade.it0>>16) + y; - uint32_t *src = reinterpret_cast(tex->data)+(u+(tex->stride*v)); - uint32_t s, d; - - if (ct==1 || uintptr_t(dst)&2) { -last_one: - s = GGL_RGBA_TO_HOST( *src++ ); - *dst++ = convertAbgr8888ToRgb565(s); - ct--; - } - - while (ct >= 2) { -#if BYTE_ORDER == BIG_ENDIAN - s = GGL_RGBA_TO_HOST( *src++ ); - d = convertAbgr8888ToRgb565_hi16(s); - - s = GGL_RGBA_TO_HOST( *src++ ); - d |= convertAbgr8888ToRgb565(s); -#else - s = GGL_RGBA_TO_HOST( *src++ ); - d = convertAbgr8888ToRgb565(s); - - s = GGL_RGBA_TO_HOST( *src++ ); - d |= convertAbgr8888ToRgb565(s) << 16; -#endif - *dst32++ = d; - ct -= 2; - } - - if (ct > 0) { - goto last_one; - } -} - -void scanline_t32cb16blend(context_t* c) -{ -#if ((ANDROID_CODEGEN >= ANDROID_CODEGEN_ASM) && (defined(__arm__) || defined(__aarch64__) || \ - (defined(__mips__) && ((!defined(__LP64__) && __mips_isa_rev < 6) || defined(__LP64__))))) - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - uint16_t* dst = reinterpret_cast(cb->data) + (x+(cb->stride*y)); - - surface_t* tex = &(c->state.texture[0].surface); - const int32_t u = (c->state.texture[0].shade.is0>>16) + x; - const int32_t v = (c->state.texture[0].shade.it0>>16) + y; - uint32_t *src = reinterpret_cast(tex->data)+(u+(tex->stride*v)); - -#ifdef __arm__ - scanline_t32cb16blend_arm(dst, src, ct); -#elif defined(__aarch64__) - scanline_t32cb16blend_arm64(dst, src, ct); -#elif defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6 - scanline_t32cb16blend_mips(dst, src, ct); -#elif defined(__mips__) && defined(__LP64__) - scanline_t32cb16blend_mips64(dst, src, ct); -#endif -#else - dst_iterator16 di(c); - horz_iterator32 hi(c); - blender_32to16 bl(c); - while (di.count--) { - uint32_t s = hi.get_pixel32(); - bl.write(s, di.dst); - di.dst++; - } -#endif -} - -void scanline_t32cb16blend_srca(context_t* c) -{ - dst_iterator16 di(c); - horz_iterator32 hi(c); - blender_32to16_srcA blender(c); - - while (di.count--) { - uint32_t s = hi.get_pixel32(); - blender.write(s,di.dst); - di.dst++; - } -} - -void scanline_t16cb16blend_clamp_mod(context_t* c) -{ - const int a = c->iterators.ydady >> (GGL_COLOR_BITS-8); - if (a == 0) { - return; - } - - if (a == 255) { - scanline_t16cb16_clamp(c); - return; - } - - dst_iterator16 di(c); - blender_16to16_modulate blender(c); - clamp_iterator ci(c); - - while (di.count--) { - uint16_t s = ci.get_pixel16(); - blender.write(s, di.dst); - di.dst++; - } -} - -void scanline_memcpy(context_t* c) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - const GGLFormat* fp = &(c->formats[cb->format]); - uint8_t* dst = reinterpret_cast(cb->data) + - (x + (cb->stride * y)) * fp->size; - - surface_t* tex = &(c->state.texture[0].surface); - const int32_t u = (c->state.texture[0].shade.is0>>16) + x; - const int32_t v = (c->state.texture[0].shade.it0>>16) + y; - uint8_t *src = reinterpret_cast(tex->data) + - (u + (tex->stride * v)) * fp->size; - - const size_t size = ct * fp->size; - memcpy(dst, src, size); -} - -void scanline_memset8(context_t* c) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - uint8_t* dst = reinterpret_cast(cb->data) + (x+(cb->stride*y)); - uint32_t packed = c->packed; - memset(dst, packed, ct); -} - -void scanline_memset16(context_t* c) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - uint16_t* dst = reinterpret_cast(cb->data) + (x+(cb->stride*y)); - uint32_t packed = c->packed; - android_memset16(dst, packed, ct*2); -} - -void scanline_memset32(context_t* c) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - uint32_t* dst = reinterpret_cast(cb->data) + (x+(cb->stride*y)); - uint32_t packed = GGL_HOST_TO_RGBA(c->packed); - android_memset32(dst, packed, ct*4); -} - -void scanline_clear(context_t* c) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - const GGLFormat* fp = &(c->formats[cb->format]); - uint8_t* dst = reinterpret_cast(cb->data) + - (x + (cb->stride * y)) * fp->size; - const size_t size = ct * fp->size; - memset(dst, 0, size); -} - -void scanline_set(context_t* c) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - const GGLFormat* fp = &(c->formats[cb->format]); - uint8_t* dst = reinterpret_cast(cb->data) + - (x + (cb->stride * y)) * fp->size; - const size_t size = ct * fp->size; - memset(dst, 0xFF, size); -} - -void scanline_noop(context_t* /*c*/) -{ -} - -void rect_generic(context_t* c, size_t yc) -{ - do { - c->scanline(c); - c->step_y(c); - } while (--yc); -} - -void rect_memcpy(context_t* c, size_t yc) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - const GGLFormat* fp = &(c->formats[cb->format]); - uint8_t* dst = reinterpret_cast(cb->data) + - (x + (cb->stride * y)) * fp->size; - - surface_t* tex = &(c->state.texture[0].surface); - const int32_t u = (c->state.texture[0].shade.is0>>16) + x; - const int32_t v = (c->state.texture[0].shade.it0>>16) + y; - uint8_t *src = reinterpret_cast(tex->data) + - (u + (tex->stride * v)) * fp->size; - - if (cb->stride == tex->stride && ct == size_t(cb->stride)) { - memcpy(dst, src, ct * fp->size * yc); - } else { - const size_t size = ct * fp->size; - const size_t dbpr = cb->stride * fp->size; - const size_t sbpr = tex->stride * fp->size; - do { - memcpy(dst, src, size); - dst += dbpr; - src += sbpr; - } while (--yc); - } -} -// ---------------------------------------------------------------------------- -}; // namespace android - diff --git a/libpixelflinger/scanline.h b/libpixelflinger/scanline.h deleted file mode 100644 index b6f4d3746..000000000 --- a/libpixelflinger/scanline.h +++ /dev/null @@ -1,32 +0,0 @@ -/* libs/pixelflinger/scanline.h -** -** Copyright 2006, 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_SCANLINE_H -#define ANDROID_SCANLINE_H - -#include - -namespace android { - -void ggl_init_scanline(context_t* c); -void ggl_uninit_scanline(context_t* c); -void ggl_pick_scanline(context_t* c); - -}; // namespace android - -#endif diff --git a/libpixelflinger/t32cb16blend.S b/libpixelflinger/t32cb16blend.S deleted file mode 100644 index 5e4995a20..000000000 --- a/libpixelflinger/t32cb16blend.S +++ /dev/null @@ -1,203 +0,0 @@ -/* libs/pixelflinger/t32cb16blend.S -** -** Copyright 2006, 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. -*/ - - - .text - .syntax unified - .balign 4 - - .global scanline_t32cb16blend_arm - - -/* - * .macro pixel - * - * \DREG is a 32-bit register containing *two* original destination RGB565 - * pixels, with the even one in the low-16 bits, and the odd one in the - * high 16 bits. - * - * \SRC is a 32-bit 0xAABBGGRR pixel value, with pre-multiplied colors. - * - * \FB is a target register that will contain the blended pixel values. - * - * \ODD is either 0 or 1 and indicates if we're blending the lower or - * upper 16-bit pixels in DREG into FB - * - * - * clobbered: r6, r7, lr - * - */ - -.macro pixel, DREG, SRC, FB, ODD - - // SRC = 0xAABBGGRR - mov r7, \SRC, lsr #24 // sA - add r7, r7, r7, lsr #7 // sA + (sA >> 7) - rsb r7, r7, #0x100 // sA = 0x100 - (sA+(sA>>7)) - -1: - -.if \ODD - - // red - mov lr, \DREG, lsr #(16 + 11) - smulbb lr, r7, lr - mov r6, \SRC, lsr #3 - and r6, r6, #0x1F - add lr, r6, lr, lsr #8 - cmp lr, #0x1F - orrhs \FB, \FB, #(0x1F<<(16 + 11)) - orrlo \FB, \FB, lr, lsl #(16 + 11) - - // green - and r6, \DREG, #(0x3F<<(16 + 5)) - smulbt r6, r7, r6 - mov lr, \SRC, lsr #(8+2) - and lr, lr, #0x3F - add r6, lr, r6, lsr #(5+8) - cmp r6, #0x3F - orrhs \FB, \FB, #(0x3F<<(16 + 5)) - orrlo \FB, \FB, r6, lsl #(16 + 5) - - // blue - and lr, \DREG, #(0x1F << 16) - smulbt lr, r7, lr - mov r6, \SRC, lsr #(8+8+3) - and r6, r6, #0x1F - add lr, r6, lr, lsr #8 - cmp lr, #0x1F - orrhs \FB, \FB, #(0x1F << 16) - orrlo \FB, \FB, lr, lsl #16 - -.else - - // red - mov lr, \DREG, lsr #11 - and lr, lr, #0x1F - smulbb lr, r7, lr - mov r6, \SRC, lsr #3 - and r6, r6, #0x1F - add lr, r6, lr, lsr #8 - cmp lr, #0x1F - movhs \FB, #(0x1F<<11) - movlo \FB, lr, lsl #11 - - - // green - and r6, \DREG, #(0x3F<<5) - smulbb r6, r7, r6 - mov lr, \SRC, lsr #(8+2) - and lr, lr, #0x3F - add r6, lr, r6, lsr #(5+8) - cmp r6, #0x3F - orrhs \FB, \FB, #(0x3F<<5) - orrlo \FB, \FB, r6, lsl #5 - - // blue - and lr, \DREG, #0x1F - smulbb lr, r7, lr - mov r6, \SRC, lsr #(8+8+3) - and r6, r6, #0x1F - add lr, r6, lr, lsr #8 - cmp lr, #0x1F - orrhs \FB, \FB, #0x1F - orrlo \FB, \FB, lr - -.endif - - .endm - - -// r0: dst ptr -// r1: src ptr -// r2: count -// r3: d -// r4: s0 -// r5: s1 -// r6: pixel -// r7: pixel -// r8: free -// r9: free -// r10: free -// r11: free -// r12: scratch -// r14: pixel - -scanline_t32cb16blend_arm: - stmfd sp!, {r4-r7, lr} - - pld [r0] - pld [r1] - - // align DST to 32 bits - tst r0, #0x3 - beq aligned - subs r2, r2, #1 - ldmfdlo sp!, {r4-r7, lr} // return - bxlo lr - -last: - ldr r4, [r1], #4 - ldrh r3, [r0] - pixel r3, r4, r12, 0 - strh r12, [r0], #2 - -aligned: - subs r2, r2, #2 - blo 9f - - // The main loop is unrolled twice and processes 4 pixels -8: ldmia r1!, {r4, r5} - // stream the source - pld [r1, #32] - add r0, r0, #4 - // it's all zero, skip this pixel - orrs r3, r4, r5 - beq 7f - - // load the destination - ldr r3, [r0, #-4] - // stream the destination - pld [r0, #32] - pixel r3, r4, r12, 0 - pixel r3, r5, r12, 1 - // effectively, we're getting write-combining by virtue of the - // cpu's write-back cache. - str r12, [r0, #-4] - - // 2nd iterration of the loop, don't stream anything - subs r2, r2, #2 - movlt r4, r5 - blt 9f - ldmia r1!, {r4, r5} - add r0, r0, #4 - orrs r3, r4, r5 - beq 7f - ldr r3, [r0, #-4] - pixel r3, r4, r12, 0 - pixel r3, r5, r12, 16 - str r12, [r0, #-4] - - -7: subs r2, r2, #2 - bhs 8b - mov r4, r5 - -9: adds r2, r2, #1 - ldmfdlo sp!, {r4-r7, lr} // return - bxlo lr - b last diff --git a/libpixelflinger/tests/Android.bp b/libpixelflinger/tests/Android.bp deleted file mode 100644 index e20dd931a..000000000 --- a/libpixelflinger/tests/Android.bp +++ /dev/null @@ -1,17 +0,0 @@ -cc_defaults { - name: "pixelflinger-tests", - - cflags: [ - "-Wall", - "-Werror", - ], - - header_libs: ["libpixelflinger_internal"], - static_libs: [ - "libbase", - "libcutils", - "liblog", - "libpixelflinger", - "libutils", - ], -} diff --git a/libpixelflinger/tests/arch-arm64/Android.bp b/libpixelflinger/tests/arch-arm64/Android.bp deleted file mode 100644 index 2f5586aa9..000000000 --- a/libpixelflinger/tests/arch-arm64/Android.bp +++ /dev/null @@ -1,11 +0,0 @@ -cc_defaults { - name: "pixelflinger-tests-arm64", - defaults: ["pixelflinger-tests"], - - enabled: false, - arch: { - arm64: { - enabled: true, - }, - }, -} diff --git a/libpixelflinger/tests/arch-arm64/assembler/Android.bp b/libpixelflinger/tests/arch-arm64/assembler/Android.bp deleted file mode 100644 index 003f48576..000000000 --- a/libpixelflinger/tests/arch-arm64/assembler/Android.bp +++ /dev/null @@ -1,9 +0,0 @@ -cc_test { - name: "test-pixelflinger-arm64-assembler-test", - defaults: ["pixelflinger-tests-arm64"], - - srcs: [ - "arm64_assembler_test.cpp", - "asm_test_jacket.S", - ], -} diff --git a/libpixelflinger/tests/arch-arm64/assembler/arm64_assembler_test.cpp b/libpixelflinger/tests/arch-arm64/assembler/arm64_assembler_test.cpp deleted file mode 100644 index 63642c4b1..000000000 --- a/libpixelflinger/tests/arch-arm64/assembler/arm64_assembler_test.cpp +++ /dev/null @@ -1,782 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include -#include - -#define __STDC_FORMAT_MACROS -#include - -#include "codeflinger/ARMAssemblerInterface.h" -#include "codeflinger/Arm64Assembler.h" -using namespace android; - -#define TESTS_DATAOP_ENABLE 1 -#define TESTS_DATATRANSFER_ENABLE 1 -#define TESTS_LDMSTM_ENABLE 1 -#define TESTS_REG_CORRUPTION_ENABLE 0 - -void *instrMem; -uint32_t instrMemSize = 128 * 1024; -char dataMem[8192]; - -typedef void (*asm_function_t)(); -extern "C" void asm_test_jacket(asm_function_t function, - int64_t regs[], int32_t flags[]); - -#define MAX_32BIT (uint32_t)(((uint64_t)1 << 32) - 1) -const uint32_t NA = 0; -const uint32_t NUM_REGS = 32; -const uint32_t NUM_FLAGS = 16; - -enum instr_t -{ - INSTR_ADD, - INSTR_SUB, - INSTR_AND, - INSTR_ORR, - INSTR_RSB, - INSTR_BIC, - INSTR_CMP, - INSTR_MOV, - INSTR_MVN, - INSTR_MUL, - INSTR_MLA, - INSTR_SMULBB, - INSTR_SMULBT, - INSTR_SMULTB, - INSTR_SMULTT, - INSTR_SMULWB, - INSTR_SMULWT, - INSTR_SMLABB, - INSTR_UXTB16, - INSTR_UBFX, - INSTR_ADDR_ADD, - INSTR_ADDR_SUB, - INSTR_LDR, - INSTR_LDRB, - INSTR_LDRH, - INSTR_ADDR_LDR, - INSTR_LDM, - INSTR_STR, - INSTR_STRB, - INSTR_STRH, - INSTR_ADDR_STR, - INSTR_STM -}; - -enum shift_t -{ - SHIFT_LSL, - SHIFT_LSR, - SHIFT_ASR, - SHIFT_ROR, - SHIFT_NONE -}; - -enum offset_t -{ - REG_SCALE_OFFSET, - REG_OFFSET, - IMM8_OFFSET, - IMM12_OFFSET, - NO_OFFSET -}; - -enum cond_t -{ - EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL, NV, - HS = CS, - LO = CC -}; - -const char * cc_code[] = -{ - "EQ", "NE", "CS", "CC", "MI", "PL", "VS", "VC", - "HI", "LS","GE","LT", "GT", "LE", "AL", "NV" -}; - - -struct dataOpTest_t -{ - uint32_t id; - instr_t op; - uint32_t preFlag; - cond_t cond; - bool setFlags; - uint64_t RnValue; - uint64_t RsValue; - bool immediate; - uint32_t immValue; - uint64_t RmValue; - uint32_t shiftMode; - uint32_t shiftAmount; - uint64_t RdValue; - bool checkRd; - uint64_t postRdValue; - bool checkFlag; - uint32_t postFlag; -}; - -struct dataTransferTest_t -{ - uint32_t id; - instr_t op; - uint32_t preFlag; - cond_t cond; - bool setMem; - uint64_t memOffset; - uint64_t memValue; - uint64_t RnValue; - offset_t offsetType; - uint64_t RmValue; - uint32_t immValue; - bool writeBack; - bool preIndex; - bool postIndex; - uint64_t RdValue; - uint64_t postRdValue; - uint64_t postRnValue; - bool checkMem; - uint64_t postMemOffset; - uint32_t postMemLength; - uint64_t postMemValue; -}; - - -dataOpTest_t dataOpTests [] = -{ - {0xA000,INSTR_ADD,AL,AL,0,1,NA,1,MAX_32BIT ,NA,NA,NA,NA,1,0,0,0}, - {0xA001,INSTR_ADD,AL,AL,0,1,NA,1,MAX_32BIT -1,NA,NA,NA,NA,1,MAX_32BIT,0,0}, - {0xA002,INSTR_ADD,AL,AL,0,1,NA,0,NA,MAX_32BIT ,NA,NA,NA,1,0,0,0}, - {0xA003,INSTR_ADD,AL,AL,0,1,NA,0,NA,MAX_32BIT -1,NA,NA,NA,1,MAX_32BIT,0,0}, - {0xA004,INSTR_ADD,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_LSL,0,NA,1,0,0,0}, - {0xA005,INSTR_ADD,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_LSL,31,NA,1,0x80000001,0,0}, - {0xA006,INSTR_ADD,AL,AL,0,1,NA,0,0,3,SHIFT_LSR,1,NA,1,2,0,0}, - {0xA007,INSTR_ADD,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_LSR,31,NA,1,2,0,0}, - {0xA008,INSTR_ADD,AL,AL,0,0,NA,0,0,3,SHIFT_ASR,1,NA,1,1,0,0}, - {0xA009,INSTR_ADD,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_ASR,31,NA,1,0,0,0}, - {0xA010,INSTR_AND,AL,AL,0,1,NA,1,MAX_32BIT ,0,0,0,NA,1,1,0,0}, - {0xA011,INSTR_AND,AL,AL,0,1,NA,1,MAX_32BIT -1,0,0,0,NA,1,0,0,0}, - {0xA012,INSTR_AND,AL,AL,0,1,NA,0,0,MAX_32BIT ,0,0,NA,1,1,0,0}, - {0xA013,INSTR_AND,AL,AL,0,1,NA,0,0,MAX_32BIT -1,0,0,NA,1,0,0,0}, - {0xA014,INSTR_AND,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_LSL,0,NA,1,1,0,0}, - {0xA015,INSTR_AND,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_LSL,31,NA,1,0,0,0}, - {0xA016,INSTR_AND,AL,AL,0,1,NA,0,0,3,SHIFT_LSR,1,NA,1,1,0,0}, - {0xA017,INSTR_AND,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_LSR,31,NA,1,1,0,0}, - {0xA018,INSTR_AND,AL,AL,0,0,NA,0,0,3,SHIFT_ASR,1,NA,1,0,0,0}, - {0xA019,INSTR_AND,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_ASR,31,NA,1,1,0,0}, - {0xA020,INSTR_ORR,AL,AL,0,3,NA,1,MAX_32BIT ,0,0,0,NA,1,MAX_32BIT,0,0}, - {0xA021,INSTR_ORR,AL,AL,0,2,NA,1,MAX_32BIT -1,0,0,0,NA,1,MAX_32BIT-1,0,0}, - {0xA022,INSTR_ORR,AL,AL,0,3,NA,0,0,MAX_32BIT ,0,0,NA,1,MAX_32BIT,0,0}, - {0xA023,INSTR_ORR,AL,AL,0,2,NA,0,0,MAX_32BIT -1,0,0,NA,1,MAX_32BIT-1,0,0}, - {0xA024,INSTR_ORR,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_LSL,0,NA,1,MAX_32BIT,0,0}, - {0xA025,INSTR_ORR,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_LSL,31,NA,1,0x80000001,0,0}, - {0xA026,INSTR_ORR,AL,AL,0,1,NA,0,0,3,SHIFT_LSR,1,NA,1,1,0,0}, - {0xA027,INSTR_ORR,AL,AL,0,0,NA,0,0,MAX_32BIT ,SHIFT_LSR,31,NA,1,1,0,0}, - {0xA028,INSTR_ORR,AL,AL,0,0,NA,0,0,3,SHIFT_ASR,1,NA,1,1,0,0}, - {0xA029,INSTR_ORR,AL,AL,0,1,NA,0,0,MAX_32BIT ,SHIFT_ASR,31,NA,1,MAX_32BIT ,0,0}, - {0xA030,INSTR_CMP,AL,AL,1,0x10000,NA,1,0x10000,0,0,0,NA,0,0,1,HS}, - {0xA031,INSTR_CMP,AL,AL,1,0x00000,NA,1,0x10000,0,0,0,NA,0,0,1,CC}, - {0xA032,INSTR_CMP,AL,AL,1,0x00000,NA,0,0,0x10000,0,0,NA,0,0,1,LT}, - {0xA033,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x10000,0,0,NA,0,0,1,EQ}, - {0xA034,INSTR_CMP,AL,AL,1,0x00000,NA,0,0,0x10000,0,0,NA,0,0,1,LS}, - {0xA035,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x10000,0,0,NA,0,0,1,LS}, - {0xA036,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x00000,0,0,NA,0,0,1,HI}, - {0xA037,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x10000,0,0,NA,0,0,1,HS}, - {0xA038,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x00000,0,0,NA,0,0,1,HS}, - {0xA039,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x00000,0,0,NA,0,0,1,NE}, - {0xA040,INSTR_CMP,AL,AL,1,0,NA,0,0,MAX_32BIT ,SHIFT_LSR,1,NA,0,0,1,LT}, - {0xA041,INSTR_CMP,AL,AL,1,1,NA,0,0,MAX_32BIT ,SHIFT_LSR,31,NA,0,0,1,EQ}, - {0xA042,INSTR_CMP,AL,AL,1,0,NA,0,0,0x10000,SHIFT_LSR,31,NA,0,0,1,LS}, - {0xA043,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x30000,SHIFT_LSR,1,NA,0,0,1,LS}, - {0xA044,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x00000,SHIFT_LSR,31,NA,0,0,1,HI}, - {0xA045,INSTR_CMP,AL,AL,1,1,NA,0,0,MAX_32BIT ,SHIFT_LSR,31,NA,0,0,1,HS}, - {0xA046,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x2000,SHIFT_LSR,1,NA,0,0,1,HS}, - {0xA047,INSTR_CMP,AL,AL,1,0,NA,0,0,MAX_32BIT ,SHIFT_LSR,1,NA,0,0,1,NE}, - {0xA048,INSTR_CMP,AL,AL,1,0,NA,0,0,0x10000,SHIFT_ASR,2,NA,0,0,1,LT}, - {0xA049,INSTR_CMP,AL,AL,1,MAX_32BIT ,NA,0,0,MAX_32BIT ,SHIFT_ASR,1,NA,0,0,1,EQ}, - {0xA050,INSTR_CMP,AL,AL,1,MAX_32BIT ,NA,0,0,MAX_32BIT ,SHIFT_ASR,31,NA,0,0,1,LS}, - {0xA051,INSTR_CMP,AL,AL,1,0,NA,0,0,0x10000,SHIFT_ASR,1,NA,0,0,1,LS}, - {0xA052,INSTR_CMP,AL,AL,1,0x10000,NA,0,0,0x10000,SHIFT_ASR,1,NA,0,0,1,HI}, - {0xA053,INSTR_CMP,AL,AL,1,1,NA,0,0,0x10000,SHIFT_ASR,31,NA,0,0,1,HS}, - {0xA054,INSTR_CMP,AL,AL,1,1,NA,0,0,0x10000,SHIFT_ASR,16,NA,0,0,1,HS}, - {0xA055,INSTR_CMP,AL,AL,1,1,NA,0,0,MAX_32BIT ,SHIFT_ASR,1,NA,0,0,1,NE}, - {0xA056,INSTR_MUL,AL,AL,0,0,0x10000,0,0,0x10000,0,0,NA,1,0,0,0}, - {0xA057,INSTR_MUL,AL,AL,0,0,0x1000,0,0,0x10000,0,0,NA,1,0x10000000,0,0}, - {0xA058,INSTR_MUL,AL,AL,0,0,MAX_32BIT ,0,0,1,0,0,NA,1,MAX_32BIT ,0,0}, - {0xA059,INSTR_MLA,AL,AL,0,0x10000,0x10000,0,0,0x10000,0,0,NA,1,0x10000,0,0}, - {0xA060,INSTR_MLA,AL,AL,0,0x10000,0x1000,0,0,0x10000,0,0,NA,1,0x10010000,0,0}, - {0xA061,INSTR_MLA,AL,AL,1,1,MAX_32BIT ,0,0,1,0,0,NA,1,0,1,PL}, - {0xA062,INSTR_MLA,AL,AL,1,0,MAX_32BIT ,0,0,1,0,0,NA,1,MAX_32BIT ,1,MI}, - {0xA063,INSTR_SUB,AL,AL,1,1 << 16,NA,1,1 << 16,NA,NA,NA,NA,1,0,1,PL}, - {0xA064,INSTR_SUB,AL,AL,1,(1 << 16) + 1,NA,1,1 << 16,NA,NA,NA,NA,1,1,1,PL}, - {0xA065,INSTR_SUB,AL,AL,1,0,NA,1,1 << 16,NA,NA,NA,NA,1,(uint32_t)(0 - (1<<16)),1,MI}, - {0xA066,INSTR_SUB,MI,MI,0,2,NA,0,NA,1,NA,NA,2,1,1,0,NA}, - {0xA067,INSTR_SUB,EQ,MI,0,2,NA,0,NA,1,NA,NA,2,1,2,0,NA}, - {0xA068,INSTR_SUB,GT,GE,0,2,NA,1,1,NA,NA,NA,2,1,1,0,NA}, - {0xA069,INSTR_SUB,LT,GE,0,2,NA,1,1,NA,NA,NA,2,1,2,0,NA}, - {0xA070,INSTR_SUB,CS,HS,0,2,NA,1,1,NA,NA,NA,2,1,1,0,NA}, - {0xA071,INSTR_SUB,CC,HS,0,2,NA,1,1,NA,NA,NA,2,1,2,0,NA}, - {0xA072,INSTR_SUB,AL,AL,0,1,NA,1,1 << 16,0,0,0,NA,1,(uint32_t)(1 - (1 << 16)),0,NA}, - {0xA073,INSTR_SUB,AL,AL,0,MAX_32BIT,NA,1,1,0,0,0,NA,1,MAX_32BIT - 1,0,NA}, - {0xA074,INSTR_SUB,AL,AL,0,1,NA,1,1,0,0,0,NA,1,0,0,NA}, - {0xA075,INSTR_SUB,AL,AL,0,1,NA,0,NA,1 << 16,0,0,NA,1,(uint32_t)(1 - (1 << 16)),0,NA}, - {0xA076,INSTR_SUB,AL,AL,0,MAX_32BIT,NA,0,NA,1,0,0,NA,1,MAX_32BIT - 1,0,NA}, - {0xA077,INSTR_SUB,AL,AL,0,1,NA,0,NA,1,0,0,NA,1,0,0,NA}, - {0xA078,INSTR_SUB,AL,AL,0,1,NA,0,NA,1,SHIFT_LSL,16,NA,1,(uint32_t)(1 - (1 << 16)),0,NA}, - {0xA079,INSTR_SUB,AL,AL,0,0x80000001,NA,0,NA,MAX_32BIT ,SHIFT_LSL,31,NA,1,1,0,NA}, - {0xA080,INSTR_SUB,AL,AL,0,1,NA,0,NA,3,SHIFT_LSR,1,NA,1,0,0,NA}, - {0xA081,INSTR_SUB,AL,AL,0,1,NA,0,NA,MAX_32BIT ,SHIFT_LSR,31,NA,1,0,0,NA}, - {0xA082,INSTR_RSB,GT,GE,0,2,NA,1,0,NA,NA,NA,2,1,(uint32_t)-2,0,NA}, - {0xA083,INSTR_RSB,LT,GE,0,2,NA,1,0,NA,NA,NA,2,1,2,0,NA}, - {0xA084,INSTR_RSB,AL,AL,0,1,NA,1,1 << 16,NA,NA,NA,NA,1,(1 << 16) - 1,0,NA}, - {0xA085,INSTR_RSB,AL,AL,0,MAX_32BIT,NA,1,1,NA,NA,NA,NA,1,(uint32_t) (1 - MAX_32BIT),0,NA}, - {0xA086,INSTR_RSB,AL,AL,0,1,NA,1,1,NA,NA,NA,NA,1,0,0,NA}, - {0xA087,INSTR_RSB,AL,AL,0,1,NA,0,NA,1 << 16,0,0,NA,1,(1 << 16) - 1,0,NA}, - {0xA088,INSTR_RSB,AL,AL,0,MAX_32BIT,NA,0,NA,1,0,0,NA,1,(uint32_t) (1 - MAX_32BIT),0,NA}, - {0xA089,INSTR_RSB,AL,AL,0,1,NA,0,NA,1,0,0,NA,1,0,0,NA}, - {0xA090,INSTR_RSB,AL,AL,0,1,NA,0,NA,1,SHIFT_LSL,16,NA,1,(1 << 16) - 1,0,NA}, - {0xA091,INSTR_RSB,AL,AL,0,0x80000001,NA,0,NA,MAX_32BIT ,SHIFT_LSL,31,NA,1,(uint32_t)-1,0,NA}, - {0xA092,INSTR_RSB,AL,AL,0,1,NA,0,NA,3,SHIFT_LSR,1,NA,1,0,0,NA}, - {0xA093,INSTR_RSB,AL,AL,0,1,NA,0,NA,MAX_32BIT ,SHIFT_LSR,31,NA,1,0,0,NA}, - {0xA094,INSTR_MOV,AL,AL,0,NA,NA,1,0x80000001,NA,NA,NA,NA,1,0x80000001,0,0}, - {0xA095,INSTR_MOV,AL,AL,0,NA,NA,0,0,0x80000001,0,0,NA,1,0x80000001,0,0}, - {0xA096,INSTR_MOV,AL,AL,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,1,NA,1,MAX_32BIT -1,0,0}, - {0xA097,INSTR_MOV,AL,AL,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,31,NA,1,0x80000000,0,0}, - {0xA098,INSTR_MOV,AL,AL,0,NA,NA,0,0,3,SHIFT_LSR,1,NA,1,1,0,0}, - {0xA099,INSTR_MOV,AL,AL,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSR,31,NA,1,1,0,0}, - {0xA100,INSTR_MOV,AL,AL,0,NA,NA,0,0,3,SHIFT_ASR,1,NA,1,1,0,0}, - {0xA101,INSTR_MOV,AL,AL,0,NA,NA,0,0,MAX_32BIT ,SHIFT_ASR,31,NA,1,MAX_32BIT ,0,0}, - {0xA102,INSTR_MOV,AL,AL,0,NA,NA,0,0,3,SHIFT_ROR,1,NA,1,0x80000001,0,0}, - {0xA103,INSTR_MOV,AL,AL,0,NA,NA,0,0,0x80000001,SHIFT_ROR,31,NA,1,3,0,0}, - {0xA104,INSTR_MOV,AL,AL,1,NA,NA,0,0,MAX_32BIT -1,SHIFT_ASR,1,NA,1,MAX_32BIT,1,MI}, - {0xA105,INSTR_MOV,AL,AL,1,NA,NA,0,0,3,SHIFT_ASR,1,NA,1,1,1,PL}, - {0xA106,INSTR_MOV,PL,MI,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2,0,0}, - {0xA107,INSTR_MOV,MI,MI,0,NA,NA,0,0,0x80000001,0,0,2,1,0x80000001,0,0}, - {0xA108,INSTR_MOV,EQ,LT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2,0,0}, - {0xA109,INSTR_MOV,LT,LT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0x80000001,0,0}, - {0xA110,INSTR_MOV,GT,GE,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,1,2,1,MAX_32BIT -1,0,0}, - {0xA111,INSTR_MOV,EQ,GE,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,31,2,1,0x80000000,0,0}, - {0xA112,INSTR_MOV,LT,GE,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,31,2,1,2,0,0}, - {0xA113,INSTR_MOV,GT,LE,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,1,2,1,2,0,0}, - {0xA114,INSTR_MOV,EQ,LE,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0x80000001,0,0}, - {0xA115,INSTR_MOV,LT,LE,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,31,2,1,0x80000000,0,0}, - {0xA116,INSTR_MOV,EQ,GT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2,0,0}, - {0xA117,INSTR_MOV,GT,GT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0x80000001,0,0}, - {0xA118,INSTR_MOV,LE,GT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2,0,0}, - {0xA119,INSTR_MOV,EQ,GT,0,NA,NA,0,0,0x80000001,0,0,2,1,2,0,0}, - {0xA120,INSTR_MOV,GT,GT,0,NA,NA,0,0,0x80000001,0,0,2,1,0x80000001,0,0}, - {0xA121,INSTR_MOV,LE,GT,0,NA,NA,0,0,0x80000001,0,0,2,1,2,0,0}, - {0xA122,INSTR_MOV,EQ,GT,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,1,2,1,2,0,0}, - {0xA123,INSTR_MOV,GT,GT,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,1,2,1,MAX_32BIT -1,0,0}, - {0xA124,INSTR_MOV,LE,GT,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,1,2,1,2,0,0}, - {0xA125,INSTR_MOV,LO,HS,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2,0,0}, - {0xA126,INSTR_MOV,HS,HS,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0x80000001,0,0}, - {0xA127,INSTR_MVN,LO,HS,0,NA,NA,1,MAX_32BIT -1,NA,NA,NA,2,1,2,0,0}, - {0xA128,INSTR_MVN,HS,HS,0,NA,NA,1,MAX_32BIT -1,NA,NA,NA,2,1,1,0,0}, - {0xA129,INSTR_MVN,AL,AL,0,NA,NA,1,0,NA,NA,NA,2,1,MAX_32BIT,0,NA}, - {0xA130,INSTR_MVN,AL,AL,0,NA,NA,0,NA,MAX_32BIT -1,NA,0,2,1,1,0,NA}, - {0xA131,INSTR_MVN,AL,AL,0,NA,NA,0,NA,0x80000001,NA,0,2,1,0x7FFFFFFE,0,NA}, - {0xA132,INSTR_BIC,AL,AL,0,1,NA,1,MAX_32BIT ,NA,NA,NA,NA,1,0,0,0}, - {0xA133,INSTR_BIC,AL,AL,0,1,NA,1,MAX_32BIT -1,NA,NA,NA,NA,1,1,0,0}, - {0xA134,INSTR_BIC,AL,AL,0,1,NA,0,0,MAX_32BIT ,0,0,NA,1,0,0,0}, - {0xA135,INSTR_BIC,AL,AL,0,1,NA,0,0,MAX_32BIT -1,0,0,NA,1,1,0,0}, - {0xA136,INSTR_BIC,AL,AL,0,0xF0,NA,0,0,3,SHIFT_ASR,1,NA,1,0xF0,0,0}, - {0xA137,INSTR_BIC,AL,AL,0,0xF0,NA,0,0,MAX_32BIT ,SHIFT_ASR,31,NA,1,0,0,0}, - {0xA138,INSTR_SMULBB,AL,AL,0,NA,0xABCDFFFF,0,NA,0xABCD0001,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA139,INSTR_SMULBB,AL,AL,0,NA,0xABCD0001,0,NA,0xABCD0FFF,NA,NA,NA,1,0x00000FFF,0,0}, - {0xA140,INSTR_SMULBB,AL,AL,0,NA,0xABCD0001,0,NA,0xABCDFFFF,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA141,INSTR_SMULBB,AL,AL,0,NA,0xABCDFFFF,0,NA,0xABCDFFFF,NA,NA,NA,1,1,0,0}, - {0xA142,INSTR_SMULBT,AL,AL,0,NA,0xFFFFABCD,0,NA,0xABCD0001,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA143,INSTR_SMULBT,AL,AL,0,NA,0x0001ABCD,0,NA,0xABCD0FFF,NA,NA,NA,1,0x00000FFF,0,0}, - {0xA144,INSTR_SMULBT,AL,AL,0,NA,0x0001ABCD,0,NA,0xABCDFFFF,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA145,INSTR_SMULBT,AL,AL,0,NA,0xFFFFABCD,0,NA,0xABCDFFFF,NA,NA,NA,1,1,0,0}, - {0xA146,INSTR_SMULTB,AL,AL,0,NA,0xABCDFFFF,0,NA,0x0001ABCD,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA147,INSTR_SMULTB,AL,AL,0,NA,0xABCD0001,0,NA,0x0FFFABCD,NA,NA,NA,1,0x00000FFF,0,0}, - {0xA148,INSTR_SMULTB,AL,AL,0,NA,0xABCD0001,0,NA,0xFFFFABCD,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA149,INSTR_SMULTB,AL,AL,0,NA,0xABCDFFFF,0,NA,0xFFFFABCD,NA,NA,NA,1,1,0,0}, - {0xA150,INSTR_SMULTT,AL,AL,0,NA,0xFFFFABCD,0,NA,0x0001ABCD,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA151,INSTR_SMULTT,AL,AL,0,NA,0x0001ABCD,0,NA,0x0FFFABCD,NA,NA,NA,1,0x00000FFF,0,0}, - {0xA152,INSTR_SMULTT,AL,AL,0,NA,0x0001ABCD,0,NA,0xFFFFABCD,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA153,INSTR_SMULTT,AL,AL,0,NA,0xFFFFABCD,0,NA,0xFFFFABCD,NA,NA,NA,1,1,0,0}, - {0xA154,INSTR_SMULWB,AL,AL,0,NA,0xABCDFFFF,0,NA,0x0001ABCD,NA,NA,NA,1,0xFFFFFFFE,0,0}, - {0xA155,INSTR_SMULWB,AL,AL,0,NA,0xABCD0001,0,NA,0x0FFFABCD,NA,NA,NA,1,0x00000FFF,0,0}, - {0xA156,INSTR_SMULWB,AL,AL,0,NA,0xABCD0001,0,NA,0xFFFFABCD,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA157,INSTR_SMULWB,AL,AL,0,NA,0xABCDFFFF,0,NA,0xFFFFABCD,NA,NA,NA,1,0,0,0}, - {0xA158,INSTR_SMULWT,AL,AL,0,NA,0xFFFFABCD,0,NA,0x0001ABCD,NA,NA,NA,1,0xFFFFFFFE,0,0}, - {0xA159,INSTR_SMULWT,AL,AL,0,NA,0x0001ABCD,0,NA,0x0FFFABCD,NA,NA,NA,1,0x00000FFF,0,0}, - {0xA160,INSTR_SMULWT,AL,AL,0,NA,0x0001ABCD,0,NA,0xFFFFABCD,NA,NA,NA,1,0xFFFFFFFF,0,0}, - {0xA161,INSTR_SMULWT,AL,AL,0,NA,0xFFFFABCD,0,NA,0xFFFFABCD,NA,NA,NA,1,0,0,0}, - {0xA162,INSTR_SMLABB,AL,AL,0,1,0xABCDFFFF,0,NA,0xABCD0001,NA,NA,NA,1,0,0,0}, - {0xA163,INSTR_SMLABB,AL,AL,0,1,0xABCD0001,0,NA,0xABCD0FFF,NA,NA,NA,1,0x00001000,0,0}, - {0xA164,INSTR_SMLABB,AL,AL,0,0xFFFFFFFF,0xABCD0001,0,NA,0xABCDFFFF,NA,NA,NA,1,0xFFFFFFFE,0,0}, - {0xA165,INSTR_SMLABB,AL,AL,0,0xFFFFFFFF,0xABCDFFFF,0,NA,0xABCDFFFF,NA,NA,NA,1,0,0,0}, - {0xA166,INSTR_UXTB16,AL,AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,0,NA,1,0x00CD0001,0,0}, - {0xA167,INSTR_UXTB16,AL,AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,1,NA,1,0x00AB00EF,0,0}, - {0xA168,INSTR_UXTB16,AL,AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,2,NA,1,0x000100CD,0,0}, - {0xA169,INSTR_UXTB16,AL,AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,3,NA,1,0x00EF00AB,0,0}, - {0xA170,INSTR_UBFX,AL,AL,0,0xABCDEF01,4,0,NA,24,NA,NA,NA,1,0x00BCDEF0,0,0}, - {0xA171,INSTR_UBFX,AL,AL,0,0xABCDEF01,1,0,NA,2,NA,NA,NA,1,0,0,0}, - {0xA172,INSTR_UBFX,AL,AL,0,0xABCDEF01,16,0,NA,8,NA,NA,NA,1,0xCD,0,0}, - {0xA173,INSTR_UBFX,AL,AL,0,0xABCDEF01,31,0,NA,1,NA,NA,NA,1,1,0,0}, - {0xA174,INSTR_ADDR_ADD,AL,AL,0,0xCFFFFFFFF,NA,0,NA,0x1,SHIFT_LSL,1,NA,1,0xD00000001,0,0}, - {0xA175,INSTR_ADDR_ADD,AL,AL,0,0x01,NA,0,NA,0x1,SHIFT_LSL,2,NA,1,0x5,0,0}, - {0xA176,INSTR_ADDR_ADD,AL,AL,0,0xCFFFFFFFF,NA,0,NA,0x1,NA,0,NA,1,0xD00000000,0,0}, - {0xA177,INSTR_ADDR_SUB,AL,AL,0,0xD00000001,NA,0,NA,0x010000,SHIFT_LSR,15,NA,1,0xCFFFFFFFF,0,0}, - {0xA178,INSTR_ADDR_SUB,AL,AL,0,0xCFFFFFFFF,NA,0,NA,0x020000,SHIFT_LSR,15,NA,1,0xCFFFFFFFB,0,0}, - {0xA179,INSTR_ADDR_SUB,AL,AL,0,3,NA,0,NA,0x010000,SHIFT_LSR,15,NA,1,1,0,0}, -}; - -dataTransferTest_t dataTransferTests [] = -{ - {0xB000,INSTR_LDR,AL,AL,1,24,0xABCDEF0123456789,0,REG_SCALE_OFFSET,24,NA,NA,NA,NA,NA,0x23456789,0,0,NA,NA,NA}, - {0xB001,INSTR_LDR,AL,AL,1,4064,0xABCDEF0123456789,0,IMM12_OFFSET,NA,4068,0,1,0,NA,0xABCDEF01,0,0,NA,NA,NA}, - {0xB002,INSTR_LDR,AL,AL,1,0,0xABCDEF0123456789,0,IMM12_OFFSET,NA,4,1,0,1,NA,0x23456789,4,0,NA,NA,NA}, - {0xB003,INSTR_LDR,AL,AL,1,0,0xABCDEF0123456789,0,NO_OFFSET,NA,NA,0,0,0,NA,0x23456789,0,0,NA,NA,NA}, - {0xB004,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,0,REG_SCALE_OFFSET,4064,NA,NA,NA,NA,NA,0x89,0,0,NA,NA,NA}, - {0xB005,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,0,IMM12_OFFSET,NA,4065,0,1,0,NA,0x67,0,0,NA,NA,NA}, - {0xB006,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,0,0,1,0,NA,0x67,4065,0,NA,NA,NA}, - {0xB007,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,1,0,1,0,NA,0x45,4065,0,NA,NA,NA}, - {0xB008,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,2,0,1,0,NA,0x23,4065,0,NA,NA,NA}, - {0xB009,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,1,1,0,1,NA,0x67,4066,0,NA,NA,NA}, - {0xB010,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,0,NO_OFFSET,NA,NA,0,0,0,NA,0x89,0,0,NA,NA,NA}, - {0xB011,INSTR_LDRH,AL,AL,1,0,0xABCDEF0123456789,0,IMM8_OFFSET,NA,2,1,0,1,NA,0x6789,2,0,NA,NA,NA}, - {0xB012,INSTR_LDRH,AL,AL,1,4064,0xABCDEF0123456789,0,REG_OFFSET,4064,0,0,1,0,NA,0x6789,0,0,NA,NA,NA}, - {0xB013,INSTR_LDRH,AL,AL,1,4064,0xABCDEF0123456789,0,REG_OFFSET,4066,0,0,1,0,NA,0x2345,0,0,NA,NA,NA}, - {0xB014,INSTR_LDRH,AL,AL,1,0,0xABCDEF0123456789,0,NO_OFFSET,NA,0,0,0,0,NA,0x6789,0,0,NA,NA,NA}, - {0xB015,INSTR_LDRH,AL,AL,1,0,0xABCDEF0123456789,2,NO_OFFSET,NA,0,0,0,0,NA,0x2345,2,0,NA,NA,NA}, - {0xB016,INSTR_ADDR_LDR,AL,AL,1,4064,0xABCDEF0123456789,0,IMM12_OFFSET,NA,4064,0,1,0,NA,0xABCDEF0123456789,0,0,NA,NA,NA}, - {0xB017,INSTR_STR,AL,AL,1,2,0xDEADBEEFDEADBEEF,4,IMM12_OFFSET,NA,4,1,0,1,0xABCDEF0123456789,0xABCDEF0123456789,8,1,2,8,0xDEAD23456789BEEF}, - {0xB018,INSTR_STR,AL,AL,1,2,0xDEADBEEFDEADBEEF,4,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4,1,2,8,0xDEAD23456789BEEF}, - {0xB019,INSTR_STR,AL,AL,1,4066,0xDEADBEEFDEADBEEF,4,IMM12_OFFSET,NA,4064,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,4,1,4066,8,0xDEAD23456789BEEF}, - {0xB020,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,0,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEFDEAD89EF}, - {0xB021,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,1,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEFDE89BEEF}, - {0xB022,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,2,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEF89ADBEEF}, - {0xB023,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,4,1,0,1,0xABCDEF0123456789,0xABCDEF0123456789,5,1,0,8,0xDEADBEEFDEAD89EF}, - {0xB024,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEFDEAD89EF}, - {0xB025,INSTR_STRH,AL,AL,1,4066,0xDEADBEEFDEADBEEF,4070,IMM12_OFFSET,NA,2,1,0,1,0xABCDEF0123456789,0xABCDEF0123456789,4072,1,4066,8,0xDEAD6789DEADBEEF}, - {0xB026,INSTR_STRH,AL,AL,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEAD6789DEADBEEF}, - {0xB027,INSTR_STRH,EQ,NE,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEADBEEFDEADBEEF}, - {0xB028,INSTR_STRH,NE,NE,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEAD6789DEADBEEF}, - {0xB029,INSTR_STRH,NE,EQ,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEADBEEFDEADBEEF}, - {0xB030,INSTR_STRH,EQ,EQ,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEAD6789DEADBEEF}, - {0xB031,INSTR_STRH,HI,LS,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEADBEEFDEADBEEF}, - {0xB032,INSTR_STRH,LS,LS,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEAD6789DEADBEEF}, - {0xB033,INSTR_STRH,LS,HI,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEADBEEFDEADBEEF}, - {0xB034,INSTR_STRH,HI,HI,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEAD6789DEADBEEF}, - {0xB035,INSTR_STRH,CC,HS,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEADBEEFDEADBEEF}, - {0xB036,INSTR_STRH,CS,HS,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEAD6789DEADBEEF}, - {0xB037,INSTR_STRH,GE,LT,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEADBEEFDEADBEEF}, - {0xB038,INSTR_STRH,LT,LT,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEAD6789DEADBEEF}, - {0xB039,INSTR_ADDR_STR,AL,AL,1,4064,0xDEADBEEFDEADBEEF,4,IMM12_OFFSET,NA,4060,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,4,1,4064,8,0xABCDEF0123456789}, -}; - - -void flushcache() -{ - const long base = long(instrMem); - const long curr = base + long(instrMemSize); - __builtin___clear_cache((char*)base, (char*)curr); -} -void dataOpTest(dataOpTest_t test, ARMAssemblerInterface *a64asm, uint32_t Rd = 0, - uint32_t Rn = 1, uint32_t Rm = 2, uint32_t Rs = 3) -{ - int64_t regs[NUM_REGS] = {0}; - int32_t flags[NUM_FLAGS] = {0}; - int64_t savedRegs[NUM_REGS] = {0}; - uint32_t i; - uint32_t op2; - - for(i = 0; i < NUM_REGS; ++i) - { - regs[i] = i; - } - - regs[Rd] = test.RdValue; - regs[Rn] = test.RnValue; - regs[Rs] = test.RsValue; - flags[test.preFlag] = 1; - a64asm->reset(); - a64asm->prolog(); - if(test.immediate == true) - { - op2 = a64asm->imm(test.immValue); - } - else if(test.immediate == false && test.shiftAmount == 0) - { - op2 = Rm; - regs[Rm] = test.RmValue; - } - else - { - op2 = a64asm->reg_imm(Rm, test.shiftMode, test.shiftAmount); - regs[Rm] = test.RmValue; - } - switch(test.op) - { - case INSTR_ADD: a64asm->ADD(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_SUB: a64asm->SUB(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_RSB: a64asm->RSB(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_AND: a64asm->AND(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_ORR: a64asm->ORR(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_BIC: a64asm->BIC(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_MUL: a64asm->MUL(test.cond, test.setFlags, Rd,Rm,Rs); break; - case INSTR_MLA: a64asm->MLA(test.cond, test.setFlags, Rd,Rm,Rs,Rn); break; - case INSTR_CMP: a64asm->CMP(test.cond, Rn,op2); break; - case INSTR_MOV: a64asm->MOV(test.cond, test.setFlags,Rd,op2); break; - case INSTR_MVN: a64asm->MVN(test.cond, test.setFlags,Rd,op2); break; - case INSTR_SMULBB:a64asm->SMULBB(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULBT:a64asm->SMULBT(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULTB:a64asm->SMULTB(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULTT:a64asm->SMULTT(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULWB:a64asm->SMULWB(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULWT:a64asm->SMULWT(test.cond, Rd,Rm,Rs); break; - case INSTR_SMLABB:a64asm->SMLABB(test.cond, Rd,Rm,Rs,Rn); break; - case INSTR_UXTB16:a64asm->UXTB16(test.cond, Rd,Rm,test.shiftAmount); break; - case INSTR_UBFX: - { - int32_t lsb = test.RsValue; - int32_t width = test.RmValue; - a64asm->UBFX(test.cond, Rd,Rn,lsb, width); - break; - } - case INSTR_ADDR_ADD: a64asm->ADDR_ADD(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_ADDR_SUB: a64asm->ADDR_SUB(test.cond, test.setFlags, Rd,Rn,op2); break; - default: printf("Error"); return; - } - a64asm->epilog(0); - flushcache(); - - asm_function_t asm_function = (asm_function_t)(instrMem); - - for(i = 0; i < NUM_REGS; ++i) - savedRegs[i] = regs[i]; - - asm_test_jacket(asm_function, regs, flags); - - /* Check if all regs except Rd is same */ - for(i = 0; i < NUM_REGS; ++i) - { - if(i == Rd) continue; - if(regs[i] != savedRegs[i]) - { - printf("Test %x failed Reg(%d) tampered Expected(0x%" PRIx64 ")," - "Actual(0x%" PRIx64 ") t\n", test.id, i, savedRegs[i], - regs[i]); - return; - } - } - - if(test.checkRd == 1 && (uint64_t)regs[Rd] != test.postRdValue) - { - printf("Test %x failed, Expected(%" PRIx64 "), Actual(%" PRIx64 ")\n", - test.id, test.postRdValue, regs[Rd]); - } - else if(test.checkFlag == 1 && flags[test.postFlag] == 0) - { - printf("Test %x failed Flag(%s) NOT set\n", - test.id,cc_code[test.postFlag]); - } - else - { - printf("Test %x passed\n", test.id); - } -} - - -void dataTransferTest(dataTransferTest_t test, ARMAssemblerInterface *a64asm, - uint32_t Rd = 0, uint32_t Rn = 1,uint32_t Rm = 2) -{ - int64_t regs[NUM_REGS] = {0}; - int64_t savedRegs[NUM_REGS] = {0}; - int32_t flags[NUM_FLAGS] = {0}; - uint32_t i; - for(i = 0; i < NUM_REGS; ++i) - { - regs[i] = i; - } - - uint32_t op2; - - regs[Rd] = test.RdValue; - regs[Rn] = (uint64_t)(&dataMem[test.RnValue]); - regs[Rm] = test.RmValue; - flags[test.preFlag] = 1; - - if(test.setMem == true) - { - unsigned char *mem = (unsigned char *)&dataMem[test.memOffset]; - uint64_t value = test.memValue; - for(int j = 0; j < 8; ++j) - { - mem[j] = value & 0x00FF; - value >>= 8; - } - } - a64asm->reset(); - a64asm->prolog(); - if(test.offsetType == REG_SCALE_OFFSET) - { - op2 = a64asm->reg_scale_pre(Rm); - } - else if(test.offsetType == REG_OFFSET) - { - op2 = a64asm->reg_pre(Rm); - } - else if(test.offsetType == IMM12_OFFSET && test.preIndex == true) - { - op2 = a64asm->immed12_pre(test.immValue, test.writeBack); - } - else if(test.offsetType == IMM12_OFFSET && test.postIndex == true) - { - op2 = a64asm->immed12_post(test.immValue); - } - else if(test.offsetType == IMM8_OFFSET && test.preIndex == true) - { - op2 = a64asm->immed8_pre(test.immValue, test.writeBack); - } - else if(test.offsetType == IMM8_OFFSET && test.postIndex == true) - { - op2 = a64asm->immed8_post(test.immValue); - } - else if(test.offsetType == NO_OFFSET) - { - op2 = a64asm->__immed12_pre(0); - } - else - { - printf("Error - Unknown offset\n"); return; - } - - switch(test.op) - { - case INSTR_LDR: a64asm->LDR(test.cond, Rd,Rn,op2); break; - case INSTR_LDRB: a64asm->LDRB(test.cond, Rd,Rn,op2); break; - case INSTR_LDRH: a64asm->LDRH(test.cond, Rd,Rn,op2); break; - case INSTR_ADDR_LDR: a64asm->ADDR_LDR(test.cond, Rd,Rn,op2); break; - case INSTR_STR: a64asm->STR(test.cond, Rd,Rn,op2); break; - case INSTR_STRB: a64asm->STRB(test.cond, Rd,Rn,op2); break; - case INSTR_STRH: a64asm->STRH(test.cond, Rd,Rn,op2); break; - case INSTR_ADDR_STR: a64asm->ADDR_STR(test.cond, Rd,Rn,op2); break; - default: printf("Error"); return; - } - a64asm->epilog(0); - flushcache(); - - asm_function_t asm_function = (asm_function_t)(instrMem); - - for(i = 0; i < NUM_REGS; ++i) - savedRegs[i] = regs[i]; - - - asm_test_jacket(asm_function, regs, flags); - - /* Check if all regs except Rd/Rn are same */ - for(i = 0; i < NUM_REGS; ++i) - { - if(i == Rd || i == Rn) continue; - if(regs[i] != savedRegs[i]) - { - printf("Test %x failed Reg(%d) tampered" - " Expected(0x%" PRIx64 "), Actual(0x%" PRIx64 ") t\n", - test.id, i, savedRegs[i], regs[i]); - return; - } - } - - if((uint64_t)regs[Rd] != test.postRdValue) - { - printf("Test %x failed, " - "Expected in Rd(0x%" PRIx64 "), Actual(0x%" PRIx64 ")\n", - test.id, test.postRdValue, regs[Rd]); - } - else if((uint64_t)regs[Rn] != (uint64_t)(&dataMem[test.postRnValue])) - { - printf("Test %x failed, " - "Expected in Rn(0x%" PRIx64 "), Actual(0x%" PRIx64 ")\n", - test.id, test.postRnValue, regs[Rn] - (uint64_t)dataMem); - } - else if(test.checkMem == true) - { - unsigned char *addr = (unsigned char *)&dataMem[test.postMemOffset]; - uint64_t value; - value = 0; - for(uint32_t j = 0; j < test.postMemLength; ++j) - value = (value << 8) | addr[test.postMemLength-j-1]; - if(value != test.postMemValue) - { - printf("Test %x failed, " - "Expected in Mem(0x%" PRIx64 "), Actual(0x%" PRIx64 ")\n", - test.id, test.postMemValue, value); - } - else - { - printf("Test %x passed\n", test.id); - } - } - else - { - printf("Test %x passed\n", test.id); - } -} - -void dataTransferLDMSTM(ARMAssemblerInterface *a64asm) -{ - int64_t regs[NUM_REGS] = {0}; - int32_t flags[NUM_FLAGS] = {0}; - const uint32_t numArmv7Regs = 16; - - uint32_t Rn = ARMAssemblerInterface::SP; - - uint32_t patterns[] = - { - 0x5A03, - 0x4CF0, - 0x1EA6, - 0x0DBF, - }; - - uint32_t i, j; - for(i = 0; i < sizeof(patterns)/sizeof(uint32_t); ++i) - { - for(j = 0; j < NUM_REGS; ++j) - { - regs[j] = j; - } - a64asm->reset(); - a64asm->prolog(); - a64asm->STM(AL,ARMAssemblerInterface::DB,Rn,1,patterns[i]); - for(j = 0; j < numArmv7Regs; ++j) - { - uint32_t op2 = a64asm->imm(0x31); - a64asm->MOV(AL, 0,j,op2); - } - a64asm->LDM(AL,ARMAssemblerInterface::IA,Rn,1,patterns[i]); - a64asm->epilog(0); - flushcache(); - - asm_function_t asm_function = (asm_function_t)(instrMem); - asm_test_jacket(asm_function, regs, flags); - - for(j = 0; j < numArmv7Regs; ++j) - { - if((1 << j) & patterns[i]) - { - if(regs[j] != j) - { - printf("LDM/STM Test %x failed " - "Reg%d expected(0x%x) Actual(0x%" PRIx64 ") \n", - patterns[i], j, j, regs[j]); - break; - } - } - } - if(j == numArmv7Regs) - printf("LDM/STM Test %x passed\n", patterns[i]); - } -} - -int main(void) -{ - uint32_t i; - - /* Allocate memory to store instructions generated by ArmToArm64Assembler */ - { - int fd = ashmem_create_region("code cache", instrMemSize); - if(fd < 0) - printf("Creating code cache, ashmem_create_region " - "failed with error '%s'", strerror(errno)); - instrMem = mmap(NULL, instrMemSize, - PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_PRIVATE, fd, 0); - } - - ArmToArm64Assembler a64asm(instrMem); - - if(TESTS_DATAOP_ENABLE) - { - printf("Running data processing tests\n"); - for(i = 0; i < sizeof(dataOpTests)/sizeof(dataOpTest_t); ++i) - dataOpTest(dataOpTests[i], &a64asm); - } - - if(TESTS_DATATRANSFER_ENABLE) - { - printf("Running data transfer tests\n"); - for(i = 0; i < sizeof(dataTransferTests)/sizeof(dataTransferTest_t); ++i) - dataTransferTest(dataTransferTests[i], &a64asm); - } - - if(TESTS_LDMSTM_ENABLE) - { - printf("Running LDM/STM tests\n"); - dataTransferLDMSTM(&a64asm); - } - - - if(TESTS_REG_CORRUPTION_ENABLE) - { - uint32_t reg_list[] = {0,1,12,14}; - uint32_t Rd, Rm, Rs, Rn; - uint32_t i; - uint32_t numRegs = sizeof(reg_list)/sizeof(uint32_t); - - printf("Running Register corruption tests\n"); - for(i = 0; i < sizeof(dataOpTests)/sizeof(dataOpTest_t); ++i) - { - for(Rd = 0; Rd < numRegs; ++Rd) - { - for(Rn = 0; Rn < numRegs; ++Rn) - { - for(Rm = 0; Rm < numRegs; ++Rm) - { - for(Rs = 0; Rs < numRegs;++Rs) - { - if(Rd == Rn || Rd == Rm || Rd == Rs) continue; - if(Rn == Rm || Rn == Rs) continue; - if(Rm == Rs) continue; - printf("Testing combination Rd(%d), Rn(%d)," - " Rm(%d), Rs(%d): ", - reg_list[Rd], reg_list[Rn], reg_list[Rm], reg_list[Rs]); - dataOpTest(dataOpTests[i], &a64asm, reg_list[Rd], - reg_list[Rn], reg_list[Rm], reg_list[Rs]); - } - } - } - } - } - } - return 0; -} diff --git a/libpixelflinger/tests/arch-arm64/assembler/asm_test_jacket.S b/libpixelflinger/tests/arch-arm64/assembler/asm_test_jacket.S deleted file mode 100644 index 3f900f854..000000000 --- a/libpixelflinger/tests/arch-arm64/assembler/asm_test_jacket.S +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - - .text - .balign 0 - - .global asm_test_jacket - - // Set the register and flag values - // Calls the asm function - // Reads the register/flag values to output register - - // Parameters - // X0 - Function to jump - // X1 - register values array - // X2 - flag values array -asm_test_jacket: - // Save registers to stack - stp x29, x30, [sp,#-16]! - stp x27, x28, [sp,#-16]! - - mov x30, x0 - mov x28, x1 - mov x27, x2 - - //Set the flags based on flag array - //EQ - ldr w0, [x27,#0] - cmp w0, #1 - b.ne bt_aeq - cmp w0,#1 - b bt_end -bt_aeq: - - //NE - ldr w0, [x27,#4] - cmp w0, #1 - b.ne bt_ane - cmp w0,#2 - b bt_end -bt_ane: - - //CS - ldr w0, [x27,#8] - cmp w0, #1 - b.ne bt_acs - cmp w0,#0 - b bt_end -bt_acs: - - //CC - ldr w0, [x27,#12] - cmp w0, #1 - b.ne bt_acc - cmp w0,#2 - b bt_end -bt_acc: - - //MI - ldr w0, [x27,#16] - cmp w0, #1 - b.ne bt_ami - subs w0,w0,#2 - b bt_end -bt_ami: - - //PL - ldr w0, [x27,#20] - cmp w0, #1 - b.ne bt_apl - subs w0,w0,#0 - b bt_end -bt_apl: - //HI - (C==1) && (Z==0) - ldr w0, [x27,#32] - cmp w0, #1 - b.ne bt_ahi - cmp w0,#0 - b bt_end -bt_ahi: - - //LS - (C==0) || (Z==1) - ldr w0, [x27,#36] - cmp w0, #1 - b.ne bt_als - cmp w0,#1 - b bt_end -bt_als: - - //GE - ldr w0, [x27,#40] - cmp w0, #1 - b.ne bt_age - cmp w0,#0 - b bt_end -bt_age: - - //LT - ldr w0, [x27,#44] - cmp w0, #1 - b.ne bt_alt - cmp w0,#2 - b bt_end -bt_alt: - - //GT - ldr w0, [x27,#48] - cmp w0, #1 - b.ne bt_agt - cmp w0,#0 - b bt_end -bt_agt: - - //LE - ldr w0, [x27,#52] - cmp w0, #1 - b.ne bt_ale - cmp w0,#2 - b bt_end -bt_ale: - - -bt_end: - - // Load the registers from reg array - ldr x0, [x28,#0] - ldr x1, [x28,#8] - ldr x2, [x28,#16] - ldr x3, [x28,#24] - ldr x4, [x28,#32] - ldr x5, [x28,#40] - ldr x6, [x28,#48] - ldr x7, [x28,#56] - ldr x8, [x28,#64] - ldr x9, [x28,#72] - ldr x10, [x28,#80] - ldr x11, [x28,#88] - ldr x12, [x28,#96] - ldr x14, [x28,#112] - - // Call the function - blr X30 - - // Save the registers to reg array - str x0, [x28,#0] - str x1, [x28,#8] - str x2, [x28,#16] - str x3, [x28,#24] - str x4, [x28,#32] - str x5, [x28,#40] - str x6, [x28,#48] - str x7, [x28,#56] - str x8, [x28,#64] - str x9, [x28,#72] - str x10, [x28,#80] - str x11, [x28,#88] - str x12, [x28,#96] - str x14, [x28,#112] - - //Set the flags array based on result flags - movz w0, #0 - movz w1, #1 - csel w2, w1, w0, EQ - str w2, [x27,#0] - csel w2, w1, w0, NE - str w2, [x27,#4] - csel w2, w1, w0, CS - str w2, [x27,#8] - csel w2, w1, w0, CC - str w2, [x27,#12] - csel w2, w1, w0, MI - str w2, [x27,#16] - csel w2, w1, w0, PL - str w2, [x27,#20] - csel w2, w1, w0, VS - str w2, [x27,#24] - csel w2, w1, w0, VC - str w2, [x27,#28] - csel w2, w1, w0, HI - str w2, [x27,#32] - csel w2, w1, w0, LS - str w2, [x27,#36] - csel w2, w1, w0, GE - str w2, [x27,#40] - csel w2, w1, w0, LT - str w2, [x27,#44] - csel w2, w1, w0, GT - str w2, [x27,#48] - csel w2, w1, w0, LE - str w2, [x27,#52] - - // Restore registers from stack - ldp x27, x28, [sp],#16 - ldp x29, x30, [sp],#16 - ret - diff --git a/libpixelflinger/tests/arch-arm64/col32cb16blend/Android.bp b/libpixelflinger/tests/arch-arm64/col32cb16blend/Android.bp deleted file mode 100644 index e640aeb74..000000000 --- a/libpixelflinger/tests/arch-arm64/col32cb16blend/Android.bp +++ /dev/null @@ -1,6 +0,0 @@ -cc_test { - name: "test-pixelflinger-arm64-col32cb16blend", - defaults: ["pixelflinger-tests-arm64"], - - srcs: ["col32cb16blend_test.c"], -} diff --git a/libpixelflinger/tests/arch-arm64/col32cb16blend/col32cb16blend_test.c b/libpixelflinger/tests/arch-arm64/col32cb16blend/col32cb16blend_test.c deleted file mode 100644 index c6a301723..000000000 --- a/libpixelflinger/tests/arch-arm64/col32cb16blend/col32cb16blend_test.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - - -#define ARGB_8888_MAX 0xFFFFFFFF -#define ARGB_8888_MIN 0x00000000 -#define RGB_565_MAX 0xFFFF -#define RGB_565_MIN 0x0000 - -struct test_t -{ - char name[256]; - uint32_t dst_color; - uint32_t src_color; - size_t count; -}; - -struct test_t tests[] = -{ - {"Count 1, Src=Max, Dst=Min", ARGB_8888_MAX, RGB_565_MIN, 1}, - {"Count 2, Src=Min, Dst=Max", ARGB_8888_MIN, RGB_565_MAX, 2}, - {"Count 3, Src=Max, Dst=Max", ARGB_8888_MAX, RGB_565_MAX, 3}, - {"Count 4, Src=Min, Dst=Min", ARGB_8888_MAX, RGB_565_MAX, 4}, - {"Count 1, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 1}, - {"Count 2, Src=Rand, Dst=Rand", 0xABCDEF12, 0x2345, 2}, - {"Count 3, Src=Rand, Dst=Rand", 0x11111111, 0xEDFE, 3}, - {"Count 4, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 4}, - {"Count 5, Src=Rand, Dst=Rand", 0xEFEFFEFE, 0xFACC, 5}, - {"Count 10, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 10} -}; - -void scanline_col32cb16blend_arm64(uint16_t *dst, int32_t src, size_t count); -void scanline_col32cb16blend_c(uint16_t * dst, int32_t src, size_t count) -{ - int srcAlpha = (src>>24); - int f = 0x100 - (srcAlpha + (srcAlpha>>7)); - while (count--) - { - uint16_t d = *dst; - int dstR = (d>>11)&0x1f; - int dstG = (d>>5)&0x3f; - int dstB = (d)&0x1f; - int srcR = (src >> ( 3))&0x1F; - int srcG = (src >> ( 8+2))&0x3F; - int srcB = (src >> (16+3))&0x1F; - srcR += (f*dstR)>>8; - srcG += (f*dstG)>>8; - srcB += (f*dstB)>>8; - *dst++ = (uint16_t)((srcR<<11)|(srcG<<5)|srcB); - } -} - -void scanline_col32cb16blend_test() -{ - uint16_t dst_c[16], dst_asm[16]; - uint32_t i, j; - - for(i = 0; i < sizeof(tests)/sizeof(struct test_t); ++i) - { - struct test_t test = tests[i]; - - printf("Testing - %s:",test.name); - - memset(dst_c, 0, sizeof(dst_c)); - memset(dst_asm, 0, sizeof(dst_asm)); - - for(j = 0; j < test.count; ++j) - { - dst_c[j] = test.dst_color; - dst_asm[j] = test.dst_color; - } - - - scanline_col32cb16blend_c(dst_c, test.src_color, test.count); - scanline_col32cb16blend_arm64(dst_asm, test.src_color, test.count); - - - if(memcmp(dst_c, dst_asm, sizeof(dst_c)) == 0) - printf("Passed\n"); - else - printf("Failed\n"); - - for(j = 0; j < test.count; ++j) - { - printf("dst_c[%d] = %x, dst_asm[%d] = %x \n", j, dst_c[j], j, dst_asm[j]); - } - } -} - -int main() -{ - scanline_col32cb16blend_test(); - return 0; -} diff --git a/libpixelflinger/tests/arch-arm64/disassembler/Android.bp b/libpixelflinger/tests/arch-arm64/disassembler/Android.bp deleted file mode 100644 index 38dc99a5b..000000000 --- a/libpixelflinger/tests/arch-arm64/disassembler/Android.bp +++ /dev/null @@ -1,6 +0,0 @@ -cc_test { - name: "test-pixelflinger-arm64-disassembler-test", - defaults: ["pixelflinger-tests-arm64"], - - srcs: ["arm64_diassembler_test.cpp"], -} diff --git a/libpixelflinger/tests/arch-arm64/disassembler/arm64_diassembler_test.cpp b/libpixelflinger/tests/arch-arm64/disassembler/arm64_diassembler_test.cpp deleted file mode 100644 index af3183b1b..000000000 --- a/libpixelflinger/tests/arch-arm64/disassembler/arm64_diassembler_test.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#include -#include -#include - -int arm64_disassemble(uint32_t code, char* instr); - -struct test_table_entry_t -{ - uint32_t code; - const char *instr; -}; -static test_table_entry_t test_table [] = -{ - { 0x91000240, "add x0, x18, #0x0, lsl #0" }, - { 0x9140041f, "add sp, x0, #0x1, lsl #12" }, - { 0x917ffff2, "add x18, sp, #0xfff, lsl #12" }, - - { 0xd13ffe40, "sub x0, x18, #0xfff, lsl #0" }, - { 0xd140001f, "sub sp, x0, #0x0, lsl #12" }, - { 0xd14007f2, "sub x18, sp, #0x1, lsl #12" }, - - { 0x8b1e0200, "add x0, x16, x30, lsl #0" }, - { 0x8b507fdf, "add xzr, x30, x16, lsr #31" }, - { 0x8b8043f0, "add x16, xzr, x0, asr #16" }, - { 0x8b5f401e, "add x30, x0, xzr, lsr #16" }, - - - { 0x4b1e0200, "sub w0, w16, w30, lsl #0" }, - { 0x4b507fdf, "sub wzr, w30, w16, lsr #31" }, - { 0x4b8043f0, "sub w16, wzr, w0, asr #16" }, - { 0x4b5f401e, "sub w30, w0, wzr, lsr #16" }, - - { 0x6b1e0200, "subs w0, w16, w30, lsl #0" }, - { 0x6b507fdf, "subs wzr, w30, w16, lsr #31" }, - { 0x6b8043f0, "subs w16, wzr, w0, asr #16" }, - { 0x6b5f401e, "subs w30, w0, wzr, lsr #16" }, - - { 0x0a1e0200, "and w0, w16, w30, lsl #0" }, - { 0x0a507fdf, "and wzr, w30, w16, lsr #31" }, - { 0x0a8043f0, "and w16, wzr, w0, asr #16" }, - { 0x0adf401e, "and w30, w0, wzr, ror #16" }, - - { 0x2a1e0200, "orr w0, w16, w30, lsl #0" }, - { 0x2a507fdf, "orr wzr, w30, w16, lsr #31" }, - { 0x2a8043f0, "orr w16, wzr, w0, asr #16" }, - { 0x2adf401e, "orr w30, w0, wzr, ror #16" }, - - { 0x2a3e0200, "orn w0, w16, w30, lsl #0" }, - { 0x2a707fdf, "orn wzr, w30, w16, lsr #31" }, - { 0x2aa043f0, "orn w16, wzr, w0, asr #16" }, - { 0x2aff401e, "orn w30, w0, wzr, ror #16" }, - - { 0x729fffe0, "movk w0, #0xffff, lsl #0" }, - { 0x72a0000f, "movk w15, #0x0, lsl #16" }, - { 0x7281fffe, "movk w30, #0xfff, lsl #0" }, - { 0x72a0003f, "movk wzr, #0x1, lsl #16" }, - - { 0x529fffe0, "movz w0, #0xffff, lsl #0" }, - { 0x52a0000f, "movz w15, #0x0, lsl #16" }, - { 0x5281fffe, "movz w30, #0xfff, lsl #0" }, - { 0x52a0003f, "movz wzr, #0x1, lsl #16" }, - - { 0xd29fffe0, "movz x0, #0xffff, lsl #0" }, - { 0xd2a0000f, "movz x15, #0x0, lsl #16" }, - { 0xd2c1fffe, "movz x30, #0xfff, lsl #32" }, - { 0xd2e0003f, "movz xzr, #0x1, lsl #48" }, - - { 0x1a8003e0, "csel w0, wzr, w0, eq" }, - { 0x1a831001, "csel w1, w0, w3, ne" }, - { 0x1a9e2022, "csel w2, w1, w30, cs" }, - { 0x1a8a3083, "csel w3, w4, w10, cc" }, - { 0x1a8b40e4, "csel w4, w7, w11, mi" }, - { 0x1a9b5105, "csel w5, w8, w27, pl" }, - { 0x1a846167, "csel w7, w11, w4, vs" }, - { 0x1a8671c8, "csel w8, w14, w6, vc" }, - { 0x1a878289, "csel w9, w20, w7, hi" }, - { 0x1a8c92aa, "csel w10, w21, w12, ls" }, - { 0x1a8ea2ce, "csel w14, w22, w14, ge" }, - { 0x1a9fb3b2, "csel w18, w29, wzr, lt" }, - { 0x1a9fc3d8, "csel w24, w30, wzr, gt" }, - { 0x1a82d17e, "csel w30, w11, w2, le" }, - { 0x1a81e19f, "csel wzr, w12, w1, al" }, - - { 0x9a8003e0, "csel x0, xzr, x0, eq" }, - { 0x9a831001, "csel x1, x0, x3, ne" }, - { 0x9a9e2022, "csel x2, x1, x30, cs" }, - { 0x9a8a3083, "csel x3, x4, x10, cc" }, - { 0x9a8b40e4, "csel x4, x7, x11, mi" }, - { 0x9a9b5105, "csel x5, x8, x27, pl" }, - { 0x9a846167, "csel x7, x11, x4, vs" }, - { 0x9a8671c8, "csel x8, x14, x6, vc" }, - { 0x9a878289, "csel x9, x20, x7, hi" }, - { 0x9a8c92aa, "csel x10, x21, x12, ls" }, - { 0x9a8ea2ce, "csel x14, x22, x14, ge" }, - { 0x9a9fb3b2, "csel x18, x29, xzr, lt" }, - { 0x9a9fc3d8, "csel x24, x30, xzr, gt" }, - { 0x9a82d17e, "csel x30, x11, x2, le" }, - { 0x9a81e19f, "csel xzr, x12, x1, al" }, - - { 0x5a8003e0, "csinv w0, wzr, w0, eq" }, - { 0x5a831001, "csinv w1, w0, w3, ne" }, - { 0x5a9e2022, "csinv w2, w1, w30, cs" }, - { 0x5a8a3083, "csinv w3, w4, w10, cc" }, - { 0x5a8b40e4, "csinv w4, w7, w11, mi" }, - { 0x5a9b5105, "csinv w5, w8, w27, pl" }, - { 0x5a846167, "csinv w7, w11, w4, vs" }, - { 0x5a8671c8, "csinv w8, w14, w6, vc" }, - { 0x5a878289, "csinv w9, w20, w7, hi" }, - { 0x5a8c92aa, "csinv w10, w21, w12, ls" }, - { 0x5a8ea2ce, "csinv w14, w22, w14, ge" }, - { 0x5a9fb3b2, "csinv w18, w29, wzr, lt" }, - { 0x5a9fc3d8, "csinv w24, w30, wzr, gt" }, - { 0x5a82d17e, "csinv w30, w11, w2, le" }, - { 0x5a81e19f, "csinv wzr, w12, w1, al" }, - - { 0x1b1f3fc0, "madd w0, w30, wzr, w15" }, - { 0x1b0079ef, "madd w15, w15, w0, w30" }, - { 0x1b0f7ffe, "madd w30, wzr, w15, wzr" }, - { 0x1b1e001f, "madd wzr, w0, w30, w0" }, - - { 0x9b3f3fc0, "smaddl x0, w30, wzr, x15" }, - { 0x9b2079ef, "smaddl x15, w15, w0, x30" }, - { 0x9b2f7ffe, "smaddl x30, wzr, w15, xzr" }, - { 0x9b3e001f, "smaddl xzr, w0, w30, x0" }, - - { 0xd65f0000, "ret x0" }, - { 0xd65f01e0, "ret x15" }, - { 0xd65f03c0, "ret x30" }, - { 0xd65f03e0, "ret xzr" }, - - { 0xb87f4be0, "ldr w0, [sp, wzr, uxtw #0]" }, - { 0xb87ed80f, "ldr w15, [x0, w30, sxtw #2]" }, - { 0xb86fc9fe, "ldr w30, [x15, w15, sxtw #0]" }, - { 0xb8605bdf, "ldr wzr, [x30, w0, uxtw #2]" }, - { 0xb87febe0, "ldr w0, [sp, xzr, sxtx #0]" }, - { 0xb87e780f, "ldr w15, [x0, x30, lsl #2]" }, - { 0xb86f69fe, "ldr w30, [x15, x15, lsl #0]" }, - { 0xb860fbdf, "ldr wzr, [x30, x0, sxtx #2]" }, - - { 0xb83f4be0, "str w0, [sp, wzr, uxtw #0]" }, - { 0xb83ed80f, "str w15, [x0, w30, sxtw #2]" }, - { 0xb82fc9fe, "str w30, [x15, w15, sxtw #0]" }, - { 0xb8205bdf, "str wzr, [x30, w0, uxtw #2]" }, - { 0xb83febe0, "str w0, [sp, xzr, sxtx #0]" }, - { 0xb83e780f, "str w15, [x0, x30, lsl #2]" }, - { 0xb82f69fe, "str w30, [x15, x15, lsl #0]" }, - { 0xb820fbdf, "str wzr, [x30, x0, sxtx #2]" }, - - { 0x787f4be0, "ldrh w0, [sp, wzr, uxtw #0]" }, - { 0x787ed80f, "ldrh w15, [x0, w30, sxtw #1]" }, - { 0x786fc9fe, "ldrh w30, [x15, w15, sxtw #0]" }, - { 0x78605bdf, "ldrh wzr, [x30, w0, uxtw #1]" }, - { 0x787febe0, "ldrh w0, [sp, xzr, sxtx #0]" }, - { 0x787e780f, "ldrh w15, [x0, x30, lsl #1]" }, - { 0x786f69fe, "ldrh w30, [x15, x15, lsl #0]" }, - { 0x7860fbdf, "ldrh wzr, [x30, x0, sxtx #1]" }, - - { 0x783f4be0, "strh w0, [sp, wzr, uxtw #0]" }, - { 0x783ed80f, "strh w15, [x0, w30, sxtw #1]" }, - { 0x782fc9fe, "strh w30, [x15, w15, sxtw #0]" }, - { 0x78205bdf, "strh wzr, [x30, w0, uxtw #1]" }, - { 0x783febe0, "strh w0, [sp, xzr, sxtx #0]" }, - { 0x783e780f, "strh w15, [x0, x30, lsl #1]" }, - { 0x782f69fe, "strh w30, [x15, x15, lsl #0]" }, - { 0x7820fbdf, "strh wzr, [x30, x0, sxtx #1]" }, - - { 0x387f5be0, "ldrb w0, [sp, wzr, uxtw #0]" }, - { 0x387ec80f, "ldrb w15, [x0, w30, sxtw ]" }, - { 0x386fd9fe, "ldrb w30, [x15, w15, sxtw #0]" }, - { 0x38604bdf, "ldrb wzr, [x30, w0, uxtw ]" }, - { 0x387ffbe0, "ldrb w0, [sp, xzr, sxtx #0]" }, - { 0x387e780f, "ldrb w15, [x0, x30, lsl #0]" }, - { 0x386f79fe, "ldrb w30, [x15, x15, lsl #0]" }, - { 0x3860ebdf, "ldrb wzr, [x30, x0, sxtx ]" }, - - { 0x383f5be0, "strb w0, [sp, wzr, uxtw #0]" }, - { 0x383ec80f, "strb w15, [x0, w30, sxtw ]" }, - { 0x382fd9fe, "strb w30, [x15, w15, sxtw #0]" }, - { 0x38204bdf, "strb wzr, [x30, w0, uxtw ]" }, - { 0x383ffbe0, "strb w0, [sp, xzr, sxtx #0]" }, - { 0x383e780f, "strb w15, [x0, x30, lsl #0]" }, - { 0x382f79fe, "strb w30, [x15, x15, lsl #0]" }, - { 0x3820ebdf, "strb wzr, [x30, x0, sxtx ]" }, - - { 0xf87f4be0, "ldr x0, [sp, wzr, uxtw #0]" }, - { 0xf87ed80f, "ldr x15, [x0, w30, sxtw #3]" }, - { 0xf86fc9fe, "ldr x30, [x15, w15, sxtw #0]" }, - { 0xf8605bdf, "ldr xzr, [x30, w0, uxtw #3]" }, - { 0xf87febe0, "ldr x0, [sp, xzr, sxtx #0]" }, - { 0xf87e780f, "ldr x15, [x0, x30, lsl #3]" }, - { 0xf86f69fe, "ldr x30, [x15, x15, lsl #0]" }, - { 0xf860fbdf, "ldr xzr, [x30, x0, sxtx #3]" }, - - { 0xf83f4be0, "str x0, [sp, wzr, uxtw #0]" }, - { 0xf83ed80f, "str x15, [x0, w30, sxtw #3]" }, - { 0xf82fc9fe, "str x30, [x15, w15, sxtw #0]" }, - { 0xf8205bdf, "str xzr, [x30, w0, uxtw #3]" }, - { 0xf83febe0, "str x0, [sp, xzr, sxtx #0]" }, - { 0xf83e780f, "str x15, [x0, x30, lsl #3]" }, - { 0xf82f69fe, "str x30, [x15, x15, lsl #0]" }, - { 0xf820fbdf, "str xzr, [x30, x0, sxtx #3]" }, - - { 0xb85007e0, "ldr w0, [sp], #-256" }, - { 0xb840040f, "ldr w15, [x0], #0" }, - { 0xb84015fe, "ldr w30, [x15], #1" }, - { 0xb84ff7df, "ldr wzr, [x30], #255" }, - { 0xb8100fe0, "str w0, [sp, #-256]!" }, - { 0xb8000c0f, "str w15, [x0, #0]!" }, - { 0xb8001dfe, "str w30, [x15, #1]!" }, - { 0xb80fffdf, "str wzr, [x30, #255]!" }, - - { 0x13017be0, "sbfm w0, wzr, #1, #30" }, - { 0x131e7fcf, "sbfm w15, w30, #30, #31" }, - { 0x131f01fe, "sbfm w30, w15, #31, #0" }, - { 0x1300041f, "sbfm wzr, w0, #0, #1" }, - - { 0x53017be0, "ubfm w0, wzr, #1, #30" }, - { 0x531e7fcf, "ubfm w15, w30, #30, #31" }, - { 0x531f01fe, "ubfm w30, w15, #31, #0" }, - { 0x5300041f, "ubfm wzr, w0, #0, #1" }, - { 0xd3417fe0, "ubfm x0, xzr, #1, #31" }, - { 0xd35fffcf, "ubfm x15, x30, #31, #63" }, - { 0xd35f01fe, "ubfm x30, x15, #31, #0" }, - { 0xd340041f, "ubfm xzr, x0, #0, #1" }, - - { 0x139e7be0, "extr w0, wzr, w30, #30" }, - { 0x138f7fcf, "extr w15, w30, w15, #31" }, - { 0x138001fe, "extr w30, w15, w0, #0" }, - { 0x139f041f, "extr wzr, w0, wzr, #1" }, - - { 0x54000020, "b.eq #.+4" }, - { 0x54000201, "b.ne #.+64" }, - { 0x54000802, "b.cs #.+256" }, - { 0x54002003, "b.cc #.+1024" }, - { 0x54008004, "b.mi #.+4096" }, - { 0x54ffffe5, "b.pl #.-4" }, - { 0x54ffff06, "b.vs #.-32" }, - { 0x54fffc07, "b.vc #.-128" }, - { 0x54fff008, "b.hi #.-512" }, - { 0x54000049, "b.ls #.+8" }, - { 0x5400006a, "b.ge #.+12" }, - { 0x5400008b, "b.lt #.+16" }, - { 0x54ffffcc, "b.gt #.-8" }, - { 0x54ffffad, "b.le #.-12" }, - { 0x54ffff8e, "b.al #.-16" }, - - { 0x8b2001e0, "add x0, x15, w0, uxtb #0" }, - { 0x8b2f27cf, "add x15, x30, w15, uxth #1" }, - { 0x8b3e4bfe, "add x30, sp, w30, uxtw #2" }, - { 0x8b3f6c1f, "add sp, x0, xzr, uxtx #3" }, - { 0x8b2091e0, "add x0, x15, w0, sxtb #4" }, - { 0x8b2fa3cf, "add x15, x30, w15, sxth #0" }, - { 0x8b3ec7fe, "add x30, sp, w30, sxtw #1" }, - { 0x8b3fe81f, "add sp, x0, xzr, sxtx #2" }, - - { 0xcb2001e0, "sub x0, x15, w0, uxtb #0" }, - { 0xcb2f27cf, "sub x15, x30, w15, uxth #1" }, - { 0xcb3e4bfe, "sub x30, sp, w30, uxtw #2" }, - { 0xcb3f6c1f, "sub sp, x0, xzr, uxtx #3" }, - { 0xcb2091e0, "sub x0, x15, w0, sxtb #4" }, - { 0xcb2fa3cf, "sub x15, x30, w15, sxth #0" }, - { 0xcb3ec7fe, "sub x30, sp, w30, sxtw #1" }, - { 0xcb3fe81f, "sub sp, x0, xzr, sxtx #2" } -}; - -int main() -{ - char instr[256]; - uint32_t failed = 0; - for(uint32_t i = 0; i < sizeof(test_table)/sizeof(test_table_entry_t); ++i) - { - test_table_entry_t *test; - test = &test_table[i]; - arm64_disassemble(test->code, instr); - if(strcmp(instr, test->instr) != 0) - { - printf("Test Failed \n" - "Code : 0x%0x\n" - "Expected : %s\n" - "Actual : %s\n", test->code, test->instr, instr); - failed++; - } - } - if(failed == 0) - { - printf("All tests PASSED\n"); - return 0; - } - else - { - printf("%d tests FAILED\n", failed); - return -1; - } -} diff --git a/libpixelflinger/tests/arch-arm64/t32cb16blend/Android.bp b/libpixelflinger/tests/arch-arm64/t32cb16blend/Android.bp deleted file mode 100644 index 9d060d136..000000000 --- a/libpixelflinger/tests/arch-arm64/t32cb16blend/Android.bp +++ /dev/null @@ -1,6 +0,0 @@ -cc_test { - name: "test-pixelflinger-arm64-t32cb16blend", - defaults: ["pixelflinger-tests-arm64"], - - srcs: ["t32cb16blend_test.c"], -} diff --git a/libpixelflinger/tests/arch-arm64/t32cb16blend/t32cb16blend_test.c b/libpixelflinger/tests/arch-arm64/t32cb16blend/t32cb16blend_test.c deleted file mode 100644 index afb36fb47..000000000 --- a/libpixelflinger/tests/arch-arm64/t32cb16blend/t32cb16blend_test.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#define ARGB_8888_MAX 0xFFFFFFFF -#define ARGB_8888_MIN 0x00000000 -#define RGB_565_MAX 0xFFFF -#define RGB_565_MIN 0x0000 - -struct test_t -{ - char name[256]; - uint32_t src_color; - uint16_t dst_color; - size_t count; -}; - -struct test_t tests[] = -{ - {"Count 0", 0, 0, 0}, - {"Count 1, Src=Max, Dst=Min", ARGB_8888_MAX, RGB_565_MIN, 1}, - {"Count 2, Src=Min, Dst=Max", ARGB_8888_MIN, RGB_565_MAX, 2}, - {"Count 3, Src=Max, Dst=Max", ARGB_8888_MAX, RGB_565_MAX, 3}, - {"Count 4, Src=Min, Dst=Min", ARGB_8888_MAX, RGB_565_MAX, 4}, - {"Count 1, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 1}, - {"Count 2, Src=Rand, Dst=Rand", 0xABCDEF12, 0x2345, 2}, - {"Count 3, Src=Rand, Dst=Rand", 0x11111111, 0xEDFE, 3}, - {"Count 4, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 4}, - {"Count 5, Src=Rand, Dst=Rand", 0xEFEFFEFE, 0xFACC, 5}, - {"Count 10, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 10} - -}; - -void scanline_t32cb16blend_arm64(uint16_t*, uint32_t*, size_t); -void scanline_t32cb16blend_c(uint16_t * dst, uint32_t* src, size_t count) -{ - while (count--) - { - uint16_t d = *dst; - uint32_t s = *src++; - int dstR = (d>>11)&0x1f; - int dstG = (d>>5)&0x3f; - int dstB = (d)&0x1f; - int srcR = (s >> ( 3))&0x1F; - int srcG = (s >> ( 8+2))&0x3F; - int srcB = (s >> (16+3))&0x1F; - int srcAlpha = (s>>24) & 0xFF; - - - int f = 0x100 - (srcAlpha + ((srcAlpha>>7) & 0x1)); - srcR += (f*dstR)>>8; - srcG += (f*dstG)>>8; - srcB += (f*dstB)>>8; - srcR = srcR > 0x1F? 0x1F: srcR; - srcG = srcG > 0x3F? 0x3F: srcG; - srcB = srcB > 0x1F? 0x1F: srcB; - *dst++ = (uint16_t)((srcR<<11)|(srcG<<5)|srcB); - } -} - -void scanline_t32cb16blend_test() -{ - uint16_t dst_c[16], dst_asm[16]; - uint32_t src[16]; - uint32_t i; - uint32_t j; - - for(i = 0; i < sizeof(tests)/sizeof(struct test_t); ++i) - { - struct test_t test = tests[i]; - - printf("Testing - %s:",test.name); - - memset(dst_c, 0, sizeof(dst_c)); - memset(dst_asm, 0, sizeof(dst_asm)); - - for(j = 0; j < test.count; ++j) - { - dst_c[j] = test.dst_color; - dst_asm[j] = test.dst_color; - src[j] = test.src_color; - } - - scanline_t32cb16blend_c(dst_c,src,test.count); - scanline_t32cb16blend_arm64(dst_asm,src,test.count); - - - if(memcmp(dst_c, dst_asm, sizeof(dst_c)) == 0) - printf("Passed\n"); - else - printf("Failed\n"); - - for(j = 0; j < test.count; ++j) - { - printf("dst_c[%d] = %x, dst_asm[%d] = %x \n", j, dst_c[j], j, dst_asm[j]); - } - } -} - -int main() -{ - scanline_t32cb16blend_test(); - return 0; -} diff --git a/libpixelflinger/tests/arch-mips/Android.bp b/libpixelflinger/tests/arch-mips/Android.bp deleted file mode 100644 index 2ca272178..000000000 --- a/libpixelflinger/tests/arch-mips/Android.bp +++ /dev/null @@ -1,11 +0,0 @@ -cc_defaults { - name: "pixelflinger-tests-mips", - defaults: ["pixelflinger-tests"], - - enabled: false, - arch: { - mips: { - enabled: true, - }, - }, -} diff --git a/libpixelflinger/tests/arch-mips/col32cb16blend/Android.bp b/libpixelflinger/tests/arch-mips/col32cb16blend/Android.bp deleted file mode 100644 index 45bfe29e4..000000000 --- a/libpixelflinger/tests/arch-mips/col32cb16blend/Android.bp +++ /dev/null @@ -1,6 +0,0 @@ -cc_test { - name: "test-pixelflinger-mips-col32cb16blend", - defaults: ["pixelflinger-tests-mips"], - - srcs: ["col32cb16blend_test.c"], -} diff --git a/libpixelflinger/tests/arch-mips/col32cb16blend/col32cb16blend_test.c b/libpixelflinger/tests/arch-mips/col32cb16blend/col32cb16blend_test.c deleted file mode 100644 index dd0e60fef..000000000 --- a/libpixelflinger/tests/arch-mips/col32cb16blend/col32cb16blend_test.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - - -#define ARGB_8888_MAX 0xFFFFFFFF -#define ARGB_8888_MIN 0x00000000 -#define RGB_565_MAX 0xFFFF -#define RGB_565_MIN 0x0000 - -struct test_t -{ - char name[256]; - uint32_t src_color; - uint16_t dst_color; - size_t count; -}; - -struct test_t tests[] = -{ - {"Count 1, Src=Max, Dst=Min", ARGB_8888_MAX, RGB_565_MIN, 1}, - {"Count 2, Src=Min, Dst=Max", ARGB_8888_MIN, RGB_565_MAX, 2}, - {"Count 3, Src=Max, Dst=Max", ARGB_8888_MAX, RGB_565_MAX, 3}, - {"Count 4, Src=Min, Dst=Min", ARGB_8888_MAX, RGB_565_MAX, 4}, - {"Count 1, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 1}, - {"Count 2, Src=Rand, Dst=Rand", 0xABCDEF12, 0x2345, 2}, - {"Count 3, Src=Rand, Dst=Rand", 0x11111111, 0xEDFE, 3}, - {"Count 4, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 4}, - {"Count 5, Src=Rand, Dst=Rand", 0xEFEFFEFE, 0xFACC, 5}, - {"Count 10, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 10} -}; - -void scanline_col32cb16blend_mips(uint16_t *dst, uint32_t src, size_t count); -void scanline_col32cb16blend_c(uint16_t * dst, uint32_t src, size_t count) -{ - uint32_t srcAlpha = (src>>24); - uint32_t f = 0x100 - (srcAlpha + (srcAlpha>>7)); - - while (count--) - { - uint16_t d = *dst; - int dstR = (d>>11)&0x1f; - int dstG = (d>>5)&0x3f; - int dstB = (d)&0x1f; - int srcR = (src >> ( 3))&0x1F; - int srcG = (src >> ( 8+2))&0x3F; - int srcB = (src >> (16+3))&0x1F; - srcR += (f*dstR)>>8; - srcG += (f*dstG)>>8; - srcB += (f*dstB)>>8; - *dst++ = (uint16_t)((srcR<<11)|(srcG<<5)|srcB); - } -} - -void scanline_col32cb16blend_test() -{ - uint16_t dst_c[16], dst_asm[16]; - uint32_t i, j; - - for(i = 0; i < sizeof(tests)/sizeof(struct test_t); ++i) - { - struct test_t test = tests[i]; - - printf("Testing - %s:",test.name); - - memset(dst_c, 0, sizeof(dst_c)); - memset(dst_asm, 0, sizeof(dst_asm)); - - for(j = 0; j < test.count; ++j) - { - dst_c[j] = test.dst_color; - dst_asm[j] = test.dst_color; - } - - - scanline_col32cb16blend_c(dst_c, test.src_color, test.count); - scanline_col32cb16blend_mips(dst_asm, test.src_color, test.count); - - if(memcmp(dst_c, dst_asm, sizeof(dst_c)) == 0) - printf("Passed\n"); - else - printf("Failed\n"); - - for(j = 0; j < test.count; ++j) - { - printf("dst_c[%d] = %x, dst_asm[%d] = %x \n", j, dst_c[j], j, dst_asm[j]); - } - } -} - -int main() -{ - scanline_col32cb16blend_test(); - return 0; -} diff --git a/libpixelflinger/tests/arch-mips/t32cb16blend/Android.bp b/libpixelflinger/tests/arch-mips/t32cb16blend/Android.bp deleted file mode 100644 index 069e97c55..000000000 --- a/libpixelflinger/tests/arch-mips/t32cb16blend/Android.bp +++ /dev/null @@ -1,6 +0,0 @@ -cc_test { - name: "test-pixelflinger-mips-t32cb16blend", - defaults: ["pixelflinger-tests-mips"], - - srcs: ["t32cb16blend_test.c"], -} diff --git a/libpixelflinger/tests/arch-mips/t32cb16blend/t32cb16blend_test.c b/libpixelflinger/tests/arch-mips/t32cb16blend/t32cb16blend_test.c deleted file mode 100644 index c6d6937c6..000000000 --- a/libpixelflinger/tests/arch-mips/t32cb16blend/t32cb16blend_test.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#define ARGB_8888_MAX 0xFFFFFFFF -#define ARGB_8888_MIN 0x00000000 -#define RGB_565_MAX 0xFFFF -#define RGB_565_MIN 0x0000 - -struct test_t -{ - char name[256]; - uint32_t src_color; - uint16_t dst_color; - size_t count; -}; - -struct test_t tests[] = -{ - {"Count 0", 0, 0, 0}, - {"Count 1, Src=Max, Dst=Min", ARGB_8888_MAX, RGB_565_MIN, 1}, - {"Count 2, Src=Min, Dst=Max", ARGB_8888_MIN, RGB_565_MAX, 2}, - {"Count 3, Src=Max, Dst=Max", ARGB_8888_MAX, RGB_565_MAX, 3}, - {"Count 4, Src=Min, Dst=Min", ARGB_8888_MAX, RGB_565_MAX, 4}, - {"Count 1, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 1}, - {"Count 2, Src=Rand, Dst=Rand", 0xABCDEF12, 0x2345, 2}, - {"Count 3, Src=Rand, Dst=Rand", 0x11111111, 0xEDFE, 3}, - {"Count 4, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 4}, - {"Count 5, Src=Rand, Dst=Rand", 0xEFEFFEFE, 0xFACC, 5}, - {"Count 10, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 10} - -}; - -void scanline_t32cb16blend_mips(uint16_t*, uint32_t*, size_t); -void scanline_t32cb16blend_c(uint16_t * dst, uint32_t* src, size_t count) -{ - while (count--) - { - uint16_t d = *dst; - uint32_t s = *src++; - int dstR = (d>>11)&0x1f; - int dstG = (d>>5)&0x3f; - int dstB = (d)&0x1f; - int srcR = (s >> ( 3))&0x1F; - int srcG = (s >> ( 8+2))&0x3F; - int srcB = (s >> (16+3))&0x1F; - int srcAlpha = (s>>24) & 0xFF; - - - int f = 0x100 - (srcAlpha + ((srcAlpha>>7) & 0x1)); - srcR += (f*dstR)>>8; - srcG += (f*dstG)>>8; - srcB += (f*dstB)>>8; - // srcR = srcR > 0x1F? 0x1F: srcR; - // srcG = srcG > 0x3F? 0x3F: srcG; - // srcB = srcB > 0x1F? 0x1F: srcB; - *dst++ = (uint16_t)((srcR<<11)|(srcG<<5)|srcB); - } -} - -void scanline_t32cb16blend_test() -{ - uint16_t dst_c[16], dst_asm[16]; - uint32_t src[16]; - uint32_t i; - uint32_t j; - - for(i = 0; i < sizeof(tests)/sizeof(struct test_t); ++i) - { - struct test_t test = tests[i]; - - printf("Testing - %s:",test.name); - - memset(dst_c, 0, sizeof(dst_c)); - memset(dst_asm, 0, sizeof(dst_asm)); - - for(j = 0; j < test.count; ++j) - { - dst_c[j] = test.dst_color; - dst_asm[j] = test.dst_color; - src[j] = test.src_color; - } - - scanline_t32cb16blend_c(dst_c,src,test.count); - scanline_t32cb16blend_mips(dst_asm,src,test.count); - - - if(memcmp(dst_c, dst_asm, sizeof(dst_c)) == 0) - printf("Passed\n"); - else - printf("Failed\n"); - - for(j = 0; j < test.count; ++j) - { - printf("dst_c[%d] = %x, dst_asm[%d] = %x \n", j, dst_c[j], j, dst_asm[j]); - } - } -} - -int main() -{ - scanline_t32cb16blend_test(); - return 0; -} diff --git a/libpixelflinger/tests/arch-mips64/Android.bp b/libpixelflinger/tests/arch-mips64/Android.bp deleted file mode 100644 index ba55d62de..000000000 --- a/libpixelflinger/tests/arch-mips64/Android.bp +++ /dev/null @@ -1,11 +0,0 @@ -cc_defaults { - name: "pixelflinger-tests-mips64", - defaults: ["pixelflinger-tests"], - - enabled: false, - arch: { - mips64: { - enabled: true, - }, - }, -} diff --git a/libpixelflinger/tests/arch-mips64/assembler/Android.bp b/libpixelflinger/tests/arch-mips64/assembler/Android.bp deleted file mode 100644 index b67205328..000000000 --- a/libpixelflinger/tests/arch-mips64/assembler/Android.bp +++ /dev/null @@ -1,9 +0,0 @@ -cc_test { - name: "test-pixelflinger-mips64-assembler-test", - defaults: ["pixelflinger-tests-mips64"], - - srcs: [ - "mips64_assembler_test.cpp", - "asm_mips_test_jacket.S", - ], -} diff --git a/libpixelflinger/tests/arch-mips64/assembler/asm_mips_test_jacket.S b/libpixelflinger/tests/arch-mips64/assembler/asm_mips_test_jacket.S deleted file mode 100644 index 705ee9bcf..000000000 --- a/libpixelflinger/tests/arch-mips64/assembler/asm_mips_test_jacket.S +++ /dev/null @@ -1,93 +0,0 @@ -# /* -# * Copyright (C) 2015 The Android Open Source Project -# * All rights reserved. -# * -# * Redistribution and use in source and binary forms, with or without -# * modification, are permitted provided that the following conditions -# * are met: -# * * Redistributions of source code must retain the above copyright -# * notice, this list of conditions and the following disclaimer. -# * * Redistributions in binary form must reproduce the above copyright -# * notice, this list of conditions and the following disclaimer in -# * the documentation and/or other materials provided with the -# * distribution. -# * -# * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -# * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# * SUCH DAMAGE. -# */ - - .text - .balign 8 - - .global asm_mips_test_jacket - - # // Set the register - # // Calls the asm function - # // Reads the register values to output register - - # // Parameters - # // a0 - Function to jump - # // a1 - register values array - # // a2 - flag values array -asm_mips_test_jacket: - # // Save registers to stack - daddiu $sp, $sp, -96 - sd $s0, 64($sp) - sd $s1, 72($sp) - sd $s2, 80($sp) - sd $ra, 88($sp) - - move $s0, $a0 - move $s1, $a1 - move $s2, $a2 - - ld $v0, 16($s1) - ld $v1, 24($s1) - ld $a0, 32($s1) - ld $a1, 40($s1) - ld $a2, 48($s1) - ld $a3, 56($s1) - ld $a4, 64($s1) - ld $a5, 72($s1) - ld $a6, 80($s1) - ld $a7, 88($s1) - ld $t0, 96($s1) - ld $t1, 104($s1) - ld $t2, 112($s1) - ld $t3, 120($s1) - - jal $s0 - - sd $v0, 16($s1) - sd $v1, 24($s1) - sd $a0, 32($s1) - sd $a1, 40($s1) - sd $a2, 48($s1) - sd $a3, 56($s1) - sd $a4, 64($s1) - sd $a5, 72($s1) - sd $a6, 80($s1) - sd $a7, 88($s1) - sd $t0, 96($s1) - sd $t1, 104($s1) - sd $t2, 112($s1) - sd $t3, 120($s1) - - ld $s0, 64($sp) - ld $s1, 72($sp) - ld $s2, 80($sp) - ld $ra, 88($sp) - - daddiu $sp, $sp, 96 - - j $ra diff --git a/libpixelflinger/tests/arch-mips64/assembler/mips64_assembler_test.cpp b/libpixelflinger/tests/arch-mips64/assembler/mips64_assembler_test.cpp deleted file mode 100644 index 9fb0a2802..000000000 --- a/libpixelflinger/tests/arch-mips64/assembler/mips64_assembler_test.cpp +++ /dev/null @@ -1,643 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#define __STDC_FORMAT_MACROS -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "codeflinger/ARMAssemblerInterface.h" -#include "codeflinger/MIPS64Assembler.h" - -using namespace android; - -#define TESTS_DATAOP_ENABLE 1 -#define TESTS_DATATRANSFER_ENABLE 1 -#define ASSEMBLY_SCRATCH_SIZE 4096 - -void *instrMem; -uint32_t instrMemSize = 128 * 1024; -char dataMem[8192]; - -typedef void (*asm_function_t)(); -extern "C" void asm_mips_test_jacket(asm_function_t function, - int64_t regs[], int32_t flags[]); - -#define MAX_32BIT (uint32_t)(((uint64_t)1 << 32) - 1) -#define MAX_64BIT ((uint64_t)0xFFFFFFFFFFFFFFFF) -const uint32_t NA = 0; -const uint32_t NUM_REGS = 32; -const uint32_t NUM_FLAGS = 16; - -enum instr_t -{ - INSTR_ADD, - INSTR_SUB, - INSTR_AND, - INSTR_ORR, - INSTR_RSB, - INSTR_BIC, - INSTR_CMP, - INSTR_MOV, - INSTR_MVN, - INSTR_MUL, - INSTR_MLA, - INSTR_SMULBB, - INSTR_SMULBT, - INSTR_SMULTB, - INSTR_SMULTT, - INSTR_SMULWB, - INSTR_SMULWT, - INSTR_SMLABB, - INSTR_UXTB16, - INSTR_UBFX, - INSTR_ADDR_ADD, - INSTR_ADDR_SUB, - INSTR_LDR, - INSTR_LDRB, - INSTR_LDRH, - INSTR_ADDR_LDR, - INSTR_LDM, - INSTR_STR, - INSTR_STRB, - INSTR_STRH, - INSTR_ADDR_STR, - INSTR_STM -}; - -enum shift_t -{ - SHIFT_LSL, - SHIFT_LSR, - SHIFT_ASR, - SHIFT_ROR, - SHIFT_NONE -}; - -enum offset_t -{ - REG_SCALE_OFFSET, - REG_OFFSET, - IMM8_OFFSET, - IMM12_OFFSET, - NO_OFFSET -}; - -enum cond_t -{ - EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL, NV, - HS = CS, - LO = CC -}; - -const char * cc_code[] = -{ - "EQ", "NE", "CS", "CC", "MI", "PL", "VS", "VC", - "HI", "LS","GE","LT", "GT", "LE", "AL", "NV" -}; - -struct condTest_t -{ - int mode; - int32_t Rcond1; - int32_t Rcond2; - uint64_t Rcond1Value; - uint64_t Rcond2Value; -}; - - -struct dataOpTest_t -{ - uint32_t id; - instr_t op; - condTest_t preCond; - cond_t cond; - bool setFlags; - uint64_t RnValue; - uint64_t RsValue; - bool immediate; - uint32_t immValue; - uint64_t RmValue; - uint32_t shiftMode; - uint32_t shiftAmount; - uint64_t RdValue; - bool checkRd; - uint64_t postRdValue; -}; - -struct dataTransferTest_t -{ - uint32_t id; - instr_t op; - uint32_t preFlag; - cond_t cond; - bool setMem; - uint64_t memOffset; - uint64_t memValue; - uint64_t RnValue; - offset_t offsetType; - uint64_t RmValue; - uint32_t immValue; - bool writeBack; - bool preIndex; - bool postIndex; - uint64_t RdValue; - uint64_t postRdValue; - uint64_t postRnValue; - bool checkMem; - uint64_t postMemOffset; - uint32_t postMemLength; - uint64_t postMemValue; -}; - - -dataOpTest_t dataOpTests [] = -{ - {0xA000,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT,NA,NA,NA,NA,1,0}, - {0xA001,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT-1,NA,NA,NA,NA,1,MAX_64BIT}, - {0xA002,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,NA,MAX_32BIT,NA,NA,NA,1,0}, - {0xA003,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,NA,MAX_32BIT-1,NA,NA,NA,1,MAX_64BIT}, - {0xA004,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL, 0,NA,1,0}, - {0xA005,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,31,NA,1,0xFFFFFFFF80000001}, - {0xA006,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,3,SHIFT_LSR,1,NA,1,2}, - {0xA007,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSR,31,NA,1,2}, - {0xA008,INSTR_ADD,{0,0,0,0,0},AL,0,0,NA,0,0,3,SHIFT_ASR,1,NA,1,1}, - {0xA009,INSTR_ADD,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_64BIT,SHIFT_ASR,31,NA,1,0}, - {0xA010,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT,0,0,0,NA,1,1}, - {0xA011,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT-1,0,0,0,NA,1,0}, - {0xA012,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,0,0,NA,1,1}, - {0xA013,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT-1,0,0,NA,1,0}, - {0xA014,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,0,NA,1,1}, - {0xA015,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,31,NA,1,0}, - {0xA016,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,3,SHIFT_LSR,1,NA,1,1}, - {0xA017,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSR,31,NA,1,1}, - {0xA018,INSTR_AND,{0,0,0,0,0},AL,0,0,NA,0,0,3,SHIFT_ASR,1,NA,1,0}, - {0xA019,INSTR_AND,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_ASR,31,NA,1,1}, - {0xA020,INSTR_ORR,{0,0,0,0,0},AL,0,3,NA,1,MAX_32BIT,0,0,0,NA,1,MAX_64BIT}, - {0xA021,INSTR_ORR,{0,0,0,0,0},AL,0,2,NA,1,MAX_32BIT-1,0,0,0,NA,1,MAX_64BIT-1}, - {0xA022,INSTR_ORR,{0,0,0,0,0},AL,0,3,NA,0,0,MAX_32BIT,0,0,NA,1,MAX_64BIT}, - {0xA023,INSTR_ORR,{0,0,0,0,0},AL,0,2,NA,0,0,MAX_32BIT-1,0,0,NA,1,MAX_64BIT-1}, - {0xA024,INSTR_ORR,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,0,NA,1,MAX_64BIT}, - {0xA025,INSTR_ORR,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,SHIFT_LSL,31,NA,1,0xFFFFFFFF80000001}, - {0xA026,INSTR_ORR,{0,0,0,0,0},AL,0,1,NA,0,0,3,SHIFT_LSR,1,NA,1,1}, - {0xA027,INSTR_ORR,{0,0,0,0,0},AL,0,0,NA,0,0,MAX_32BIT,SHIFT_LSR,31,NA,1,1}, - {0xA028,INSTR_ORR,{0,0,0,0,0},AL,0,0,NA,0,0,3,SHIFT_ASR,1,NA,1,1}, - {0xA029,INSTR_ORR,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_64BIT,SHIFT_ASR,31,NA,1,MAX_64BIT}, - {0xA030,INSTR_CMP,{0,0,0,0,0},AL,1,0x10000,NA,1,0x10000,0,0,0,NA,0,0}, - {0xA031,INSTR_MUL,{0,0,0,0,0},AL,0,0,0x10000,0,0,0x10000,0,0,NA,1,0}, - {0xA032,INSTR_MUL,{0,0,0,0,0},AL,0,0,0x1000,0,0,0x10000,0,0,NA,1,0x10000000}, - {0xA033,INSTR_MUL,{0,0,0,0,0},AL,0,0,MAX_32BIT,0,0,1,0,0,NA,1,MAX_64BIT}, - {0xA034,INSTR_MLA,{0,0,0,0,0},AL,0,0x10000,0x10000,0,0,0x10000,0,0,NA,1,0x10000}, - {0xA035,INSTR_MLA,{0,0,0,0,0},AL,0,0x10000,0x1000,0,0,0x10000,0,0,NA,1,0x10010000}, - {0xA036,INSTR_SUB,{1,R_v1,R_a6,2,4},MI,0,2,NA,0,NA,1,NA,NA,2,1,1}, - {0xA037,INSTR_SUB,{2,R_v1,R_a6,2,0},MI,0,2,NA,0,NA,1,NA,NA,2,1,2}, - {0xA038,INSTR_SUB,{1,R_v1,R_a6,4,2},GE,0,2,NA,1,1,NA,NA,NA,2,1,1}, - {0xA039,INSTR_SUB,{1,R_a5,R_a6,2,7},GE,0,2,NA,1,1,NA,NA,NA,2,1,2}, - {0xA040,INSTR_SUB,{1,R_a5,R_a6,1,1},HS,0,2,NA,1,1,NA,NA,NA,2,1,1}, - {0xA041,INSTR_SUB,{1,R_a5,R_a6,0,1},HS,0,2,NA,1,1,NA,NA,NA,2,1,2}, - {0xA042,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,1,1<< 16,0,0,0,NA,1,UINT64_C(1) -(1<<16)}, - {0xA043,INSTR_SUB,{0,0,0,0,0},AL,0,MAX_32BIT,NA,1,1,0,0,0,NA,1,MAX_64BIT-1}, - {0xA044,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,1,1,0,0,0,NA,1,0}, - {0xA045,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,1<<16,0,0,NA,1,UINT64_C(1) -(1<<16)}, - {0xA046,INSTR_SUB,{0,0,0,0,0},AL,0,MAX_32BIT,NA,0,NA,1,0,0,NA,1,MAX_64BIT-1}, - {0xA047,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,1,0,0,NA,1,0}, - {0xA048,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,1,SHIFT_LSL,16,NA,1,UINT64_C(1) -(1<<16)}, - {0xA049,INSTR_SUB,{0,0,0,0,0},AL,0,0x80000001,NA,0,NA,MAX_32BIT,SHIFT_LSL,31,NA,1,1}, - {0xA050,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,3,SHIFT_LSR,1,NA,1,0}, - {0xA051,INSTR_SUB,{0,0,0,0,0},AL,0,1,NA,0,NA,MAX_32BIT,SHIFT_LSR,31,NA,1,0}, - {0xA052,INSTR_RSB,{1,R_a5,R_a6,4,1},GE,0,2,NA,1,0,NA,NA,NA,2,1,UINT64_C(-2)}, - {0xA053,INSTR_RSB,{1,R_a5,R_a6,UINT64_C(-1),1},GE,0,2,NA,1,0,NA,NA,NA,2,1,2}, - {0xA054,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,1,1<<16,NA,NA,NA,NA,1,(1<<16)-1}, - {0xA055,INSTR_RSB,{0,0,0,0,0},AL,0,MAX_32BIT,NA,1,1,NA,NA,NA,NA,1,UINT64_C(1)-MAX_64BIT}, - {0xA056,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,1,1,NA,NA,NA,NA,1,0}, - {0xA057,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,1<<16,0,0,NA,1,(1<<16)-1}, - {0xA058,INSTR_RSB,{0,0,0,0,0},AL,0,MAX_32BIT,NA,0,NA,1,0,0,NA,1,UINT64_C(1)-MAX_64BIT}, - {0xA059,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,1,0,0,NA,1,0}, - {0xA060,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,1,SHIFT_LSL,16,NA,1,(1<<16)-1}, - {0xA061,INSTR_RSB,{0,0,0,0,0},AL,0,0x80000001,NA,0,NA,MAX_32BIT ,SHIFT_LSL,31,NA,1,UINT64_C(-1)}, - {0xA062,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,3,SHIFT_LSR,1,NA,1,0}, - {0xA063,INSTR_RSB,{0,0,0,0,0},AL,0,1,NA,0,NA,MAX_32BIT,SHIFT_LSR,31,NA,1,0}, - {0xA064,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,1,0x80000001,NA,NA,NA,NA,1,0xFFFFFFFF80000001}, - {0xA065,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,0x80000001,0,0,NA,1,0xFFFFFFFF80000001}, - {0xA066,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,NA,1,MAX_64BIT-1}, - {0xA067,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,31,NA,1,0xFFFFFFFF80000000}, - {0xA068,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,3,SHIFT_LSR,1,NA,1,1}, - {0xA069,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSR,31,NA,1,1}, - {0xA070,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,3,SHIFT_ASR,1,NA,1,1}, - {0xA071,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,MAX_64BIT ,SHIFT_ASR,31,NA,1,MAX_64BIT}, - {0xA072,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,3,SHIFT_ROR,1,NA,1,0xFFFFFFFF80000001}, - {0xA073,INSTR_MOV,{0,0,0,0,0},AL,0,NA,NA,0,0,0x80000001,SHIFT_ROR,31,NA,1,3}, - {0xA074,INSTR_MOV,{0,0,0,0,0},AL,1,NA,NA,0,0,MAX_64BIT -1,SHIFT_ASR,1,NA,1,MAX_64BIT}, - {0xA075,INSTR_MOV,{0,0,0,0,0},AL,1,NA,NA,0,0,3,SHIFT_ASR,1,NA,1,1}, - {0xA076,INSTR_MOV,{2,R_a5,R_a6,6,8},MI,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2}, - {0xA077,INSTR_MOV,{2,R_a5,R_a6,UINT64_C(-4),UINT64_C(-8)},MI,0,NA,NA,0,0,0x80000001,0,0,2,1,0xFFFFFFFF80000001}, - {0xA078,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-1)},LT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2}, - {0xA079,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},LT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0xFFFFFFFF80000001}, - {0xA080,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-5)},GE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,2,1,MAX_64BIT-1}, - {0xA081,INSTR_MOV,{1,R_a5,R_a6,5,5},GE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,31,2,1,0xFFFFFFFF80000000}, - {0xA082,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},GE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,31,2,1,2}, - {0xA083,INSTR_MOV,{1,R_a5,R_a6,4,1},LE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,2,1,2}, - {0xA084,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-1)},LE,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0xFFFFFFFF80000001}, - {0xA085,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},LE,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,31,2,1,0xFFFFFFFF80000000}, - {0xA086,INSTR_MOV,{1,R_a5,R_a6,1,1},GT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2}, - {0xA087,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-3)},GT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0xFFFFFFFF80000001}, - {0xA088,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),0},GT,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2}, - {0xA089,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),UINT64_C(-1)},GT,0,NA,NA,0,0,0x80000001,0,0,2,1,2}, - {0xA090,INSTR_MOV,{1,R_a5,R_a6,6,1},GT,0,NA,NA,0,0,0x80000001,0,0,2,1,0xFFFFFFFF80000001}, - {0xA091,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},GT,0,NA,NA,0,0,0x80000001,0,0,2,1,2}, - {0xA092,INSTR_MOV,{1,R_a5,R_a6,1,1},GT,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,2,1,2}, - {0xA093,INSTR_MOV,{1,R_a5,R_a6,4,1},GT,0,NA,NA,0,0,MAX_32BIT,SHIFT_LSL,1,2,1,MAX_64BIT-1}, - {0xA094,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},GT,0,NA,NA,0,0,MAX_32BIT ,SHIFT_LSL,1,2,1,2}, - {0xA095,INSTR_MOV,{1,R_a5,R_a6,1,UINT64_C(-1)},HS,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,2}, - {0xA096,INSTR_MOV,{1,R_a5,R_a6,UINT64_C(-1),1},HS,0,NA,NA,1,0x80000001,NA,NA,NA,2,1,0xFFFFFFFF80000001}, - {0xA097,INSTR_MVN,{1,R_a5,R_a6,1,4},HS,0,NA,NA,1,MAX_32BIT-1,NA,NA,NA,2,1,2}, - {0xA098,INSTR_MVN,{1,R_a5,R_a6,UINT64_C(-1),1},HS,0,NA,NA,1,MAX_32BIT-1,NA,NA,NA,2,1,1}, - {0xA099,INSTR_MVN,{0,0,0,0,0},AL,0,NA,NA,1,0,NA,NA,NA,2,1,MAX_64BIT}, - {0xA100,INSTR_MVN,{0,0,0,0,0},AL,0,NA,NA,0,NA,MAX_32BIT-1,NA,0,2,1,1}, - {0xA101,INSTR_MVN,{0,0,0,0,0},AL,0,NA,NA,0,NA,0x80000001,NA,0,2,1,0x7FFFFFFE}, - {0xA102,INSTR_BIC,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT,NA,NA,NA,NA,1,0}, - {0xA103,INSTR_BIC,{0,0,0,0,0},AL,0,1,NA,1,MAX_32BIT-1,NA,NA,NA,NA,1,1}, - {0xA104,INSTR_BIC,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT,0,0,NA,1,0}, - {0xA105,INSTR_BIC,{0,0,0,0,0},AL,0,1,NA,0,0,MAX_32BIT-1,0,0,NA,1,1}, - {0xA106,INSTR_BIC,{0,0,0,0,0},AL,0,0xF0,NA,0,0,3,SHIFT_ASR,1,NA,1,0xF0}, - {0xA107,INSTR_BIC,{0,0,0,0,0},AL,0,0xF0,NA,0,0,MAX_64BIT,SHIFT_ASR,31,NA,1,0}, - {0xA108,INSTR_SMULBB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFABCD0001,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA109,INSTR_SMULBB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFABCD0FFF,NA,NA,NA,1,0x00000FFF}, - {0xA110,INSTR_SMULBB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFABCDFFFF,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA111,INSTR_SMULBB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFABCDFFFF,NA,NA,NA,1,1}, - {0xA112,INSTR_SMULBT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0xFFFFFFFFABCD0001,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA113,INSTR_SMULBT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0xFFFFFFFFABCD0FFF,NA,NA,NA,1,0x00000FFF}, - {0xA114,INSTR_SMULBT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0xFFFFFFFFABCDFFFF,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA115,INSTR_SMULBT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0xFFFFFFFFABCDFFFF,NA,NA,NA,1,1}, - {0xA116,INSTR_SMULTB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0x000000000001ABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA117,INSTR_SMULTB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0x000000000FFFABCD,NA,NA,NA,1,0x00000FFF}, - {0xA118,INSTR_SMULTB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA119,INSTR_SMULTB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,1}, - {0xA120,INSTR_SMULTT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0x000000000001ABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA121,INSTR_SMULTT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0x000000000FFFABCD,NA,NA,NA,1,0x00000FFF}, - {0xA122,INSTR_SMULTT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA123,INSTR_SMULTT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,1}, - {0xA124,INSTR_SMULWB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0x000000000001ABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFE}, - {0xA125,INSTR_SMULWB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0x000000000FFFABCD,NA,NA,NA,1,0x00000FFF}, - {0xA126,INSTR_SMULWB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA127,INSTR_SMULWB,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0}, - {0xA128,INSTR_SMULWT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0x000000000001ABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFE}, - {0xA129,INSTR_SMULWT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0x000000000FFFABCD,NA,NA,NA,1,0x00000FFF}, - {0xA130,INSTR_SMULWT,{0,0,0,0,0},AL,0,NA,0x000000000001ABCD,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0xFFFFFFFFFFFFFFFF}, - {0xA131,INSTR_SMULWT,{0,0,0,0,0},AL,0,NA,0xFFFFFFFFFFFFABCD,0,NA,0xFFFFFFFFFFFFABCD,NA,NA,NA,1,0}, - {0xA132,INSTR_SMLABB,{0,0,0,0,0},AL,0,1,0xFFFFFFFFABCDFFFF,0,NA,0xFFFFFFFFABCD0001,NA,NA,NA,1,0}, - {0xA133,INSTR_SMLABB,{0,0,0,0,0},AL,0,1,0xFFFFFFFFABCD0001,0,NA,0xFFFFFFFFABCD0FFF,NA,NA,NA,1,0x00001000}, - {0xA134,INSTR_SMLABB,{0,0,0,0,0},AL,0,0xFFFFFFFFFFFFFFFF,0xFFFFFFFFABCD0001,0,NA,0xABCDFFFF,NA,NA,NA,1,0xFFFFFFFFFFFFFFFE}, - {0xA135,INSTR_SMLABB,{0,0,0,0,0},AL,0,0xFFFFFFFFFFFFFFFF,0xFFFFFFFFABCDFFFF,0,NA,0xABCDFFFF,NA,NA,NA,1,0}, - {0xA136,INSTR_UXTB16,{0,0,0,0,0},AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,0,NA,1,0x00CD0001}, - {0xA137,INSTR_UXTB16,{0,0,0,0,0},AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,1,NA,1,0x00AB00EF}, - {0xA138,INSTR_UXTB16,{0,0,0,0,0},AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,2,NA,1,0x000100CD}, - {0xA139,INSTR_UXTB16,{0,0,0,0,0},AL,0,NA,NA,0,NA,0xABCDEF01,SHIFT_ROR,3,NA,1,0x00EF00AB}, - {0xA140,INSTR_ADDR_ADD,{0,0,0,0,0},AL,0,0xCFFFFFFFF,NA,0,NA,0x1,SHIFT_LSL,1,NA,1,0xD00000001}, - {0xA141,INSTR_ADDR_ADD,{0,0,0,0,0},AL,0,0x01,NA,0,NA,0x1,SHIFT_LSL,2,NA,1,0x5}, - {0xA142,INSTR_ADDR_ADD,{0,0,0,0,0},AL,0,0xCFFFFFFFF,NA,0,NA,0x1,NA,0,NA,1,0xD00000000}, - {0xA143,INSTR_ADDR_SUB,{0,0,0,0,0},AL,0,0xD00000001,NA,0,NA,0x010000,SHIFT_LSR,15,NA,1,0xCFFFFFFFF}, - {0xA144,INSTR_ADDR_SUB,{0,0,0,0,0},AL,0,0xCFFFFFFFF,NA,0,NA,0x020000,SHIFT_LSR,15,NA,1,0xCFFFFFFFB}, - {0xA145,INSTR_ADDR_SUB,{0,0,0,0,0},AL,0,3,NA,0,NA,0x010000,SHIFT_LSR,15,NA,1,1}, -}; - -dataTransferTest_t dataTransferTests [] = -{ - {0xB000,INSTR_LDR,AL,AL,1,24,0xABCDEF0123456789,0,REG_SCALE_OFFSET,24,NA,NA,NA,NA,NA,0x23456789,0,0,NA,NA,NA}, - {0xB001,INSTR_LDR,AL,AL,1,0,0xABCDEF0123456789,0,IMM12_OFFSET,NA,4,1,0,1,NA,0x23456789,4,0,NA,NA,NA}, - {0xB002,INSTR_LDR,AL,AL,1,0,0xABCDEF0123456789,0,NO_OFFSET,NA,NA,0,0,0,NA,0x23456789,0,0,NA,NA,NA}, - {0xB003,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,0,REG_SCALE_OFFSET,4064,NA,NA,NA,NA,NA,0x89,0,0,NA,NA,NA}, - {0xB004,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,0,0,1,0,NA,0x67,4065,0,NA,NA,NA}, - {0xB005,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,1,0,1,0,NA,0x45,4065,0,NA,NA,NA}, - {0xB006,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,2,0,1,0,NA,0x23,4065,0,NA,NA,NA}, - {0xB007,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,4065,IMM12_OFFSET,NA,1,1,0,1,NA,0x67,4066,0,NA,NA,NA}, - {0xB008,INSTR_LDRB,AL,AL,1,4064,0xABCDEF0123456789,0,NO_OFFSET,NA,NA,0,0,0,NA,0x89,0,0,NA,NA,NA}, - {0xB009,INSTR_LDRH,AL,AL,1,0,0xABCDEF0123456789,0,IMM8_OFFSET,NA,2,1,0,1,NA,0x6789,2,0,NA,NA,NA}, - {0xB010,INSTR_LDRH,AL,AL,1,4064,0xABCDEF0123456789,0,REG_OFFSET,4064,0,0,1,0,NA,0x6789,0,0,NA,NA,NA}, - {0xB011,INSTR_LDRH,AL,AL,1,4064,0xABCDEF0123456789,0,REG_OFFSET,4066,0,0,1,0,NA,0x2345,0,0,NA,NA,NA}, - {0xB012,INSTR_LDRH,AL,AL,1,0,0xABCDEF0123456789,0,NO_OFFSET,NA,0,0,0,0,NA,0x6789,0,0,NA,NA,NA}, - {0xB013,INSTR_LDRH,AL,AL,1,0,0xABCDEF0123456789,2,NO_OFFSET,NA,0,0,0,0,NA,0x2345,2,0,NA,NA,NA}, - {0xB014,INSTR_STR,AL,AL,1,2,0xDEADBEEFDEADBEEF,4,IMM12_OFFSET,NA,4,1,0,1,0xABCDEF0123456789,0xABCDEF0123456789,8,1,2,8,0xDEAD23456789BEEF}, - {0xB015,INSTR_STR,AL,AL,1,2,0xDEADBEEFDEADBEEF,4,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4,1,2,8,0xDEAD23456789BEEF}, - {0xB016,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,0,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEFDEAD89EF}, - {0xB017,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,1,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEFDE89BEEF}, - {0xB018,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,2,0,1,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEF89ADBEEF}, - {0xB019,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,IMM12_OFFSET,NA,4,1,0,1,0xABCDEF0123456789,0xABCDEF0123456789,5,1,0,8,0xDEADBEEFDEAD89EF}, - {0xB020,INSTR_STRB,AL,AL,1,0,0xDEADBEEFDEADBEEF,1,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,1,1,0,8,0xDEADBEEFDEAD89EF}, - {0xB021,INSTR_STRH,AL,AL,1,4066,0xDEADBEEFDEADBEEF,4070,IMM8_OFFSET,NA,2,1,0,1,0xABCDEF0123456789,0xABCDEF0123456789,4072,1,4066,8,0xDEAD6789DEADBEEF}, - {0xB022,INSTR_STRH,AL,AL,1,4066,0xDEADBEEFDEADBEEF,4070,NO_OFFSET,NA,NA,0,0,0,0xABCDEF0123456789,0xABCDEF0123456789,4070,1,4066,8,0xDEAD6789DEADBEEF}, -}; - - -void flushcache() -{ - const long base = long(instrMem); - const long curr = base + long(instrMemSize); - __builtin___clear_cache((char*)base, (char*)curr); -} - -void dataOpTest(dataOpTest_t test, ArmToMips64Assembler *a64asm, uint32_t Rd = R_v1, - uint32_t Rn = R_t0, uint32_t Rm = R_t1, uint32_t Rs = R_t2) -{ - int64_t regs[NUM_REGS] = {0}; - int32_t flags[NUM_FLAGS] = {0}; - int64_t savedRegs[NUM_REGS] = {0}; - uint32_t i; - uint32_t op2; - - for(i = 0; i < NUM_REGS; ++i) - { - regs[i] = i; - } - - regs[Rd] = test.RdValue; - regs[Rn] = test.RnValue; - regs[Rs] = test.RsValue; - a64asm->reset(); - if (test.preCond.mode) { - a64asm->set_condition(test.preCond.mode, test.preCond.Rcond1, test.preCond.Rcond2); - regs[test.preCond.Rcond1] = test.preCond.Rcond1Value; - regs[test.preCond.Rcond2] = test.preCond.Rcond2Value; - } - a64asm->prolog(); - if(test.immediate == true) - { - op2 = a64asm->imm(test.immValue); - } - else if(test.immediate == false && test.shiftAmount == 0) - { - op2 = Rm; - regs[Rm] = (int64_t)((int32_t)(test.RmValue)); - } - else - { - op2 = a64asm->reg_imm(Rm, test.shiftMode, test.shiftAmount); - regs[Rm] = (int64_t)((int32_t)(test.RmValue)); - } - switch(test.op) - { - case INSTR_ADD: a64asm->ADD(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_SUB: a64asm->SUB(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_RSB: a64asm->RSB(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_AND: a64asm->AND(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_ORR: a64asm->ORR(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_BIC: a64asm->BIC(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_MUL: a64asm->MUL(test.cond, test.setFlags, Rd,Rm,Rs); break; - case INSTR_MLA: a64asm->MLA(test.cond, test.setFlags, Rd,Rm,Rs,Rn); break; - case INSTR_CMP: a64asm->CMP(test.cond, Rn,op2); break; - case INSTR_MOV: a64asm->MOV(test.cond, test.setFlags,Rd,op2); break; - case INSTR_MVN: a64asm->MVN(test.cond, test.setFlags,Rd,op2); break; - case INSTR_SMULBB:a64asm->SMULBB(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULBT:a64asm->SMULBT(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULTB:a64asm->SMULTB(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULTT:a64asm->SMULTT(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULWB:a64asm->SMULWB(test.cond, Rd,Rm,Rs); break; - case INSTR_SMULWT:a64asm->SMULWT(test.cond, Rd,Rm,Rs); break; - case INSTR_SMLABB:a64asm->SMLABB(test.cond, Rd,Rm,Rs,Rn); break; - case INSTR_UXTB16:a64asm->UXTB16(test.cond, Rd,Rm,test.shiftAmount); break; - case INSTR_ADDR_ADD: a64asm->ADDR_ADD(test.cond, test.setFlags, Rd,Rn,op2); break; - case INSTR_ADDR_SUB: a64asm->ADDR_SUB(test.cond, test.setFlags, Rd,Rn,op2); break; - default: printf("Error"); return; - } - a64asm->epilog(0); - a64asm->fix_branches(); - flushcache(); - - asm_function_t asm_function = (asm_function_t)(instrMem); - - for(i = 0; i < NUM_REGS; ++i) - savedRegs[i] = regs[i]; - - asm_mips_test_jacket(asm_function, regs, flags); - - /* Check if all regs except Rd is same */ - for(i = 0; i < NUM_REGS; ++i) - { - if((i == Rd) || i == 2) continue; - if(regs[i] != savedRegs[i]) - { - printf("Test %x failed Reg(%d) tampered Expected(0x%" PRIx64 ")," - "Actual(0x%" PRIx64 ") t\n", test.id, i, savedRegs[i], - regs[i]); - exit(0); - return; - } - } - - if(test.checkRd == 1 && regs[Rd] != test.postRdValue) - { - printf("Test %x failed, Expected(%" PRIx64 "), Actual(%" PRIx64 ")\n", - test.id, test.postRdValue, regs[Rd]); - exit(0); - } - else - { - printf("Test %x passed\n", test.id); - } -} - - -void dataTransferTest(dataTransferTest_t test, ARMAssemblerInterface *a64asm, - uint32_t Rd = R_v1, uint32_t Rn = R_t0,uint32_t Rm = R_t1) -{ - int64_t regs[NUM_REGS] = {0}; - int64_t savedRegs[NUM_REGS] = {0}; - int32_t flags[NUM_FLAGS] = {0}; - uint32_t i; - for(i = 0; i < NUM_REGS; ++i) - { - regs[i] = i; - } - - uint32_t op2; - - regs[Rd] = test.RdValue; - regs[Rn] = (uint64_t)(&dataMem[test.RnValue]); - regs[Rm] = test.RmValue; - flags[test.preFlag] = 1; - - if(test.setMem == true) - { - unsigned char *mem = (unsigned char *)&dataMem[test.memOffset]; - uint64_t value = test.memValue; - for(int j = 0; j < 8; ++j) - { - mem[j] = value & 0x00FF; - value >>= 8; - } - } - a64asm->reset(); - a64asm->prolog(); - if(test.offsetType == REG_SCALE_OFFSET) - { - op2 = a64asm->reg_scale_pre(Rm); - } - else if(test.offsetType == REG_OFFSET) - { - op2 = a64asm->reg_pre(Rm); - } - else if(test.offsetType == IMM12_OFFSET && test.preIndex == true) - { - op2 = a64asm->immed12_pre(test.immValue, test.writeBack); - } - else if(test.offsetType == IMM12_OFFSET && test.postIndex == true) - { - op2 = a64asm->immed12_post(test.immValue); - } - else if(test.offsetType == IMM8_OFFSET && test.preIndex == true) - { - op2 = a64asm->immed8_pre(test.immValue, test.writeBack); - } - else if(test.offsetType == IMM8_OFFSET && test.postIndex == true) - { - op2 = a64asm->immed8_post(test.immValue); - } - else if(test.offsetType == NO_OFFSET) - { - op2 = a64asm->__immed12_pre(0); - } - else - { - printf("Error - Unknown offset\n"); return; - } - - switch(test.op) - { - case INSTR_LDR: a64asm->LDR(test.cond, Rd,Rn,op2); break; - case INSTR_LDRB: a64asm->LDRB(test.cond, Rd,Rn,op2); break; - case INSTR_LDRH: a64asm->LDRH(test.cond, Rd,Rn,op2); break; - case INSTR_ADDR_LDR: a64asm->ADDR_LDR(test.cond, Rd,Rn,op2); break; - case INSTR_STR: a64asm->STR(test.cond, Rd,Rn,op2); break; - case INSTR_STRB: a64asm->STRB(test.cond, Rd,Rn,op2); break; - case INSTR_STRH: a64asm->STRH(test.cond, Rd,Rn,op2); break; - case INSTR_ADDR_STR: a64asm->ADDR_STR(test.cond, Rd,Rn,op2); break; - default: printf("Error"); return; - } - a64asm->epilog(0); - flushcache(); - - asm_function_t asm_function = (asm_function_t)(instrMem); - - for(i = 0; i < NUM_REGS; ++i) - savedRegs[i] = regs[i]; - - asm_mips_test_jacket(asm_function, regs, flags); - - /* Check if all regs except Rd/Rn are same */ - for(i = 0; i < NUM_REGS; ++i) - { - if(i == Rd || i == Rn || i == R_v0) continue; - - if(regs[i] != savedRegs[i]) - { - printf("Test %x failed Reg(%d) tampered" - " Expected(0x%" PRIx64 "), Actual(0x%" PRIx64 ") t\n", - test.id, i, savedRegs[i], regs[i]); - return; - } - } - - if((uint64_t)regs[Rd] != test.postRdValue) - { - printf("Test %x failed, " - "Expected in Rd(0x%" PRIx64 "), Actual(0x%" PRIx64 ")\n", - test.id, test.postRdValue, regs[Rd]); - } - else if((uint64_t)regs[Rn] != (uint64_t)(&dataMem[test.postRnValue])) - { - printf("Test %x failed, " - "Expected in Rn(0x%" PRIx64 "), Actual(0x%" PRIx64 ")\n", - test.id, test.postRnValue, regs[Rn] - (uint64_t)dataMem); - } - else if(test.checkMem == true) - { - unsigned char *addr = (unsigned char *)&dataMem[test.postMemOffset]; - uint64_t value; - value = 0; - for(uint32_t j = 0; j < test.postMemLength; ++j) - value = (value << 8) | addr[test.postMemLength-j-1]; - if(value != test.postMemValue) - { - printf("Test %x failed, " - "Expected in Mem(0x%" PRIx64 "), Actual(0x%" PRIx64 ")\n", - test.id, test.postMemValue, value); - } - else - { - printf("Test %x passed\n", test.id); - } - } - else - { - printf("Test %x passed\n", test.id); - } -} - -int main(void) -{ - uint32_t i; - - /* Allocate memory to store instructions generated by ArmToArm64Assembler */ - { - int fd = ashmem_create_region("code cache", instrMemSize); - if(fd < 0) { - printf("IF < 0\n"); - printf("Creating code cache, ashmem_create_region " - "failed with error '%s'", strerror(errno)); - } - instrMem = mmap(NULL, instrMemSize, - PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_PRIVATE, fd, 0); - } - - ArmToMips64Assembler a64asm(instrMem); - - if(TESTS_DATAOP_ENABLE) - { - printf("Running data processing tests\n"); - for(i = 0; i < sizeof(dataOpTests)/sizeof(dataOpTest_t); ++i) { - dataOpTest(dataOpTests[i], &a64asm); - } - } - - if(TESTS_DATATRANSFER_ENABLE) - { - printf("Running data transfer tests\n"); - for(i = 0; i < sizeof(dataTransferTests)/sizeof(dataTransferTest_t); ++i) - dataTransferTest(dataTransferTests[i], &a64asm); - } - - return 0; -} diff --git a/libpixelflinger/tests/arch-mips64/col32cb16blend/Android.bp b/libpixelflinger/tests/arch-mips64/col32cb16blend/Android.bp deleted file mode 100644 index bfc6ae9bb..000000000 --- a/libpixelflinger/tests/arch-mips64/col32cb16blend/Android.bp +++ /dev/null @@ -1,6 +0,0 @@ -cc_test { - name: "test-pixelflinger-mips64-col32cb16blend", - defaults: ["pixelflinger-tests-mips64"], - - srcs: ["col32cb16blend_test.c"], -} diff --git a/libpixelflinger/tests/arch-mips64/col32cb16blend/col32cb16blend_test.c b/libpixelflinger/tests/arch-mips64/col32cb16blend/col32cb16blend_test.c deleted file mode 100644 index 066eab679..000000000 --- a/libpixelflinger/tests/arch-mips64/col32cb16blend/col32cb16blend_test.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - - -#define ARGB_8888_MAX 0xFFFFFFFF -#define ARGB_8888_MIN 0x00000000 -#define RGB_565_MAX 0xFFFF -#define RGB_565_MIN 0x0000 - -struct test_t -{ - char name[256]; - uint32_t src_color; - uint16_t dst_color; - size_t count; -}; - -struct test_t tests[] = -{ - {"Count 1, Src=Max, Dst=Min", ARGB_8888_MAX, RGB_565_MIN, 1}, - {"Count 2, Src=Min, Dst=Max", ARGB_8888_MIN, RGB_565_MAX, 2}, - {"Count 3, Src=Max, Dst=Max", ARGB_8888_MAX, RGB_565_MAX, 3}, - {"Count 4, Src=Min, Dst=Min", ARGB_8888_MAX, RGB_565_MAX, 4}, - {"Count 1, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 1}, - {"Count 2, Src=Rand, Dst=Rand", 0xABCDEF12, 0x2345, 2}, - {"Count 3, Src=Rand, Dst=Rand", 0x11111111, 0xEDFE, 3}, - {"Count 4, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 4}, - {"Count 5, Src=Rand, Dst=Rand", 0xEFEFFEFE, 0xFACC, 5}, - {"Count 10, Src=Rand, Dst=Rand", 0x12345678, 0x9ABC, 10} -}; - -void scanline_col32cb16blend_mips64(uint16_t *dst, uint32_t src, size_t count); -void scanline_col32cb16blend_c(uint16_t * dst, uint32_t src, size_t count) -{ - uint32_t srcAlpha = (src>>24); - uint32_t f = 0x100 - (srcAlpha + (srcAlpha>>7)); - - while (count--) - { - uint16_t d = *dst; - int dstR = (d>>11)&0x1f; - int dstG = (d>>5)&0x3f; - int dstB = (d)&0x1f; - int srcR = (src >> ( 3))&0x1F; - int srcG = (src >> ( 8+2))&0x3F; - int srcB = (src >> (16+3))&0x1F; - srcR += (f*dstR)>>8; - srcG += (f*dstG)>>8; - srcB += (f*dstB)>>8; - *dst++ = (uint16_t)((srcR<<11)|(srcG<<5)|srcB); - } -} - -void scanline_col32cb16blend_test() -{ - uint16_t dst_c[16], dst_asm[16]; - uint32_t i, j; - - for(i = 0; i < sizeof(tests)/sizeof(struct test_t); ++i) - { - struct test_t test = tests[i]; - - printf("Testing - %s:",test.name); - - memset(dst_c, 0, sizeof(dst_c)); - memset(dst_asm, 0, sizeof(dst_asm)); - - for(j = 0; j < test.count; ++j) - { - dst_c[j] = test.dst_color; - dst_asm[j] = test.dst_color; - } - - - scanline_col32cb16blend_c(dst_c, test.src_color, test.count); - scanline_col32cb16blend_mips64(dst_asm, test.src_color, test.count); - - if(memcmp(dst_c, dst_asm, sizeof(dst_c)) == 0) - printf("Passed\n"); - else - printf("Failed\n"); - - for(j = 0; j < test.count; ++j) - { - printf("dst_c[%d] = %x, dst_asm[%d] = %x \n", j, dst_c[j], j, dst_asm[j]); - } - } -} - -int main() -{ - scanline_col32cb16blend_test(); - return 0; -} diff --git a/libpixelflinger/tests/arch-mips64/disassembler/Android.bp b/libpixelflinger/tests/arch-mips64/disassembler/Android.bp deleted file mode 100644 index 96bf9e971..000000000 --- a/libpixelflinger/tests/arch-mips64/disassembler/Android.bp +++ /dev/null @@ -1,6 +0,0 @@ -cc_test { - name: "test-pixelflinger-mips64-disassembler-test", - defaults: ["pixelflinger-tests-mips64"], - - srcs: ["mips64_disassembler_test.cpp"], -} diff --git a/libpixelflinger/tests/arch-mips64/disassembler/mips64_disassembler_test.cpp b/libpixelflinger/tests/arch-mips64/disassembler/mips64_disassembler_test.cpp deleted file mode 100644 index 22efa9fb6..000000000 --- a/libpixelflinger/tests/arch-mips64/disassembler/mips64_disassembler_test.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#include -#include -#include -#include "../../../codeflinger/mips64_disassem.h" - -//typedef uint64_t db_addr_t; -//db_addr_t mips_disassem(db_addr_t loc, char *di_buffer, int alt_format); - -struct test_table_entry_t -{ - uint32_t code; - const char *instr; -}; - -static test_table_entry_t test_table [] = -{ - { 0x00011020, "add\tv0,zero,at" }, - { 0x00832820, "add\ta1,a0,v1" }, - { 0x00c74020, "add\ta4,a2,a3" }, - { 0x012a5820, "add\ta7,a5,a6" }, - { 0x258dffff, "addiu\tt1,t0,-1" }, - { 0x25cf0004, "addiu\tt3,t2,4" }, - { 0x02119021, "addu\ts2,s0,s1" }, - { 0x0274a821, "addu\ts5,s3,s4" }, - { 0x02d7c024, "and\tt8,s6,s7" }, - { 0x333aff00, "andi\tk0,t9,0xff00" }, - { 0x3f7cffff, "aui\tgp,k1,-1" }, - { 0x3c1dffff, "lui\tsp,0xffff" }, - { 0x00e04051, "clo\ta4,a3" }, - { 0x01205050, "clz\ta6,a5" }, - { 0x016c682c, "dadd\tt1,a7,t0" }, - { 0x65cf0008, "daddiu\tt3,t2,8" }, - { 0x0211902d, "daddu\ts2,s0,s1" }, - { 0x7e741403, "dext\ts4,s3,16,3" }, - { 0x7eb6f801, "dextm\ts6,s5,0,64" }, - { 0x7ef87c02, "dextu\tt8,s7,48,16" }, - { 0x7f3a8207, "dins\tk0,t9,8,9" }, - { 0x7f7c0005, "dinsm\tgp,k1,0,33" }, - { 0x7fbe0806, "dinsu\ts8,sp,32,2" }, - { 0x03e1102e, "dsub\tv0,ra,at" }, - { 0x0064282f, "dsubu\ta1,v1,a0" }, - { 0x7cc77a00, "ext\ta3,a2,8,16" }, - { 0x7d09fc04, "ins\ta5,a4,16,16" }, - { 0x00200009, "jr\tat" }, - { 0x00201009, "jalr\tv0,at" }, - { 0x0020f809, "jalr\tat" }, - { 0x8082fff0, "lb\tv0,-16(a0)" }, - { 0x916c0008, "lbu\tt0,8(a7)" }, - { 0xdfa3ffe8, "ld\tv1,-24(sp)" }, - { 0x84850080, "lh\ta1,128(a0)" }, - { 0x94c7ff80, "lhu\ta3,-128(a2)" }, - { 0x8d09000c, "lw\ta5,12(a4)" }, - { 0x9d4bfff4, "lwu\ta7,-12(a6)" }, - { 0x00620898, "mul\tat,v1,v0" }, - { 0x006208d8, "muh\tat,v1,v0" }, - { 0x00620899, "mulu\tat,v1,v0" }, - { 0x006208d9, "muhu\tat,v1,v0" }, - { 0x00000000, "nop" }, - { 0x02329827, "nor\ts3,s1,s2" }, - { 0x0295b025, "or\ts6,s4,s5" }, - { 0x36f0ff00, "ori\ts0,s7,0xff00" }, - { 0x7c03103b, "rdhwr\tv0,v1" }, - { 0x00242a02, "rotr\ta1,a0,8" }, - { 0x00c74046, "rotrv\ta4,a3,a2" }, - { 0xa12afff0, "sb\ta6,-16(a5)" }, - { 0xfd6c0100, "sd\tt0,256(a7)" }, - { 0x7c0d7420, "seb\tt2,t1" }, - { 0x7c0f8620, "seh\ts0,t3" }, - { 0x02329835, "seleqz\ts3,s1,s2" }, - { 0x0295b037, "selnez\ts6,s4,s5" }, - { 0xa6f84000, "sh\tt8,16384(s7)" }, - { 0x0019d100, "sll\tk0,t9,4" }, - { 0x037ce804, "sllv\tsp,gp,k1" }, - { 0x03df082a, "slt\tat,s8,ra" }, - { 0x28430007, "slti\tv1,v0,7" }, - { 0x2c850020, "sltiu\ta1,a0,32" }, - { 0x00c7402b, "sltu\ta4,a2,a3" }, - { 0x00095103, "sra\ta6,a5,4" }, - { 0x016c6807, "srav\tt1,t0,a7" }, - { 0x000e7a02, "srl\tt3,t2,8" }, - { 0x02119006, "srlv\ts2,s1,s0" }, - { 0x0274a822, "sub\ts5,s3,s4" }, - { 0x02d7c023, "subu\tt8,s6,s7" }, - { 0xaf3afffc, "sw\tk0,-4(t9)" }, - { 0x7c1be0a0, "wsbh\tgp,k1" }, - { 0x03bef826, "xor\tra,sp,s8" }, - { 0x3801ffff, "li\tat,0xffff" }, - { 0x3843ffff, "xori\tv1,v0,0xffff" }, -}; - -struct test_branches_table_entry_t -{ - uint32_t code; - const char *instr; - int16_t offset; -}; - -static test_branches_table_entry_t test_branches_table [] = { - { 0x1000ffff, "b\t", static_cast(0xffff) }, - { 0x13df0008, "beq\ts8,ra,", 0x8 }, - { 0x042100ff, "bgez\tat,", 0xff }, - { 0x1c40ff00, "bgtz\tv0,", static_cast(0xff00) }, - { 0x18605555, "blez\tv1,", 0x5555 }, - { 0x0480aaaa, "bltz\ta0,", static_cast(0xaaaa) }, - { 0x14a68888, "bne\ta1,a2,", static_cast(0x8888) }, -}; - -struct test_jump_table_entry_t -{ - uint32_t code; - const char *instr; - int32_t offset; -}; - -static test_jump_table_entry_t test_jump_table [] = { - { 0x0956ae66, "j\t", 0x156ae66 }, - { 0x0d56ae66, "jal\t", 0x156ae66 }, -}; - -int main() -{ - char instr[256]; - uint32_t failed = 0; - - for(uint32_t i = 0; i < sizeof(test_table)/sizeof(test_table_entry_t); ++i) - { - test_table_entry_t *test; - test = &test_table[i]; - mips_disassem(&test->code, instr, 0); - if(strcmp(instr, test->instr) != 0) - { - printf("Test Failed \n" - "Code : 0x%0x\n" - "Expected : %s\n" - "Actual : %s\n", test->code, test->instr, instr); - failed++; - } - } - for(uint32_t i = 0; i < sizeof(test_branches_table)/sizeof(test_branches_table_entry_t); ++i) - { - test_branches_table_entry_t *test; - test = &test_branches_table[i]; - mips_disassem(&test->code, instr, 0); - //printf("DBG code address: %lx\n", (uint64_t)(&test->code)); - uint64_t loc = (uint64_t)test + 4 + (test->offset << 2); - //printf("DBG loc: %lx\n", loc); - char temp[256], address[16]; - strcpy(temp, test->instr); - sprintf(address, "0x%lx", loc); - strcat(temp, address); - if(strcmp(instr, temp) != 0) - { - printf("Test Failed \n" - "Code : 0x%0x\n" - "Expected : %s\n" - "Actual : %s\n", test->code, temp, instr); - failed++; - } - } - for(uint32_t i = 0; i < sizeof(test_jump_table)/sizeof(test_jump_table_entry_t); ++i) - { - test_jump_table_entry_t *test; - test = &test_jump_table[i]; - mips_disassem(&test->code, instr, 0); - //printf("DBG code address: %lx\n", (uint64_t)(&test->code)); - uint64_t loc = ((uint64_t)test & 0xfffffffff0000000) | (test->offset << 2); - //printf("DBG loc: %lx\n", loc); - char temp[256], address[16]; - strcpy(temp, test->instr); - sprintf(address, "0x%08lx", loc); - strcat(temp, address); - if(strcmp(instr, temp) != 0) - { - printf("Test Failed \n" - "Code : 0x%0x\n" - "Expected : '%s'\n" - "Actual : '%s'\n", test->code, temp, instr); - failed++; - } - } - if(failed == 0) - { - printf("All tests PASSED\n"); - return 0; - } - else - { - printf("%d tests FAILED\n", failed); - return -1; - } -} diff --git a/libpixelflinger/tests/codegen/Android.bp b/libpixelflinger/tests/codegen/Android.bp deleted file mode 100644 index 7e4bcfb3c..000000000 --- a/libpixelflinger/tests/codegen/Android.bp +++ /dev/null @@ -1,12 +0,0 @@ -cc_test { - name: "test-opengl-codegen", - defaults: ["pixelflinger-tests"], - - srcs: ["codegen.cpp"], - - arch: { - arm: { - instruction_set: "arm", - }, - }, -} diff --git a/libpixelflinger/tests/codegen/codegen.cpp b/libpixelflinger/tests/codegen/codegen.cpp deleted file mode 100644 index dce4ed72c..000000000 --- a/libpixelflinger/tests/codegen/codegen.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include -#include - -#include "private/pixelflinger/ggl_context.h" - -#include "buffer.h" -#include "scanline.h" - -#include "codeflinger/CodeCache.h" -#include "codeflinger/GGLAssembler.h" -#include "codeflinger/ARMAssembler.h" -#if defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6 -#include "codeflinger/MIPSAssembler.h" -#elif defined(__mips__) && defined(__LP64__) && __mips_isa_rev == 6 -#include "codeflinger/MIPS64Assembler.h" -#endif -#include "codeflinger/Arm64Assembler.h" - -#if defined(__arm__) || (defined(__mips__) && ((!defined(__LP64__) && __mips_isa_rev < 6) || (defined(__LP64__) && __mips_isa_rev == 6))) || defined(__aarch64__) -# define ANDROID_ARM_CODEGEN 1 -#else -# define ANDROID_ARM_CODEGEN 0 -#endif - -#if defined(__mips__) && ((!defined(__LP64__) && __mips_isa_rev < 6) || (defined(__LP64__) && __mips_isa_rev == 6)) -#define ASSEMBLY_SCRATCH_SIZE 4096 -#elif defined(__aarch64__) -#define ASSEMBLY_SCRATCH_SIZE 8192 -#else -#define ASSEMBLY_SCRATCH_SIZE 2048 -#endif - -using namespace android; - -class ScanlineAssembly : public Assembly { - AssemblyKey mKey; -public: - ScanlineAssembly(needs_t needs, size_t size) - : Assembly(size), mKey(needs) { } - const AssemblyKey& key() const { return mKey; } -}; - -#if ANDROID_ARM_CODEGEN -static void ggl_test_codegen(uint32_t n, uint32_t p, uint32_t t0, uint32_t t1) -{ - GGLContext* c; - gglInit(&c); - needs_t needs; - needs.n = n; - needs.p = p; - needs.t[0] = t0; - needs.t[1] = t1; - sp a(new ScanlineAssembly(needs, ASSEMBLY_SCRATCH_SIZE)); - -#if defined(__arm__) - GGLAssembler assembler( new ARMAssembler(a) ); -#endif - -#if defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6 - GGLAssembler assembler( new ArmToMipsAssembler(a) ); -#endif - -#if defined(__mips__) && defined(__LP64__) && __mips_isa_rev == 6 - GGLAssembler assembler( new ArmToMips64Assembler(a) ); -#endif - -#if defined(__aarch64__) - GGLAssembler assembler( new ArmToArm64Assembler(a) ); -#endif - - int err = assembler.scanline(needs, (context_t*)c); - if (err != 0) { - printf("error %08x (%s)\n", err, strerror(-err)); - } - gglUninit(c); -} -#else -static void ggl_test_codegen(uint32_t, uint32_t, uint32_t, uint32_t) { - printf("This test runs only on ARM, Arm64 or MIPS\n"); -} -#endif - -int main(int argc, char** argv) -{ - if (argc != 2) { - printf("usage: %s 00000117:03454504_00001501_00000000\n", argv[0]); - return 0; - } - uint32_t n; - uint32_t p; - uint32_t t0; - uint32_t t1; - sscanf(argv[1], "%08x:%08x_%08x_%08x", &p, &n, &t0, &t1); - ggl_test_codegen(n, p, t0, t1); - return 0; -} diff --git a/libpixelflinger/tests/gglmul/Android.bp b/libpixelflinger/tests/gglmul/Android.bp deleted file mode 100644 index 288337b71..000000000 --- a/libpixelflinger/tests/gglmul/Android.bp +++ /dev/null @@ -1,12 +0,0 @@ -cc_test { - name: "test-pixelflinger-gglmul", - - srcs: ["gglmul_test.cpp"], - - header_libs: ["libpixelflinger_internal"], - - cflags: [ - "-Wall", - "-Werror", - ], -} diff --git a/libpixelflinger/tests/gglmul/gglmul_test.cpp b/libpixelflinger/tests/gglmul/gglmul_test.cpp deleted file mode 100644 index 5d460d622..000000000 --- a/libpixelflinger/tests/gglmul/gglmul_test.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include - -#include "private/pixelflinger/ggl_fixed.h" - -// gglClampx() tests -struct gglClampx_test_t -{ - GGLfixed input; - GGLfixed output; -}; - -gglClampx_test_t gglClampx_tests[] = -{ - {FIXED_ONE + 1, FIXED_ONE}, - {FIXED_ONE, FIXED_ONE}, - {FIXED_ONE - 1, FIXED_ONE - 1}, - {1, 1}, - {0, 0}, - {FIXED_MIN,0} -}; - -void gglClampx_test() -{ - uint32_t i; - - printf("Testing gglClampx\n"); - for(i = 0; i < sizeof(gglClampx_tests)/sizeof(gglClampx_test_t); ++i) - { - gglClampx_test_t *test = &gglClampx_tests[i]; - printf("Test input=0x%08x output=0x%08x :", - test->input, test->output); - if(gglClampx(test->input) == test->output) - printf("Passed\n"); - else - printf("Failed\n"); - } -} - -// gglClz() tests -struct gglClz_test_t -{ - GGLfixed input; - GGLfixed output; -}; - -gglClz_test_t gglClz_tests[] = -{ - {0, 32}, - {1, 31}, - {-1,0} -}; - -void gglClz_test() -{ - uint32_t i; - - printf("Testing gglClz\n"); - for(i = 0; i < sizeof(gglClz_tests)/sizeof(gglClz_test_t); ++i) - { - gglClz_test_t *test = &gglClz_tests[i]; - printf("Test input=0x%08x output=%2d :", test->input, test->output); - if(gglClz(test->input) == test->output) - printf("Passed\n"); - else - printf("Failed\n"); - } -} - -// gglMulx() tests -struct gglMulx_test_t -{ - GGLfixed x; - GGLfixed y; - int shift; -}; - -gglMulx_test_t gglMulx_tests[] = -{ - {1,1,1}, - {0,1,1}, - {FIXED_ONE,FIXED_ONE,16}, - {FIXED_MIN,FIXED_MAX,16}, - {FIXED_MAX,FIXED_MAX,16}, - {FIXED_MIN,FIXED_MIN,16}, - {FIXED_HALF,FIXED_ONE,16}, - {FIXED_MAX,FIXED_MAX,31}, - {FIXED_ONE,FIXED_MAX,31} -}; - -void gglMulx_test() -{ - uint32_t i; - GGLfixed actual, expected; - - printf("Testing gglMulx\n"); - for(i = 0; i < sizeof(gglMulx_tests)/sizeof(gglMulx_test_t); ++i) - { - gglMulx_test_t *test = &gglMulx_tests[i]; - printf("Test x=0x%08x y=0x%08x shift=%2d :", - test->x, test->y, test->shift); - actual = gglMulx(test->x, test->y, test->shift); - expected = - ((int64_t)test->x * test->y + (1 << (test->shift-1))) >> test->shift; - if(actual == expected) - printf(" Passed\n"); - else - printf(" Failed Actual(0x%08x) Expected(0x%08x)\n", - actual, expected); - } -} -// gglMulAddx() tests -struct gglMulAddx_test_t -{ - GGLfixed x; - GGLfixed y; - int shift; - GGLfixed a; -}; - -gglMulAddx_test_t gglMulAddx_tests[] = -{ - {1,2,1,1}, - {0,1,1,1}, - {FIXED_ONE,FIXED_ONE,16, 0}, - {FIXED_MIN,FIXED_MAX,16, FIXED_HALF}, - {FIXED_MAX,FIXED_MAX,16, FIXED_MIN}, - {FIXED_MIN,FIXED_MIN,16, FIXED_MAX}, - {FIXED_HALF,FIXED_ONE,16,FIXED_ONE}, - {FIXED_MAX,FIXED_MAX,31, FIXED_HALF}, - {FIXED_ONE,FIXED_MAX,31, FIXED_HALF} -}; - -void gglMulAddx_test() -{ - uint32_t i; - GGLfixed actual, expected; - - printf("Testing gglMulAddx\n"); - for(i = 0; i < sizeof(gglMulAddx_tests)/sizeof(gglMulAddx_test_t); ++i) - { - gglMulAddx_test_t *test = &gglMulAddx_tests[i]; - printf("Test x=0x%08x y=0x%08x shift=%2d a=0x%08x :", - test->x, test->y, test->shift, test->a); - actual = gglMulAddx(test->x, test->y,test->a, test->shift); - expected = (((int64_t)test->x * test->y) >> test->shift) + test->a; - - if(actual == expected) - printf(" Passed\n"); - else - printf(" Failed Actual(0x%08x) Expected(0x%08x)\n", - actual, expected); - } -} -// gglMulSubx() tests -struct gglMulSubx_test_t -{ - GGLfixed x; - GGLfixed y; - int shift; - GGLfixed a; -}; - -gglMulSubx_test_t gglMulSubx_tests[] = -{ - {1,2,1,1}, - {0,1,1,1}, - {FIXED_ONE,FIXED_ONE,16, 0}, - {FIXED_MIN,FIXED_MAX,16, FIXED_HALF}, - {FIXED_MAX,FIXED_MAX,16, FIXED_MIN}, - {FIXED_MIN,FIXED_MIN,16, FIXED_MAX}, - {FIXED_HALF,FIXED_ONE,16,FIXED_ONE}, - {FIXED_MAX,FIXED_MAX,31, FIXED_HALF}, - {FIXED_ONE,FIXED_MAX,31, FIXED_HALF} -}; - -void gglMulSubx_test() -{ - uint32_t i; - GGLfixed actual, expected; - - printf("Testing gglMulSubx\n"); - for(i = 0; i < sizeof(gglMulSubx_tests)/sizeof(gglMulSubx_test_t); ++i) - { - gglMulSubx_test_t *test = &gglMulSubx_tests[i]; - printf("Test x=0x%08x y=0x%08x shift=%2d a=0x%08x :", - test->x, test->y, test->shift, test->a); - actual = gglMulSubx(test->x, test->y, test->a, test->shift); - expected = (((int64_t)test->x * test->y) >> test->shift) - test->a; - - if(actual == expected) - printf(" Passed\n"); - else - printf(" Failed Actual(0x%08x) Expected(0x%08x)\n", - actual, expected); - } -} - -// gglMulii() tests - -struct gglMulii_test_t -{ - int32_t x; - int32_t y; -}; - -gglMulii_test_t gglMulii_tests[] = -{ - {1,INT32_MIN}, - {1,INT32_MAX}, - {0,INT32_MIN}, - {0,INT32_MAX}, - {INT32_MIN, INT32_MAX}, - {INT32_MAX, INT32_MIN}, - {INT32_MIN, INT32_MIN}, - {INT32_MAX, INT32_MAX} -}; - -void gglMulii_test() -{ - uint32_t i; - int64_t actual, expected; - - printf("Testing gglMulii\n"); - for(i = 0; i < sizeof(gglMulii_tests)/sizeof(gglMulii_test_t); ++i) - { - gglMulii_test_t *test = &gglMulii_tests[i]; - printf("Test x=0x%08x y=0x%08x :", test->x, test->y); - actual = gglMulii(test->x, test->y); - expected = ((int64_t)test->x * test->y); - - if(actual == expected) - printf(" Passed\n"); - else - printf(" Failed Actual(%" PRId64 ") Expected(%" PRId64 ")\n", - actual, expected); - } -} - -int main(int /*argc*/, char** /*argv*/) -{ - gglClampx_test(); - gglClz_test(); - gglMulx_test(); - gglMulAddx_test(); - gglMulSubx_test(); - gglMulii_test(); - return 0; -} diff --git a/libpixelflinger/trap.cpp b/libpixelflinger/trap.cpp deleted file mode 100644 index 06ad2373c..000000000 --- a/libpixelflinger/trap.cpp +++ /dev/null @@ -1,1173 +0,0 @@ -/* libs/pixelflinger/trap.cpp -** -** Copyright 2006, 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 "pixelflinger-trap" - -#include -#include -#include - -#include -#include - -#include "trap.h" -#include "picker.h" - -namespace android { - -// ---------------------------------------------------------------------------- - -// enable to see triangles edges -#define DEBUG_TRANGLES 0 - -// ---------------------------------------------------------------------------- - -static void pointx_validate(void *con, const GGLcoord* c, GGLcoord r); -static void pointx(void *con, const GGLcoord* c, GGLcoord r); -static void aa_pointx(void *con, const GGLcoord* c, GGLcoord r); -static void aa_nice_pointx(void *con, const GGLcoord* c, GGLcoord r); - -static void linex_validate(void *con, const GGLcoord* v0, const GGLcoord* v1, GGLcoord w); -static void linex(void *con, const GGLcoord* v0, const GGLcoord* v1, GGLcoord w); -static void aa_linex(void *con, const GGLcoord* v0, const GGLcoord* v1, GGLcoord w); - -static void recti_validate(void* c, GGLint l, GGLint t, GGLint r, GGLint b); -static void recti(void* c, GGLint l, GGLint t, GGLint r, GGLint b); - -static void trianglex_validate(void*, - const GGLcoord*, const GGLcoord*, const GGLcoord*); -static void trianglex_small(void*, - const GGLcoord*, const GGLcoord*, const GGLcoord*); -static void trianglex_big(void*, - const GGLcoord*, const GGLcoord*, const GGLcoord*); -static void aa_trianglex(void*, - const GGLcoord*, const GGLcoord*, const GGLcoord*); -static void trianglex_debug(void* con, - const GGLcoord*, const GGLcoord*, const GGLcoord*); - -static void aapolyx(void* con, - const GGLcoord* pts, int count); - -static inline int min(int a, int b) CONST; -static inline int max(int a, int b) CONST; -static inline int min(int a, int b, int c) CONST; -static inline int max(int a, int b, int c) CONST; - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark Tools -#endif - -inline int min(int a, int b) { - return a -static inline void swap(T& a, T& b) { - T t(a); - a = b; - b = t; -} - -static void -triangle_dump_points( const GGLcoord* v0, - const GGLcoord* v1, - const GGLcoord* v2 ) -{ - float tri = 1.0f / TRI_ONE; - ALOGD(" P0=(%.3f, %.3f) [%08x, %08x]\n" - " P1=(%.3f, %.3f) [%08x, %08x]\n" - " P2=(%.3f, %.3f) [%08x, %08x]\n", - v0[0]*tri, v0[1]*tri, v0[0], v0[1], - v1[0]*tri, v1[1]*tri, v1[0], v1[1], - v2[0]*tri, v2[1]*tri, v2[0], v2[1] ); -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark Misc -#endif - -void ggl_init_trap(context_t* c) -{ - ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE|GGL_TMU_STATE|GGL_CB_STATE); -} - -void ggl_state_changed(context_t* c, int flags) -{ - if (ggl_likely(!c->dirty)) { - c->procs.pointx = pointx_validate; - c->procs.linex = linex_validate; - c->procs.recti = recti_validate; - c->procs.trianglex = trianglex_validate; - } - c->dirty |= uint32_t(flags); -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark Point -#endif - -void pointx_validate(void *con, const GGLcoord* v, GGLcoord rad) -{ - GGL_CONTEXT(c, con); - ggl_pick(c); - if (c->state.needs.p & GGL_NEED_MASK(P_AA)) { - if (c->state.enables & GGL_ENABLE_POINT_AA_NICE) { - c->procs.pointx = aa_nice_pointx; - } else { - c->procs.pointx = aa_pointx; - } - } else { - c->procs.pointx = pointx; - } - c->procs.pointx(con, v, rad); -} - -void pointx(void *con, const GGLcoord* v, GGLcoord rad) -{ - GGL_CONTEXT(c, con); - GGLcoord halfSize = TRI_ROUND(rad) >> 1; - if (halfSize == 0) - halfSize = TRI_HALF; - GGLcoord xc = v[0]; - GGLcoord yc = v[1]; - if (halfSize & TRI_HALF) { // size odd - xc = TRI_FLOOR(xc) + TRI_HALF; - yc = TRI_FLOOR(yc) + TRI_HALF; - } else { // size even - xc = TRI_ROUND(xc); - yc = TRI_ROUND(yc); - } - GGLint l = (xc - halfSize) >> TRI_FRACTION_BITS; - GGLint t = (yc - halfSize) >> TRI_FRACTION_BITS; - GGLint r = (xc + halfSize) >> TRI_FRACTION_BITS; - GGLint b = (yc + halfSize) >> TRI_FRACTION_BITS; - recti(c, l, t, r, b); -} - -// This way of computing the coverage factor, is more accurate and gives -// better results for small circles, but it is also a lot slower. -// Here we use super-sampling. -static int32_t coverageNice(GGLcoord x, GGLcoord y, - GGLcoord rmin, GGLcoord rmax, GGLcoord rr) -{ - const GGLcoord d2 = x*x + y*y; - if (d2 >= rmax) return 0; - if (d2 < rmin) return 0x7FFF; - - const int kSamples = 4; - const int kInc = 4; // 1/4 = 0.25 - const int kCoverageUnit = 1; // 1/(4^2) = 0.0625 - const GGLcoord kCoordOffset = -6; // -0.375 - - int hits = 0; - int x_sample = x + kCoordOffset; - for (int i=0 ; i 0) - hits += kCoverageUnit; - } - } - return min(0x7FFF, hits << (15 - kSamples)); -} - - -void aa_nice_pointx(void *con, const GGLcoord* v, GGLcoord size) -{ - GGL_CONTEXT(c, con); - - GGLcoord rad = ((size + 1)>>1); - GGLint l = (v[0] - rad) >> TRI_FRACTION_BITS; - GGLint t = (v[1] - rad) >> TRI_FRACTION_BITS; - GGLint r = (v[0] + rad + (TRI_ONE-1)) >> TRI_FRACTION_BITS; - GGLint b = (v[1] + rad + (TRI_ONE-1)) >> TRI_FRACTION_BITS; - GGLcoord xstart = TRI_FROM_INT(l) - v[0] + TRI_HALF; - GGLcoord ystart = TRI_FROM_INT(t) - v[1] + TRI_HALF; - - // scissor... - if (l < GGLint(c->state.scissor.left)) { - xstart += TRI_FROM_INT(c->state.scissor.left-l); - l = GGLint(c->state.scissor.left); - } - if (t < GGLint(c->state.scissor.top)) { - ystart += TRI_FROM_INT(c->state.scissor.top-t); - t = GGLint(c->state.scissor.top); - } - if (r > GGLint(c->state.scissor.right)) { - r = GGLint(c->state.scissor.right); - } - if (b > GGLint(c->state.scissor.bottom)) { - b = GGLint(c->state.scissor.bottom); - } - - int xc = r - l; - int yc = b - t; - if (xc>0 && yc>0) { - int16_t* covPtr = c->state.buffers.coverage; - const int32_t sqr2Over2 = 0xC; // rounded up - GGLcoord rr = rad*rad; - GGLcoord rmin = (rad - sqr2Over2)*(rad - sqr2Over2); - GGLcoord rmax = (rad + sqr2Over2)*(rad + sqr2Over2); - GGLcoord y = ystart; - c->iterators.xl = l; - c->iterators.xr = r; - c->init_y(c, t); - do { - // compute coverage factors for each pixel - GGLcoord x = xstart; - for (int i=l ; iscanline(c); - c->step_y(c); - } while (--yc); - } -} - -// This is a cheap way of computing the coverage factor for a circle. -// We just lerp between the circles of radii r-sqrt(2)/2 and r+sqrt(2)/2 -static inline int32_t coverageFast(GGLcoord x, GGLcoord y, - GGLcoord rmin, GGLcoord rmax, GGLcoord scale) -{ - const GGLcoord d2 = x*x + y*y; - if (d2 >= rmax) return 0; - if (d2 < rmin) return 0x7FFF; - return 0x7FFF - (d2-rmin)*scale; -} - -void aa_pointx(void *con, const GGLcoord* v, GGLcoord size) -{ - GGL_CONTEXT(c, con); - - GGLcoord rad = ((size + 1)>>1); - GGLint l = (v[0] - rad) >> TRI_FRACTION_BITS; - GGLint t = (v[1] - rad) >> TRI_FRACTION_BITS; - GGLint r = (v[0] + rad + (TRI_ONE-1)) >> TRI_FRACTION_BITS; - GGLint b = (v[1] + rad + (TRI_ONE-1)) >> TRI_FRACTION_BITS; - GGLcoord xstart = TRI_FROM_INT(l) - v[0] + TRI_HALF; - GGLcoord ystart = TRI_FROM_INT(t) - v[1] + TRI_HALF; - - // scissor... - if (l < GGLint(c->state.scissor.left)) { - xstart += TRI_FROM_INT(c->state.scissor.left-l); - l = GGLint(c->state.scissor.left); - } - if (t < GGLint(c->state.scissor.top)) { - ystart += TRI_FROM_INT(c->state.scissor.top-t); - t = GGLint(c->state.scissor.top); - } - if (r > GGLint(c->state.scissor.right)) { - r = GGLint(c->state.scissor.right); - } - if (b > GGLint(c->state.scissor.bottom)) { - b = GGLint(c->state.scissor.bottom); - } - - int xc = r - l; - int yc = b - t; - if (xc>0 && yc>0) { - int16_t* covPtr = c->state.buffers.coverage; - rad <<= 4; - const int32_t sqr2Over2 = 0xB5; // fixed-point 24.8 - GGLcoord rmin = rad - sqr2Over2; - GGLcoord rmax = rad + sqr2Over2; - GGLcoord scale; - rmin *= rmin; - rmax *= rmax; - scale = 0x800000 / (rmax - rmin); - rmin >>= 8; - rmax >>= 8; - - GGLcoord y = ystart; - c->iterators.xl = l; - c->iterators.xr = r; - c->init_y(c, t); - - do { - // compute coverage factors for each pixel - GGLcoord x = xstart; - for (int i=l ; iscanline(c); - c->step_y(c); - } while (--yc); - } -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark Line -#endif - -void linex_validate(void *con, const GGLcoord* v0, const GGLcoord* v1, GGLcoord w) -{ - GGL_CONTEXT(c, con); - ggl_pick(c); - if (c->state.needs.p & GGL_NEED_MASK(P_AA)) { - c->procs.linex = aa_linex; - } else { - c->procs.linex = linex; - } - c->procs.linex(con, v0, v1, w); -} - -static void linex(void *con, const GGLcoord* v0, const GGLcoord* v1, GGLcoord width) -{ - GGLcoord v[4][2]; - v[0][0] = v0[0]; v[0][1] = v0[1]; - v[1][0] = v1[0]; v[1][1] = v1[1]; - v0 = v[0]; - v1 = v[1]; - const GGLcoord dx = abs(v0[0] - v1[0]); - const GGLcoord dy = abs(v0[1] - v1[1]); - GGLcoord nx, ny; - nx = ny = 0; - - GGLcoord halfWidth = TRI_ROUND(width) >> 1; - if (halfWidth == 0) - halfWidth = TRI_HALF; - - ((dx > dy) ? ny : nx) = halfWidth; - v[2][0] = v1[0]; v[2][1] = v1[1]; - v[3][0] = v0[0]; v[3][1] = v0[1]; - v[0][0] += nx; v[0][1] += ny; - v[1][0] += nx; v[1][1] += ny; - v[2][0] -= nx; v[2][1] -= ny; - v[3][0] -= nx; v[3][1] -= ny; - trianglex_big(con, v[0], v[1], v[2]); - trianglex_big(con, v[0], v[2], v[3]); -} - -static void aa_linex(void *con, const GGLcoord* v0, const GGLcoord* v1, GGLcoord width) -{ - GGLcoord v[4][2]; - v[0][0] = v0[0]; v[0][1] = v0[1]; - v[1][0] = v1[0]; v[1][1] = v1[1]; - v0 = v[0]; - v1 = v[1]; - - const GGLcoord dx = v0[0] - v1[0]; - const GGLcoord dy = v0[1] - v1[1]; - GGLcoord nx = -dy; - GGLcoord ny = dx; - - // generally, this will be well below 1.0 - const GGLfixed norm = gglMulx(width, gglSqrtRecipx(nx*nx+ny*ny), 4); - nx = gglMulx(nx, norm, 21); - ny = gglMulx(ny, norm, 21); - - v[2][0] = v1[0]; v[2][1] = v1[1]; - v[3][0] = v0[0]; v[3][1] = v0[1]; - v[0][0] += nx; v[0][1] += ny; - v[1][0] += nx; v[1][1] += ny; - v[2][0] -= nx; v[2][1] -= ny; - v[3][0] -= nx; v[3][1] -= ny; - aapolyx(con, v[0], 4); -} - - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark Rect -#endif - -void recti_validate(void *con, GGLint l, GGLint t, GGLint r, GGLint b) -{ - GGL_CONTEXT(c, con); - ggl_pick(c); - c->procs.recti = recti; - c->procs.recti(con, l, t, r, b); -} - -void recti(void* con, GGLint l, GGLint t, GGLint r, GGLint b) -{ - GGL_CONTEXT(c, con); - - // scissor... - if (l < GGLint(c->state.scissor.left)) - l = GGLint(c->state.scissor.left); - if (t < GGLint(c->state.scissor.top)) - t = GGLint(c->state.scissor.top); - if (r > GGLint(c->state.scissor.right)) - r = GGLint(c->state.scissor.right); - if (b > GGLint(c->state.scissor.bottom)) - b = GGLint(c->state.scissor.bottom); - - int xc = r - l; - int yc = b - t; - if (xc>0 && yc>0) { - c->iterators.xl = l; - c->iterators.xr = r; - c->init_y(c, t); - c->rect(c, yc); - } -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark Triangle / Debugging -#endif - -static void scanline_set(context_t* c) -{ - int32_t x = c->iterators.xl; - size_t ct = c->iterators.xr - x; - int32_t y = c->iterators.y; - surface_t* cb = &(c->state.buffers.color); - const GGLFormat* fp = &(c->formats[cb->format]); - uint8_t* dst = reinterpret_cast(cb->data) + - (x + (cb->stride * y)) * fp->size; - const size_t size = ct * fp->size; - memset(dst, 0xFF, size); -} - -static void trianglex_debug(void* con, - const GGLcoord* v0, const GGLcoord* v1, const GGLcoord* v2) -{ - GGL_CONTEXT(c, con); - if (c->state.needs.p & GGL_NEED_MASK(P_AA)) { - aa_trianglex(con,v0,v1,v2); - } else { - trianglex_big(con,v0,v1,v2); - } - void (*save_scanline)(context_t*) = c->scanline; - c->scanline = scanline_set; - linex(con, v0, v1, TRI_ONE); - linex(con, v1, v2, TRI_ONE); - linex(con, v2, v0, TRI_ONE); - c->scanline = save_scanline; -} - -static void trianglex_xor(void* con, - const GGLcoord* v0, const GGLcoord* v1, const GGLcoord* v2) -{ - trianglex_big(con,v0,v1,v2); - trianglex_small(con,v0,v1,v2); -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#pragma mark Triangle -#endif - -void trianglex_validate(void *con, - const GGLcoord* v0, const GGLcoord* v1, const GGLcoord* v2) -{ - GGL_CONTEXT(c, con); - ggl_pick(c); - if (c->state.needs.p & GGL_NEED_MASK(P_AA)) { - c->procs.trianglex = DEBUG_TRANGLES ? trianglex_debug : aa_trianglex; - } else { - c->procs.trianglex = DEBUG_TRANGLES ? trianglex_debug : trianglex_big; - } - c->procs.trianglex(con, v0, v1, v2); -} - -// ---------------------------------------------------------------------------- - -void trianglex_small(void* con, - const GGLcoord* v0, const GGLcoord* v1, const GGLcoord* v2) -{ - GGL_CONTEXT(c, con); - - // vertices are in 28.4 fixed point, which allows - // us to use 32 bits multiplies below. - int32_t x0 = v0[0]; - int32_t y0 = v0[1]; - int32_t x1 = v1[0]; - int32_t y1 = v1[1]; - int32_t x2 = v2[0]; - int32_t y2 = v2[1]; - - int32_t dx01 = x0 - x1; - int32_t dy20 = y2 - y0; - int32_t dy01 = y0 - y1; - int32_t dx20 = x2 - x0; - - // The code below works only with CCW triangles - // so if we get a CW triangle, we need to swap two of its vertices - if (dx01*dy20 < dy01*dx20) { - swap(x0, x1); - swap(y0, y1); - dx01 = x0 - x1; - dy01 = y0 - y1; - dx20 = x2 - x0; - dy20 = y2 - y0; - } - int32_t dx12 = x1 - x2; - int32_t dy12 = y1 - y2; - - // bounding box & scissor - const int32_t bminx = TRI_FLOOR(min(x0, x1, x2)) >> TRI_FRACTION_BITS; - const int32_t bminy = TRI_FLOOR(min(y0, y1, y2)) >> TRI_FRACTION_BITS; - const int32_t bmaxx = TRI_CEIL( max(x0, x1, x2)) >> TRI_FRACTION_BITS; - const int32_t bmaxy = TRI_CEIL( max(y0, y1, y2)) >> TRI_FRACTION_BITS; - const int32_t minx = max(bminx, c->state.scissor.left); - const int32_t miny = max(bminy, c->state.scissor.top); - const int32_t maxx = min(bmaxx, c->state.scissor.right); - const int32_t maxy = min(bmaxy, c->state.scissor.bottom); - if ((minx >= maxx) || (miny >= maxy)) - return; // too small or clipped out... - - // step equations to the bounding box and snap to pixel center - const int32_t my = (miny << TRI_FRACTION_BITS) + TRI_HALF; - const int32_t mx = (minx << TRI_FRACTION_BITS) + TRI_HALF; - int32_t ey0 = dy01 * (x0 - mx) - dx01 * (y0 - my); - int32_t ey1 = dy12 * (x1 - mx) - dx12 * (y1 - my); - int32_t ey2 = dy20 * (x2 - mx) - dx20 * (y2 - my); - - // right-exclusive fill rule, to avoid rare cases - // of over drawing - if (dy01<0 || (dy01 == 0 && dx01>0)) ey0++; - if (dy12<0 || (dy12 == 0 && dx12>0)) ey1++; - if (dy20<0 || (dy20 == 0 && dx20>0)) ey2++; - - c->init_y(c, miny); - for (int32_t y = miny; y < maxy; y++) { - int32_t ex0 = ey0; - int32_t ex1 = ey1; - int32_t ex2 = ey2; - int32_t xl, xr; - for (xl=minx ; xl0 && ex1>0 && ex2>0) - break; // all strictly positive - ex0 -= dy01 << TRI_FRACTION_BITS; - ex1 -= dy12 << TRI_FRACTION_BITS; - ex2 -= dy20 << TRI_FRACTION_BITS; - } - xr = xl; - for ( ; xr0 && ex1>0 && ex2>0)) - break; // not all strictly positive - ex0 -= dy01 << TRI_FRACTION_BITS; - ex1 -= dy12 << TRI_FRACTION_BITS; - ex2 -= dy20 << TRI_FRACTION_BITS; - } - - if (xl < xr) { - c->iterators.xl = xl; - c->iterators.xr = xr; - c->scanline(c); - } - c->step_y(c); - - ey0 += dx01 << TRI_FRACTION_BITS; - ey1 += dx12 << TRI_FRACTION_BITS; - ey2 += dx20 << TRI_FRACTION_BITS; - } -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#endif - -// the following routine fills a triangle via edge stepping, which -// unfortunately requires divisions in the setup phase to get right, -// it should probably only be used for relatively large trianges - - -// x = y*DX/DY (ou DX and DY are constants, DY > 0, et y >= 0) -// -// for an equation of the type: -// x' = y*K/2^p (with K and p constants "carefully chosen") -// -// We can now do a DDA without precision loss. We define 'e' by: -// x' - x = y*(DX/DY - K/2^p) = y*e -// -// If we choose K = round(DX*2^p/DY) then, -// abs(e) <= 1/2^(p+1) by construction -// -// therefore abs(x'-x) = y*abs(e) <= y/2^(p+1) <= DY/2^(p+1) <= DMAX/2^(p+1) -// -// which means that if DMAX <= 2^p, therefore abs(x-x') <= 1/2, including -// at the last line. In fact, it's even a strict inequality except in one -// extrem case (DY == DMAX et e = +/- 1/2) -// -// Applying that to our coordinates, we need 2^p >= 4096*16 = 65536 -// so p = 16 is enough, we're so lucky! - -const int TRI_ITERATORS_BITS = 16; - -struct Edge -{ - int32_t x; // edge position in 16.16 coordinates - int32_t x_incr; // on each step, increment x by that amount - int32_t y_top; // starting scanline, 16.4 format - int32_t y_bot; -}; - -static void -edge_dump( Edge* edge ) -{ - ALOGI( " top=%d (%.3f) bot=%d (%.3f) x=%d (%.3f) ix=%d (%.3f)", - edge->y_top, edge->y_top/float(TRI_ONE), - edge->y_bot, edge->y_bot/float(TRI_ONE), - edge->x, edge->x/float(FIXED_ONE), - edge->x_incr, edge->x_incr/float(FIXED_ONE) ); -} - -static void -triangle_dump_edges( Edge* edges, - int count ) -{ - ALOGI( "%d edge%s:\n", count, count == 1 ? "" : "s" ); - for ( ; count > 0; count--, edges++ ) - edge_dump( edges ); -} - -// the following function sets up an edge, it assumes -// that ymin and ymax are in already in the 'reduced' -// format -static __attribute__((noinline)) -void edge_setup( - Edge* edges, - int* pcount, - const GGLcoord* p1, - const GGLcoord* p2, - int32_t ymin, - int32_t ymax ) -{ - const GGLfixed* top = p1; - const GGLfixed* bot = p2; - Edge* edge = edges + *pcount; - - if (top[1] > bot[1]) { - swap(top, bot); - } - - int y1 = top[1] | 1; - int y2 = bot[1] | 1; - int dy = y2 - y1; - - if ( dy == 0 || y1 > ymax || y2 < ymin ) - return; - - if ( y1 > ymin ) - ymin = TRI_SNAP_NEXT_HALF(y1); - - if ( y2 < ymax ) - ymax = TRI_SNAP_PREV_HALF(y2); - - if ( ymin > ymax ) // when the edge doesn't cross any scanline - return; - - const int x1 = top[0]; - const int dx = bot[0] - x1; - const int shift = TRI_ITERATORS_BITS - TRI_FRACTION_BITS; - - // setup edge fields - // We add 0.5 to edge->x here because it simplifies the rounding - // in triangle_sweep_edges() -- this doesn't change the ordering of 'x' - edge->x = (x1 << shift) + (1LU << (TRI_ITERATORS_BITS-1)); - edge->x_incr = 0; - edge->y_top = ymin; - edge->y_bot = ymax; - - if (ggl_likely(ymin <= ymax && dx)) { - edge->x_incr = gglDivQ16(dx, dy); - } - if (ggl_likely(y1 < ymin)) { - int32_t xadjust = (edge->x_incr * (ymin-y1)) >> TRI_FRACTION_BITS; - edge->x += xadjust; - } - - ++*pcount; -} - - -static void -triangle_sweep_edges( Edge* left, - Edge* right, - int ytop, - int ybot, - context_t* c ) -{ - int count = ((ybot - ytop)>>TRI_FRACTION_BITS) + 1; - if (count<=0) return; - - // sort the edges horizontally - if ((left->x > right->x) || - ((left->x == right->x) && (left->x_incr > right->x_incr))) { - swap(left, right); - } - - int left_x = left->x; - int right_x = right->x; - const int left_xi = left->x_incr; - const int right_xi = right->x_incr; - left->x += left_xi * count; - right->x += right_xi * count; - - const int xmin = c->state.scissor.left; - const int xmax = c->state.scissor.right; - do { - // horizontal scissoring - const int32_t xl = max(left_x >> TRI_ITERATORS_BITS, xmin); - const int32_t xr = min(right_x >> TRI_ITERATORS_BITS, xmax); - left_x += left_xi; - right_x += right_xi; - // invoke the scanline rasterizer - if (ggl_likely(xl < xr)) { - c->iterators.xl = xl; - c->iterators.xr = xr; - c->scanline(c); - } - c->step_y(c); - } while (--count); -} - - -void trianglex_big(void* con, - const GGLcoord* v0, const GGLcoord* v1, const GGLcoord* v2) -{ - GGL_CONTEXT(c, con); - - Edge edges[3]; - int num_edges = 0; - int32_t ymin = TRI_FROM_INT(c->state.scissor.top) + TRI_HALF; - int32_t ymax = TRI_FROM_INT(c->state.scissor.bottom) - TRI_HALF; - - edge_setup( edges, &num_edges, v0, v1, ymin, ymax ); - edge_setup( edges, &num_edges, v0, v2, ymin, ymax ); - edge_setup( edges, &num_edges, v1, v2, ymin, ymax ); - - if (ggl_unlikely(num_edges<2)) // for really tiny triangles that don't - return; // cross any scanline centers - - Edge* left = &edges[0]; - Edge* right = &edges[1]; - Edge* other = &edges[2]; - int32_t y_top = min(left->y_top, right->y_top); - int32_t y_bot = max(left->y_bot, right->y_bot); - - if (ggl_likely(num_edges==3)) { - y_top = min(y_top, edges[2].y_top); - y_bot = max(y_bot, edges[2].y_bot); - if (edges[0].y_top > y_top) { - other = &edges[0]; - left = &edges[2]; - } else if (edges[1].y_top > y_top) { - other = &edges[1]; - right = &edges[2]; - } - } - - c->init_y(c, y_top >> TRI_FRACTION_BITS); - - int32_t y_mid = min(left->y_bot, right->y_bot); - triangle_sweep_edges( left, right, y_top, y_mid, c ); - - // second scanline sweep loop, if necessary - y_mid += TRI_ONE; - if (y_mid <= y_bot) { - ((left->y_bot == y_bot) ? right : left) = other; - if (other->y_top < y_mid) { - other->x += other->x_incr; - } - triangle_sweep_edges( left, right, y_mid, y_bot, c ); - } -} - -void aa_trianglex(void* con, - const GGLcoord* a, const GGLcoord* b, const GGLcoord* c) -{ - GGLcoord pts[6] = { a[0], a[1], b[0], b[1], c[0], c[1] }; - aapolyx(con, pts, 3); -} - -// ---------------------------------------------------------------------------- -#if 0 -#pragma mark - -#endif - -struct AAEdge -{ - GGLfixed x; // edge position in 12.16 coordinates - GGLfixed x_incr; // on each y step, increment x by that amount - GGLfixed y_incr; // on each x step, increment y by that amount - int16_t y_top; // starting scanline, 12.4 format - int16_t y_bot; // starting scanline, 12.4 format - void dump(); -}; - -void AAEdge::dump() -{ - float tri = 1.0f / TRI_ONE; - float iter = 1.0f / (1< bot[1]) - swap(top, bot); - - int y1 = top[1]; - int y2 = bot[1]; - int dy = y2 - y1; - - if (dy==0 || y1>ymax || y2 ymin) - ymin = y1; - - if (y2 < ymax) - ymax = y2; - - const int x1 = top[0]; - const int dx = bot[0] - x1; - const int shift = FIXED_BITS - TRI_FRACTION_BITS; - - // setup edge fields - edge->x = x1 << shift; - edge->x_incr = 0; - edge->y_top = ymin; - edge->y_bot = ymax; - edge->y_incr = 0x7FFFFFFF; - - if (ggl_likely(ymin <= ymax && dx)) { - edge->x_incr = gglDivQ16(dx, dy); - if (dx != 0) { - edge->y_incr = abs(gglDivQ16(dy, dx)); - } - } - if (ggl_likely(y1 < ymin)) { - int32_t xadjust = (edge->x_incr * (ymin-y1)) - >> (TRI_FRACTION_BITS + TRI_ITERATORS_BITS - FIXED_BITS); - edge->x += xadjust; - } - - ++*pcount; -} - - -typedef int (*compar_t)(const void*, const void*); -static int compare_edges(const AAEdge *e0, const AAEdge *e1) { - if (e0->y_top > e1->y_top) return 1; - if (e0->y_top < e1->y_top) return -1; - if (e0->x > e1->x) return 1; - if (e0->x < e1->x) return -1; - if (e0->x_incr > e1->x_incr) return 1; - if (e0->x_incr < e1->x_incr) return -1; - return 0; // same edges, should never happen -} - -static inline -void SET_COVERAGE(int16_t*& p, int32_t value, ssize_t n) -{ - android_memset16((uint16_t*)p, value, n*2); - p += n; -} - -static inline -void ADD_COVERAGE(int16_t*& p, int32_t value) -{ - value = *p + value; - if (value >= 0x8000) - value = 0x7FFF; - *p++ = value; -} - -static inline -void SUB_COVERAGE(int16_t*& p, int32_t value) -{ - value = *p - value; - value &= ~(value>>31); - *p++ = value; -} - -void aapolyx(void* con, - const GGLcoord* pts, int count) -{ - /* - * NOTE: This routine assumes that the polygon has been clipped to the - * viewport already, that is, no vertex lies outside of the framebuffer. - * If this happens, the code below won't corrupt memory but the - * coverage values may not be correct. - */ - - GGL_CONTEXT(c, con); - - // we do only quads for now (it's used for thick lines) - if ((count>4) || (count<2)) return; - - // take scissor into account - const int xmin = c->state.scissor.left; - const int xmax = c->state.scissor.right; - if (xmin >= xmax) return; - - // generate edges from the vertices - int32_t ymin = TRI_FROM_INT(c->state.scissor.top); - int32_t ymax = TRI_FROM_INT(c->state.scissor.bottom); - if (ymin >= ymax) return; - - AAEdge edges[4]; - int num_edges = 0; - GGLcoord const * p = pts; - for (int i=0 ; istate.buffers.coverage; - memset(covPtr+xmin, 0, (xmax-xmin)*sizeof(*covPtr)); - - // now, sweep all edges in order - // start with the 2 first edges. We know that they share their top - // vertex, by construction. - int i = 2; - AAEdge* left = &edges[0]; - AAEdge* right = &edges[1]; - int32_t yt = left->y_top; - GGLfixed l = left->x; - GGLfixed r = right->x; - int retire = 0; - int16_t* coverage; - - // at this point we can initialize the rasterizer - c->init_y(c, yt>>TRI_FRACTION_BITS); - c->iterators.xl = xmax; - c->iterators.xr = xmin; - - do { - int32_t y = min(min(left->y_bot, right->y_bot), TRI_FLOOR(yt + TRI_ONE)); - const int32_t shift = TRI_FRACTION_BITS + TRI_ITERATORS_BITS - FIXED_BITS; - const int cf_shift = (1 + TRI_FRACTION_BITS*2 + TRI_ITERATORS_BITS - 15); - - // compute xmin and xmax for the left edge - GGLfixed l_min = gglMulAddx(left->x_incr, y - left->y_top, left->x, shift); - GGLfixed l_max = l; - l = l_min; - if (l_min > l_max) - swap(l_min, l_max); - - // compute xmin and xmax for the right edge - GGLfixed r_min = gglMulAddx(right->x_incr, y - right->y_top, right->x, shift); - GGLfixed r_max = r; - r = r_min; - if (r_min > r_max) - swap(r_min, r_max); - - // make sure we're not touching coverage values outside of the - // framebuffer - l_min &= ~(l_min>>31); - r_min &= ~(r_min>>31); - l_max &= ~(l_max>>31); - r_max &= ~(r_max>>31); - if (gglFixedToIntFloor(l_min) >= xmax) l_min = gglIntToFixed(xmax)-1; - if (gglFixedToIntFloor(r_min) >= xmax) r_min = gglIntToFixed(xmax)-1; - if (gglFixedToIntCeil(l_max) >= xmax) l_max = gglIntToFixed(xmax)-1; - if (gglFixedToIntCeil(r_max) >= xmax) r_max = gglIntToFixed(xmax)-1; - - // compute the integer versions of the above - const GGLfixed l_min_i = gglFloorx(l_min); - const GGLfixed l_max_i = gglCeilx (l_max); - const GGLfixed r_min_i = gglFloorx(r_min); - const GGLfixed r_max_i = gglCeilx (r_max); - - // clip horizontally using the scissor - const int xml = max(xmin, gglFixedToIntFloor(l_min_i)); - const int xmr = min(xmax, gglFixedToIntFloor(r_max_i)); - - // if we just stepped to a new scanline, render the previous one. - // and clear the coverage buffer - if (retire) { - if (c->iterators.xl < c->iterators.xr) - c->scanline(c); - c->step_y(c); - memset(covPtr+xmin, 0, (xmax-xmin)*sizeof(*covPtr)); - c->iterators.xl = xml; - c->iterators.xr = xmr; - } else { - // update the horizontal range of this scanline - c->iterators.xl = min(c->iterators.xl, xml); - c->iterators.xr = max(c->iterators.xr, xmr); - } - - coverage = covPtr + gglFixedToIntFloor(l_min_i); - if (l_min_i == gglFloorx(l_max)) { - - /* - * fully traverse this pixel vertically - * l_max - * +-----/--+ yt - * | / | - * | / | - * | / | - * +-/------+ y - * l_min (l_min_i + TRI_ONE) - */ - - GGLfixed dx = l_max - l_min; - int32_t dy = y - yt; - int cf = gglMulx((dx >> 1) + (l_min_i + FIXED_ONE - l_max), dy, - FIXED_BITS + TRI_FRACTION_BITS - 15); - ADD_COVERAGE(coverage, cf); - // all pixels on the right have cf = 1.0 - } else { - /* - * spans several pixels in one scanline - * l_max - * +--------+--/-----+ yt - * | |/ | - * | /| | - * | / | | - * +---/----+--------+ y - * l_min (l_min_i + TRI_ONE) - */ - - // handle the first pixel separately... - const int32_t y_incr = left->y_incr; - int32_t dx = TRI_FROM_FIXED(l_min_i - l_min) + TRI_ONE; - int32_t cf = (dx * dx * y_incr) >> cf_shift; - ADD_COVERAGE(coverage, cf); - - // following pixels get covered by y_incr, but we need - // to fix-up the cf to account for previous partial pixel - dx = TRI_FROM_FIXED(l_min - l_min_i); - cf -= (dx * dx * y_incr) >> cf_shift; - for (int x = l_min_i+FIXED_ONE ; x < l_max_i-FIXED_ONE ; x += FIXED_ONE) { - cf += y_incr >> (TRI_ITERATORS_BITS-15); - ADD_COVERAGE(coverage, cf); - } - - // and the last pixel - dx = TRI_FROM_FIXED(l_max - l_max_i) - TRI_ONE; - cf += (dx * dx * y_incr) >> cf_shift; - ADD_COVERAGE(coverage, cf); - } - - // now, fill up all fully covered pixels - coverage = covPtr + gglFixedToIntFloor(l_max_i); - int cf = ((y - yt) << (15 - TRI_FRACTION_BITS)); - if (ggl_likely(cf >= 0x8000)) { - SET_COVERAGE(coverage, 0x7FFF, ((r_max - l_max_i)>>FIXED_BITS)+1); - } else { - for (int x=l_max_i ; x> 1) + (r_min_i + FIXED_ONE - r_max), dy, - FIXED_BITS + TRI_FRACTION_BITS - 15); - SUB_COVERAGE(coverage, cf); - // all pixels on the right have cf = 1.0 - } else { - // handle the first pixel separately... - const int32_t y_incr = right->y_incr; - int32_t dx = TRI_FROM_FIXED(r_min_i - r_min) + TRI_ONE; - int32_t cf = (dx * dx * y_incr) >> cf_shift; - SUB_COVERAGE(coverage, cf); - - // following pixels get covered by y_incr, but we need - // to fix-up the cf to account for previous partial pixel - dx = TRI_FROM_FIXED(r_min - r_min_i); - cf -= (dx * dx * y_incr) >> cf_shift; - for (int x = r_min_i+FIXED_ONE ; x < r_max_i-FIXED_ONE ; x += FIXED_ONE) { - cf += y_incr >> (TRI_ITERATORS_BITS-15); - SUB_COVERAGE(coverage, cf); - } - - // and the last pixel - dx = TRI_FROM_FIXED(r_max - r_max_i) - TRI_ONE; - cf += (dx * dx * y_incr) >> cf_shift; - SUB_COVERAGE(coverage, cf); - } - - // did we reach the end of an edge? if so, get a new one. - if (y == left->y_bot || y == right->y_bot) { - // bail out if we're done - if (i>=num_edges) - break; - if (y == left->y_bot) - left = &edges[i++]; - if (y == right->y_bot) - right = &edges[i++]; - } - - // next scanline - yt = y; - - // did we just finish a scanline? - retire = (y << (32-TRI_FRACTION_BITS)) == 0; - } while (true); - - // render the last scanline - if (c->iterators.xl < c->iterators.xr) - c->scanline(c); -} - -}; // namespace android diff --git a/libpixelflinger/trap.h b/libpixelflinger/trap.h deleted file mode 100644 index 7cce7b3e1..000000000 --- a/libpixelflinger/trap.h +++ /dev/null @@ -1,31 +0,0 @@ -/* libs/pixelflinger/trap.h -** -** Copyright 2006, 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_TRAP_H -#define ANDROID_TRAP_H - -#include - -namespace android { - -void ggl_init_trap(context_t* c); -void ggl_state_changed(context_t* c, int flags); - -}; // namespace android - -#endif From b85cf57421536120a550910406fa79b2e5997375 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Fri, 23 Aug 2019 15:51:32 +0100 Subject: [PATCH 014/388] Include com.android.runtime in the "runtime" linker namespace. This is a temporary fix to keep the Bionic-associated libraries accessible in the runtime namespace, pending a proper namespace split. Test: Build & boot with taimen_hwasan-userdebug Bug: 139408016 Bug: 139916951 Change-Id: I27069b20f7c7068b931340f548b284ce1676466c --- rootdir/etc/ld.config.legacy.txt | 7 +++++-- rootdir/etc/ld.config.txt | 21 +++++++++++++++------ rootdir/etc/ld.config.vndk_lite.txt | 21 +++++++++++++++------ 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/rootdir/etc/ld.config.legacy.txt b/rootdir/etc/ld.config.legacy.txt index 6ab998874..e598f053f 100644 --- a/rootdir/etc/ld.config.legacy.txt +++ b/rootdir/etc/ld.config.legacy.txt @@ -85,8 +85,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.art/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # Need allow_all_shared_libs because libart.so can dlopen oat files in # /system/framework and /data. diff --git a/rootdir/etc/ld.config.txt b/rootdir/etc/ld.config.txt index 783d1c38b..7fbabd59b 100644 --- a/rootdir/etc/ld.config.txt +++ b/rootdir/etc/ld.config.txt @@ -166,8 +166,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.art/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # Need allow_all_shared_libs because libart.so can dlopen oat files in # /system/framework and /data. @@ -491,8 +494,11 @@ namespace.default.link.neuralnetworks.shared_libs = libneuralnetworks.so ############################################################################### namespace.runtime.isolated = true -namespace.runtime.search.paths = /apex/com.android.art/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = system # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. @@ -698,8 +704,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.art/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. diff --git a/rootdir/etc/ld.config.vndk_lite.txt b/rootdir/etc/ld.config.vndk_lite.txt index be9dbade3..24b459e66 100644 --- a/rootdir/etc/ld.config.vndk_lite.txt +++ b/rootdir/etc/ld.config.vndk_lite.txt @@ -105,8 +105,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.art/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # Need allow_all_shared_libs because libart.so can dlopen oat files in # /system/framework and /data. @@ -421,8 +424,11 @@ namespace.default.link.neuralnetworks.shared_libs = libneuralnetworks.so ############################################################################### namespace.runtime.isolated = true -namespace.runtime.search.paths = /apex/com.android.art/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. @@ -505,8 +511,11 @@ namespace.runtime.isolated = true # android_link_namespaces in libnativeloader. namespace.runtime.visible = true -namespace.runtime.search.paths = /apex/com.android.art/${LIB} -namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +# TODO(b/139408016): Split the namespaces for the ART and Runtime APEXes +namespace.runtime.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.search.paths += /apex/com.android.runtime/${LIB} +namespace.runtime.asan.search.paths = /apex/com.android.art/${LIB} +namespace.runtime.asan.search.paths += /apex/com.android.runtime/${LIB} namespace.runtime.links = default # TODO(b/130340935): Use a dynamically created linker namespace similar to # classloader-namespace for oat files, and tighten this up. From a1bdd508b7fae01b13bd4d4efd53f7acaa03eeb6 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Wed, 28 Aug 2019 17:47:49 +0000 Subject: [PATCH 015/388] Revert "Reland: "init: run property service in a thread"" This reverts commit 8efca4bbb378ff5bd3af06d8511ea75a7ed49f99. Reason for revert: Still broken Change-Id: I3b37b1b00ff4b19f2eec2d8bd72042463d47cee3 --- init/Android.bp | 1 - init/builtins.cpp | 10 --- init/init.cpp | 51 +----------- init/init.h | 4 + init/property_service.cpp | 151 ++++++++++++------------------------ init/property_service.h | 7 +- init/property_service.proto | 37 --------- init/proto_utils.h | 62 --------------- init/subcontext.cpp | 64 +++++++++++++-- init/subcontext.proto | 6 ++ 10 files changed, 123 insertions(+), 270 deletions(-) delete mode 100644 init/property_service.proto delete mode 100644 init/proto_utils.h diff --git a/init/Android.bp b/init/Android.bp index 81e7dd970..57555f62f 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -130,7 +130,6 @@ cc_library_static { "persistent_properties.cpp", "persistent_properties.proto", "property_service.cpp", - "property_service.proto", "property_type.cpp", "reboot.cpp", "reboot_utils.cpp", diff --git a/init/builtins.cpp b/init/builtins.cpp index 8c4d9898d..7c66de5f8 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -80,7 +80,6 @@ using namespace std::literals::string_literals; using android::base::Basename; -using android::base::StartsWith; using android::base::unique_fd; using android::fs_mgr::Fstab; using android::fs_mgr::ReadFstabFromFile; @@ -701,15 +700,6 @@ static Result do_swapon_all(const BuiltinArguments& args) { } static Result do_setprop(const BuiltinArguments& args) { - if (StartsWith(args[1], "ctl.")) { - return Error() << "InitPropertySet: Do not set ctl. properties from init; call the Service " - "functions directly"; - } - if (args[1] == kRestoreconProperty) { - return Error() << "InitPropertySet: Do not set '" << kRestoreconProperty - << "' from init; use the restorecon builtin directly"; - } - property_set(args[1], args[2]); return {}; } diff --git a/init/init.cpp b/init/init.cpp index e5d103640..18fb0c3ee 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -28,9 +28,6 @@ #include #include -#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ -#include - #include #include #include @@ -64,7 +61,6 @@ #include "mount_handler.h" #include "mount_namespace.h" #include "property_service.h" -#include "proto_utils.h" #include "reboot.h" #include "reboot_utils.h" #include "security.h" @@ -73,7 +69,6 @@ #include "service.h" #include "service_parser.h" #include "sigchld_handler.h" -#include "system/core/init/property_service.pb.h" #include "util.h" using namespace std::chrono_literals; @@ -95,7 +90,6 @@ static int property_triggers_enabled = 0; static char qemu[32]; static int signal_fd = -1; -static int property_fd = -1; static std::unique_ptr waiting_for_prop(nullptr); static std::string wait_prop_name; @@ -619,44 +613,6 @@ static void RecordStageBoottimes(const boot_clock::time_point& second_stage_star selinux_start_time_ns)); } -static void HandlePropertyFd() { - auto message = ReadMessage(property_fd); - if (!message) { - LOG(ERROR) << "Could not read message from property service: " << message.error(); - return; - } - - auto property_message = PropertyMessage{}; - if (!property_message.ParseFromString(*message)) { - LOG(ERROR) << "Could not parse message from property service"; - return; - } - - switch (property_message.msg_case()) { - case PropertyMessage::kControlMessage: { - auto& control_message = property_message.control_message(); - bool success = HandleControlMessage(control_message.msg(), control_message.name(), - control_message.pid()); - - uint32_t response = success ? PROP_SUCCESS : PROP_ERROR_HANDLE_CONTROL_MESSAGE; - if (control_message.has_fd()) { - int fd = control_message.fd(); - TEMP_FAILURE_RETRY(send(fd, &response, sizeof(response), 0)); - close(fd); - } - break; - } - case PropertyMessage::kChangedMessage: { - auto& changed_message = property_message.changed_message(); - property_changed(changed_message.name(), changed_message.value()); - break; - } - default: - LOG(ERROR) << "Unknown message type from property service: " - << property_message.msg_case(); - } -} - int SecondStageMain(int argc, char** argv) { if (REBOOT_BOOTLOADER_ON_PANIC) { InstallRebootSignalHandlers(); @@ -728,12 +684,7 @@ int SecondStageMain(int argc, char** argv) { UmountDebugRamdisk(); fs_mgr_vendor_overlay_mount_all(); export_oem_lock_status(); - - StartPropertyService(&property_fd); - if (auto result = epoll.RegisterHandler(property_fd, HandlePropertyFd); !result) { - LOG(FATAL) << "Could not register epoll handler for property fd: " << result.error(); - } - + StartPropertyService(&epoll); MountHandler mount_handler(&epoll); set_usb_controller(); diff --git a/init/init.h b/init/init.h index 624a3d40d..cfc28f1be 100644 --- a/init/init.h +++ b/init/init.h @@ -31,6 +31,10 @@ namespace init { Parser CreateParser(ActionManager& action_manager, ServiceList& service_list); Parser CreateServiceOnlyParser(ServiceList& service_list); +bool HandleControlMessage(const std::string& msg, const std::string& arg, pid_t pid); + +void property_changed(const std::string& name, const std::string& value); + bool start_waiting_for_property(const char *name, const char *value); void DumpState(); diff --git a/init/property_service.cpp b/init/property_service.cpp index c78b81b2e..3408ff3be 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -64,10 +63,8 @@ #include "init.h" #include "persistent_properties.h" #include "property_type.h" -#include "proto_utils.h" #include "selinux.h" #include "subcontext.h" -#include "system/core/init/property_service.pb.h" #include "util.h" using namespace std::literals; @@ -79,7 +76,6 @@ using android::base::StartsWith; using android::base::StringPrintf; using android::base::Timer; using android::base::Trim; -using android::base::unique_fd; using android::base::WriteStringToFile; using android::properties::BuildTrie; using android::properties::ParsePropertyInfoFile; @@ -89,13 +85,18 @@ using android::properties::PropertyInfoEntry; namespace android { namespace init { +static constexpr const char kRestoreconProperty[] = "selinux.restorecon_recursive"; + static bool persistent_properties_loaded = false; static int property_set_fd = -1; -static int init_socket = -1; static PropertyInfoAreaFile property_info_area; +uint32_t InitPropertySet(const std::string& name, const std::string& value); + +uint32_t (*property_set)(const std::string& name, const std::string& value) = InitPropertySet; + void CreateSerializedPropertyInfo(); struct PropertyAuditData { @@ -163,17 +164,6 @@ static bool CheckMacPerms(const std::string& name, const char* target_context, return has_access; } -static void SendPropertyChanged(const std::string& name, const std::string& value) { - auto property_msg = PropertyMessage{}; - auto* changed_message = property_msg.mutable_changed_message(); - changed_message->set_name(name); - changed_message->set_value(value); - - if (auto result = SendMessage(init_socket, property_msg); !result) { - LOG(ERROR) << "Failed to send property changed message: " << result.error(); - } -} - static uint32_t PropertySet(const std::string& name, const std::string& value, std::string* error) { size_t valuelen = value.size(); @@ -209,16 +199,7 @@ static uint32_t PropertySet(const std::string& name, const std::string& value, s if (persistent_properties_loaded && StartsWith(name, "persist.")) { WritePersistentProperty(name, value); } - // If init sets ro.persistent_properties.ready to true, then it has finished writing persistent - // properties, and we should write future persistent properties to disk. - if (name == "ro.persistent_properties.ready" && value == "true") { - persistent_properties_loaded = true; - } - // If init hasn't started its main loop, then it won't be handling property changed messages - // anyway, so there's no need to try to send them. - if (init_socket != -1) { - SendPropertyChanged(name, value); - } + property_changed(name, value); return PROP_SUCCESS; } @@ -258,10 +239,35 @@ class AsyncRestorecon { bool thread_started_ = false; }; +uint32_t InitPropertySet(const std::string& name, const std::string& value) { + if (StartsWith(name, "ctl.")) { + LOG(ERROR) << "InitPropertySet: Do not set ctl. properties from init; call the Service " + "functions directly"; + return PROP_ERROR_INVALID_NAME; + } + if (name == kRestoreconProperty) { + LOG(ERROR) << "InitPropertySet: Do not set '" << kRestoreconProperty + << "' from init; use the restorecon builtin directly"; + return PROP_ERROR_INVALID_NAME; + } + + uint32_t result = 0; + ucred cr = {.pid = 1, .uid = 0, .gid = 0}; + std::string error; + result = HandlePropertySet(name, value, kInitContext.c_str(), cr, &error); + if (result != PROP_SUCCESS) { + LOG(ERROR) << "Init cannot set '" << name << "' to '" << value << "': " << error; + } + + return result; +} + class SocketConnection { public: SocketConnection(int socket, const ucred& cred) : socket_(socket), cred_(cred) {} + ~SocketConnection() { close(socket_); } + bool RecvUint32(uint32_t* value, uint32_t* timeout_ms) { return RecvFully(value, sizeof(*value), timeout_ms); } @@ -298,9 +304,6 @@ class SocketConnection { } bool SendUint32(uint32_t value) { - if (!socket_.ok()) { - return false; - } int result = TEMP_FAILURE_RETRY(send(socket_, &value, sizeof(value), 0)); return result == sizeof(value); } @@ -315,9 +318,7 @@ class SocketConnection { return true; } - int Release() { return socket_.release(); } - - int socket() { return socket_.get(); } + int socket() { return socket_; } const ucred& cred() { return cred_; } @@ -388,34 +389,12 @@ class SocketConnection { return bytes_left == 0; } - unique_fd socket_; + int socket_; ucred cred_; + + DISALLOW_IMPLICIT_CONSTRUCTORS(SocketConnection); }; -static uint32_t SendControlMessage(const std::string& msg, const std::string& name, pid_t pid, - SocketConnection* socket, std::string* error) { - auto property_msg = PropertyMessage{}; - auto* control_message = property_msg.mutable_control_message(); - control_message->set_msg(msg); - control_message->set_name(name); - control_message->set_pid(pid); - if (socket != nullptr) { - control_message->set_fd(socket->socket()); - } - - if (auto result = SendMessage(init_socket, property_msg); !result) { - *error = "Failed to send control message: " + result.error().message(); - return PROP_ERROR_HANDLE_CONTROL_MESSAGE; - } - - if (socket != nullptr) { - // We've successfully sent the fd to init, so release it here. - socket->Release(); - } - - return PROP_SUCCESS; -} - bool CheckControlPropertyPerms(const std::string& name, const std::string& value, const std::string& source_context, const ucred& cr) { // We check the legacy method first but these properties are dontaudit, so we only log an audit @@ -483,14 +462,15 @@ uint32_t CheckPermissions(const std::string& name, const std::string& value, // This returns one of the enum of PROP_SUCCESS or PROP_ERROR*. uint32_t HandlePropertySet(const std::string& name, const std::string& value, - const std::string& source_context, const ucred& cr, - SocketConnection* socket, std::string* error) { + const std::string& source_context, const ucred& cr, std::string* error) { if (auto ret = CheckPermissions(name, value, source_context, cr, error); ret != PROP_SUCCESS) { return ret; } if (StartsWith(name, "ctl.")) { - return SendControlMessage(name.c_str() + 4, value, cr.pid, socket, error); + return HandleControlMessage(name.c_str() + 4, value, cr.pid) + ? PROP_SUCCESS + : PROP_ERROR_HANDLE_CONTROL_MESSAGE; } // sys.powerctl is a special property that is used to make the device reboot. We want to log @@ -521,20 +501,6 @@ uint32_t HandlePropertySet(const std::string& name, const std::string& value, return PropertySet(name, value, error); } -uint32_t InitPropertySet(const std::string& name, const std::string& value) { - uint32_t result = 0; - ucred cr = {.pid = 1, .uid = 0, .gid = 0}; - std::string error; - result = HandlePropertySet(name, value, kInitContext.c_str(), cr, nullptr, &error); - if (result != PROP_SUCCESS) { - LOG(ERROR) << "Init cannot set '" << name << "' to '" << value << "': " << error; - } - - return result; -} - -uint32_t (*property_set)(const std::string& name, const std::string& value) = InitPropertySet; - static void handle_property_set_fd() { static constexpr uint32_t kDefaultSocketTimeout = 2000; /* ms */ @@ -583,8 +549,7 @@ static void handle_property_set_fd() { const auto& cr = socket.cred(); std::string error; - uint32_t result = - HandlePropertySet(prop_name, prop_value, source_context, cr, nullptr, &error); + uint32_t result = HandlePropertySet(prop_name, prop_value, source_context, cr, &error); if (result != PROP_SUCCESS) { LOG(ERROR) << "Unable to set property '" << prop_name << "' from uid:" << cr.uid << " gid:" << cr.gid << " pid:" << cr.pid << ": " << error; @@ -612,12 +577,11 @@ static void handle_property_set_fd() { const auto& cr = socket.cred(); std::string error; - uint32_t result = HandlePropertySet(name, value, source_context, cr, &socket, &error); + uint32_t result = HandlePropertySet(name, value, source_context, cr, &error); if (result != PROP_SUCCESS) { LOG(ERROR) << "Unable to set property '" << name << "' from uid:" << cr.uid << " gid:" << cr.gid << " pid:" << cr.pid << ": " << error; } - socket.SendUint32(result); break; } @@ -800,6 +764,7 @@ void load_persist_props(void) { for (const auto& persistent_property_record : persistent_properties.properties()) { property_set(persistent_property_record.name(), persistent_property_record.value()); } + persistent_properties_loaded = true; property_set("ro.persistent_properties.ready", "true"); } @@ -1020,37 +985,21 @@ void CreateSerializedPropertyInfo() { selinux_android_restorecon(kPropertyInfosPath, 0); } -static void PropertyServiceThread() { - while (true) { - handle_property_set_fd(); - } -} - -void StartPropertyService(int* epoll_socket) { +void StartPropertyService(Epoll* epoll) { property_set("ro.property_service.version", "2"); - int sockets[2]; - if (socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0, sockets) != 0) { - PLOG(FATAL) << "Failed to socketpair() between property_service and init"; - } - *epoll_socket = sockets[0]; - init_socket = sockets[1]; - - if (auto result = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC, false, 0666, 0, 0, - {})) { + if (auto result = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, + false, 0666, 0, 0, {})) { property_set_fd = *result; } else { - LOG(FATAL) << "start_property_service socket creation failed: " << result.error(); + PLOG(FATAL) << "start_property_service socket creation failed: " << result.error(); } listen(property_set_fd, 8); - std::thread{PropertyServiceThread}.detach(); - - property_set = [](const std::string& key, const std::string& value) -> uint32_t { - android::base::SetProperty(key, value); - return 0; - }; + if (auto result = epoll->RegisterHandler(property_set_fd, handle_property_set_fd); !result) { + PLOG(FATAL) << result.error(); + } } } // namespace init diff --git a/init/property_service.h b/init/property_service.h index 2dc92a5e9..7f9f84422 100644 --- a/init/property_service.h +++ b/init/property_service.h @@ -25,16 +25,17 @@ namespace android { namespace init { -static constexpr const char kRestoreconProperty[] = "selinux.restorecon_recursive"; - bool CanReadProperty(const std::string& source_context, const std::string& name); extern uint32_t (*property_set)(const std::string& name, const std::string& value); +uint32_t HandlePropertySet(const std::string& name, const std::string& value, + const std::string& source_context, const ucred& cr, std::string* error); + void property_init(); void property_load_boot_defaults(bool load_debug_prop); void load_persist_props(); -void StartPropertyService(int* epoll_socket); +void StartPropertyService(Epoll* epoll); } // namespace init } // namespace android diff --git a/init/property_service.proto b/init/property_service.proto deleted file mode 100644 index f7115269e..000000000 --- a/init/property_service.proto +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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. - */ - -syntax = "proto2"; -option optimize_for = LITE_RUNTIME; - -message PropertyMessage { - message ControlMessage { - optional string msg = 1; - optional string name = 2; - optional int32 pid = 3; - optional int32 fd = 4; - } - - message ChangedMessage { - optional string name = 1; - optional string value = 2; - } - - oneof msg { - ControlMessage control_message = 1; - ChangedMessage changed_message = 2; - }; -} diff --git a/init/proto_utils.h b/init/proto_utils.h deleted file mode 100644 index 93a7d57a8..000000000 --- a/init/proto_utils.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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 -#include - -#include - -#include "result.h" - -namespace android { -namespace init { - -constexpr size_t kBufferSize = 4096; - -inline Result ReadMessage(int socket) { - char buffer[kBufferSize] = {}; - auto result = TEMP_FAILURE_RETRY(recv(socket, buffer, sizeof(buffer), 0)); - if (result == 0) { - return Error(); - } else if (result < 0) { - return ErrnoError(); - } - return std::string(buffer, result); -} - -template -Result SendMessage(int socket, const T& message) { - std::string message_string; - if (!message.SerializeToString(&message_string)) { - return Error() << "Unable to serialize message"; - } - - if (message_string.size() > kBufferSize) { - return Error() << "Serialized message too long to send"; - } - - if (auto result = - TEMP_FAILURE_RETRY(send(socket, message_string.c_str(), message_string.size(), 0)); - result != static_cast(message_string.size())) { - return ErrnoError() << "send() failed to send message contents"; - } - return {}; -} - -} // namespace init -} // namespace android diff --git a/init/subcontext.cpp b/init/subcontext.cpp index ec93b5837..00f91d830 100644 --- a/init/subcontext.cpp +++ b/init/subcontext.cpp @@ -18,17 +18,16 @@ #include #include +#include #include #include #include -#include #include #include #include "action.h" #include "builtins.h" -#include "proto_utils.h" #include "util.h" #if defined(__ANDROID__) @@ -60,6 +59,45 @@ const char* const paths_and_secontexts[2][2] = { namespace { +constexpr size_t kBufferSize = 4096; + +Result ReadMessage(int socket) { + char buffer[kBufferSize] = {}; + auto result = TEMP_FAILURE_RETRY(recv(socket, buffer, sizeof(buffer), 0)); + if (result == 0) { + return Error(); + } else if (result < 0) { + return ErrnoError(); + } + return std::string(buffer, result); +} + +template +Result SendMessage(int socket, const T& message) { + std::string message_string; + if (!message.SerializeToString(&message_string)) { + return Error() << "Unable to serialize message"; + } + + if (message_string.size() > kBufferSize) { + return Error() << "Serialized message too long to send"; + } + + if (auto result = + TEMP_FAILURE_RETRY(send(socket, message_string.c_str(), message_string.size(), 0)); + result != static_cast(message_string.size())) { + return ErrnoError() << "send() failed to send message contents"; + } + return {}; +} + +std::vector> properties_to_set; + +uint32_t SubcontextPropertySet(const std::string& name, const std::string& value) { + properties_to_set.emplace_back(name, value); + return 0; +} + class SubcontextProcess { public: SubcontextProcess(const BuiltinFunctionMap* function_map, std::string context, int init_fd) @@ -93,6 +131,14 @@ void SubcontextProcess::RunCommand(const SubcontextCommand::ExecuteCommand& exec result = RunBuiltinFunction(map_result->function, args, context_); } + for (const auto& [name, value] : properties_to_set) { + auto property = reply->add_properties_to_set(); + property->set_name(name); + property->set_value(value); + } + + properties_to_set.clear(); + if (result) { reply->set_success(true); } else { @@ -178,10 +224,7 @@ int SubcontextMain(int argc, char** argv, const BuiltinFunctionMap* function_map SelabelInitialize(); - property_set = [](const std::string& key, const std::string& value) -> uint32_t { - android::base::SetProperty(key, value); - return 0; - }; + property_set = SubcontextPropertySet; auto subcontext_process = SubcontextProcess(function_map, context, init_fd); subcontext_process.MainLoop(); @@ -268,6 +311,15 @@ Result Subcontext::Execute(const std::vector& args) { return subcontext_reply.error(); } + for (const auto& property : subcontext_reply->properties_to_set()) { + ucred cr = {.pid = pid_, .uid = 0, .gid = 0}; + std::string error; + if (HandlePropertySet(property.name(), property.value(), context_, cr, &error) != 0) { + LOG(ERROR) << "Subcontext init could not set '" << property.name() << "' to '" + << property.value() << "': " << error; + } + } + if (subcontext_reply->reply_case() == SubcontextReply::kFailure) { auto& failure = subcontext_reply->failure(); return ResultError(failure.error_string(), failure.error_errno()); diff --git a/init/subcontext.proto b/init/subcontext.proto index e68115e0e..c31f4fb68 100644 --- a/init/subcontext.proto +++ b/init/subcontext.proto @@ -38,4 +38,10 @@ message SubcontextReply { Failure failure = 2; ExpandArgsReply expand_args_reply = 3; } + + message PropertyToSet { + optional string name = 1; + optional string value = 2; + } + repeated PropertyToSet properties_to_set = 4; } \ No newline at end of file From 6e5dea3519416f216e78319d4f7cc7334a2119c1 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Thu, 29 Aug 2019 14:01:08 -0700 Subject: [PATCH 016/388] fs_mgr: overlayfs: test: noatime on rw mounts only Regression from commit 808763e825127341a08bda66d51e49279e5a8c0a ("fs_mgr: overlayfs: noatime"). Test fails on some targets that do not follow our advise to mount noatime for all partitions. blueline mounts the system partitions relatime. In the grand scheme this is not a problem because we never remount these partitions read-write because of the overlayfs integration. Filter out read-only mounts from those enumerated for noatime, those failures do not concern us in the context of this test. This test expected to fail if CtsOsTestCases EnvironmentTest fails. Test: adb-remount-test.sh Bug: 140253722 Bug: 140014856 Change-Id: I778e7f539ac3f3d6495867e264767f2af25e11c7 --- fs_mgr/tests/adb-remount-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs_mgr/tests/adb-remount-test.sh b/fs_mgr/tests/adb-remount-test.sh index 7ccaf0ee7..f44570385 100755 --- a/fs_mgr/tests/adb-remount-test.sh +++ b/fs_mgr/tests/adb-remount-test.sh @@ -1193,7 +1193,7 @@ if ${overlayfs_needed}; then !(adb_sh grep -v noatime /proc/mounts Date: Tue, 13 Aug 2019 17:01:38 -0700 Subject: [PATCH 017/388] Adapt to google::protobuf::int64 type change Protobuf 3.9.1 redefines google::protobuf::int64 from long long to int64_t, which is sometimes long and sometimes long long. Use PRId64 to print it. Bug: 117607748 Test: m checkbuild Exempt-From-Owner-Approval: approved at https://android-review.googlesource.com/q/I6699cfdb0f0424aa3e1c98b59d941beb9f133055 Change-Id: I6699cfdb0f0424aa3e1c98b59d941beb9f133055 --- .../deploypatchgenerator/deploy_patch_generator.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/adb/fastdeploy/deploypatchgenerator/deploy_patch_generator.cpp b/adb/fastdeploy/deploypatchgenerator/deploy_patch_generator.cpp index 22c924322..154c9b908 100644 --- a/adb/fastdeploy/deploypatchgenerator/deploy_patch_generator.cpp +++ b/adb/fastdeploy/deploypatchgenerator/deploy_patch_generator.cpp @@ -46,10 +46,10 @@ void DeployPatchGenerator::Log(const char* fmt, ...) { void DeployPatchGenerator::APKEntryToLog(const APKEntry& entry) { Log("Filename: %s", entry.filename().c_str()); - Log("CRC32: 0x%08llX", entry.crc32()); - Log("Data Offset: %lld", entry.dataoffset()); - Log("Compressed Size: %lld", entry.compressedsize()); - Log("Uncompressed Size: %lld", entry.uncompressedsize()); + Log("CRC32: 0x%08" PRIX64, entry.crc32()); + Log("Data Offset: %" PRId64, entry.dataoffset()); + Log("Compressed Size: %" PRId64, entry.compressedsize()); + Log("Uncompressed Size: %" PRId64, entry.uncompressedsize()); } void DeployPatchGenerator::APKMetaDataToLog(const char* file, const APKMetaData& metadata) { @@ -164,4 +164,4 @@ uint64_t DeployPatchGenerator::BuildIdenticalEntries(std::vector& o return lhs.localEntry->dataoffset() < rhs.localEntry->dataoffset(); }); return totalSize; -} \ No newline at end of file +} From 73f8ca62d8a58a8aed26dcc1c07c341444e0f248 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 27 Aug 2019 18:17:26 -0700 Subject: [PATCH 018/388] Use installed paths of vndk libraries for ld.config.txt The installed file name of modules may not match the module name. Use module-installed-files to get the installed file name. Bug: 117607748 Test: m checkbuild Test: only libprotobuf-cpp-*-3.9.1.so changed in ld.config.R.txt Exempt-From-Owner-Approval: approved at https://android-review.googlesource.com/q/I83b7519f344b65b6cd98c4cabcf9bce0e753ba92 Change-Id: I83b7519f344b65b6cd98c4cabcf9bce0e753ba92 --- rootdir/update_and_install_ld_config.mk | 31 +++++++++++++++++-------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/rootdir/update_and_install_ld_config.mk b/rootdir/update_and_install_ld_config.mk index dbe60e54b..9d131dc89 100644 --- a/rootdir/update_and_install_ld_config.mk +++ b/rootdir/update_and_install_ld_config.mk @@ -70,19 +70,30 @@ endif # /system image. llndk_libraries_moved_to_apex_list:=$(LLNDK_MOVED_TO_APEX_LIBRARIES) +# Returns the unique installed basenames of a module, or module.so if there are +# none. The guess is to handle cases like libc, where the module itself is +# marked uninstallable but a symlink is installed with the name libc.so. # $(1): list of libraries -# $(2): output file to write the list of libraries to -define write-libs-to-file -$(2): PRIVATE_LIBRARIES := $(1) -$(2): - echo -n > $$@ && $$(foreach lib,$$(PRIVATE_LIBRARIES),echo $$(lib).so >> $$@;) +# $(2): suffix to to add to each library (not used for guess) +define module-installed-files-or-guess +$(foreach lib,$(1),$(or $(strip $(sort $(notdir $(call module-installed-files,$(lib)$(2))))),$(lib).so)) endef -$(eval $(call write-libs-to-file,$(llndk_libraries_list),$(llndk_libraries_file))) -$(eval $(call write-libs-to-file,$(vndksp_libraries_list),$(vndksp_libraries_file))) -$(eval $(call write-libs-to-file,$(VNDK_CORE_LIBRARIES),$(vndkcore_libraries_file))) -$(eval $(call write-libs-to-file,$(VNDK_PRIVATE_LIBRARIES),$(vndkprivate_libraries_file))) + +# $(1): list of libraries +# $(2): suffix to add to each library +# $(3): output file to write the list of libraries to +define write-libs-to-file +$(3): PRIVATE_LIBRARIES := $(1) +$(3): PRIVATE_SUFFIX := $(2) +$(3): + echo -n > $$@ && $$(foreach so,$$(call module-installed-files-or-guess,$$(PRIVATE_LIBRARIES),$$(PRIVATE_SUFFIX)),echo $$(so) >> $$@;) +endef +$(eval $(call write-libs-to-file,$(llndk_libraries_list),,$(llndk_libraries_file))) +$(eval $(call write-libs-to-file,$(vndksp_libraries_list),.vendor,$(vndksp_libraries_file))) +$(eval $(call write-libs-to-file,$(VNDK_CORE_LIBRARIES),.vendor,$(vndkcore_libraries_file))) +$(eval $(call write-libs-to-file,$(VNDK_PRIVATE_LIBRARIES),.vendor,$(vndkprivate_libraries_file))) ifeq ($(my_vndk_use_core_variant),true) -$(eval $(call write-libs-to-file,$(VNDK_USING_CORE_VARIANT_LIBRARIES),$(vndk_using_core_variant_libraries_file))) +$(eval $(call write-libs-to-file,$(VNDK_USING_CORE_VARIANT_LIBRARIES),,$(vndk_using_core_variant_libraries_file))) endif endif # ifneq ($(lib_list_from_prebuilts),true) From 2998fdb56daa7a6d4437c1d42d05c3592d31726e Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Tue, 3 Sep 2019 18:17:19 -0700 Subject: [PATCH 019/388] Remove static constructors from libmeminfo This CL changes libmeminfo's API to be less picky about the types of its inputs and outputs and exposes the list of default memory types as a constexpr std::array that doesn't need to be constructed as dlopen time. Test: tests pass; device boots Bug: 140456977 Change-Id: Ice45a5400cc77540fb13352bba1adb7737877bcb --- libmeminfo/include/meminfo/sysmeminfo.h | 60 ++++++------ libmeminfo/libmeminfo_benchmark.cpp | 19 ++-- libmeminfo/libmeminfo_test.cpp | 21 +++-- libmeminfo/sysmeminfo.cpp | 118 ++++++++---------------- 4 files changed, 97 insertions(+), 121 deletions(-) diff --git a/libmeminfo/include/meminfo/sysmeminfo.h b/libmeminfo/include/meminfo/sysmeminfo.h index 83889208d..4a5a18b57 100644 --- a/libmeminfo/include/meminfo/sysmeminfo.h +++ b/libmeminfo/include/meminfo/sysmeminfo.h @@ -18,10 +18,12 @@ #include +#include #include +#include #include #include -#include +#include namespace android { namespace meminfo { @@ -29,30 +31,36 @@ namespace meminfo { class SysMemInfo final { // System or Global memory accounting public: - static constexpr const char* kMemTotal = "MemTotal:"; - static constexpr const char* kMemFree = "MemFree:"; - static constexpr const char* kMemBuffers = "Buffers:"; - static constexpr const char* kMemCached = "Cached:"; - static constexpr const char* kMemShmem = "Shmem:"; - static constexpr const char* kMemSlab = "Slab:"; - static constexpr const char* kMemSReclaim = "SReclaimable:"; - static constexpr const char* kMemSUnreclaim = "SUnreclaim:"; - static constexpr const char* kMemSwapTotal = "SwapTotal:"; - static constexpr const char* kMemSwapFree = "SwapFree:"; - static constexpr const char* kMemMapped = "Mapped:"; - static constexpr const char* kMemVmallocUsed = "VmallocUsed:"; - static constexpr const char* kMemPageTables = "PageTables:"; - static constexpr const char* kMemKernelStack = "KernelStack:"; + static constexpr const char kMemTotal[] = "MemTotal:"; + static constexpr const char kMemFree[] = "MemFree:"; + static constexpr const char kMemBuffers[] = "Buffers:"; + static constexpr const char kMemCached[] = "Cached:"; + static constexpr const char kMemShmem[] = "Shmem:"; + static constexpr const char kMemSlab[] = "Slab:"; + static constexpr const char kMemSReclaim[] = "SReclaimable:"; + static constexpr const char kMemSUnreclaim[] = "SUnreclaim:"; + static constexpr const char kMemSwapTotal[] = "SwapTotal:"; + static constexpr const char kMemSwapFree[] = "SwapFree:"; + static constexpr const char kMemMapped[] = "Mapped:"; + static constexpr const char kMemVmallocUsed[] = "VmallocUsed:"; + static constexpr const char kMemPageTables[] = "PageTables:"; + static constexpr const char kMemKernelStack[] = "KernelStack:"; - static const std::vector kDefaultSysMemInfoTags; + static constexpr std::initializer_list kDefaultSysMemInfoTags = { + SysMemInfo::kMemTotal, SysMemInfo::kMemFree, SysMemInfo::kMemBuffers, + SysMemInfo::kMemCached, SysMemInfo::kMemShmem, SysMemInfo::kMemSlab, + SysMemInfo::kMemSReclaim, SysMemInfo::kMemSUnreclaim, SysMemInfo::kMemSwapTotal, + SysMemInfo::kMemSwapFree, SysMemInfo::kMemMapped, SysMemInfo::kMemVmallocUsed, + SysMemInfo::kMemPageTables, SysMemInfo::kMemKernelStack, + }; SysMemInfo() = default; // Parse /proc/meminfo and read values that are needed - bool ReadMemInfo(const std::string& path = "/proc/meminfo"); - bool ReadMemInfo(const std::vector& tags, std::vector* out, - const std::string& path = "/proc/meminfo"); - bool ReadMemInfo(std::vector* out, const std::string& path = "/proc/meminfo"); + bool ReadMemInfo(const char* path = "/proc/meminfo"); + bool ReadMemInfo(size_t ntags, const std::string_view* tags, uint64_t* out, + const char* path = "/proc/meminfo"); + bool ReadMemInfo(std::vector* out, const char* path = "/proc/meminfo"); // Parse /proc/vmallocinfo and return total physical memory mapped // in vmalloc area by the kernel. @@ -75,19 +83,19 @@ class SysMemInfo final { uint64_t mem_vmalloc_used_kb() { return mem_in_kb_[kMemVmallocUsed]; } uint64_t mem_page_tables_kb() { return mem_in_kb_[kMemPageTables]; } uint64_t mem_kernel_stack_kb() { return mem_in_kb_[kMemKernelStack]; } - uint64_t mem_zram_kb(const std::string& zram_dev = ""); + uint64_t mem_zram_kb(const char* zram_dev = nullptr); private: - std::map mem_in_kb_; - bool MemZramDevice(const std::string& zram_dev, uint64_t* mem_zram_dev); - bool ReadMemInfo(const std::vector& tags, const std::string& path, - std::function store_val); + std::map mem_in_kb_; + bool MemZramDevice(const char* zram_dev, uint64_t* mem_zram_dev); + bool ReadMemInfo(const char* path, size_t ntags, const std::string_view* tags, + std::function store_val); }; // Parse /proc/vmallocinfo and return total physical memory mapped // in vmalloc area by the kernel. Note that this deliberately ignores binder buffers. They are // _always_ mapped in a process and are counted for in each process. -uint64_t ReadVmallocInfo(const std::string& path = "/proc/vmallocinfo"); +uint64_t ReadVmallocInfo(const char* path = "/proc/vmallocinfo"); } // namespace meminfo } // namespace android diff --git a/libmeminfo/libmeminfo_benchmark.cpp b/libmeminfo/libmeminfo_benchmark.cpp index d88919b66..7450c6c80 100644 --- a/libmeminfo/libmeminfo_benchmark.cpp +++ b/libmeminfo/libmeminfo_benchmark.cpp @@ -218,8 +218,8 @@ Hugepagesize: 2048 kB)meminfo"; android::base::WriteStringToFd(meminfo, tf.fd); std::string file = std::string(tf.path); - std::vector mem(MEMINFO_COUNT); - const std::vector tags = { + std::vector mem; + const std::vector tags = { SysMemInfo::kMemTotal, SysMemInfo::kMemFree, SysMemInfo::kMemBuffers, SysMemInfo::kMemCached, SysMemInfo::kMemShmem, SysMemInfo::kMemSlab, SysMemInfo::kMemSReclaim, SysMemInfo::kMemSUnreclaim, SysMemInfo::kMemSwapTotal, @@ -229,7 +229,8 @@ Hugepagesize: 2048 kB)meminfo"; SysMemInfo smi; for (auto _ : state) { - smi.ReadMemInfo(tags, &mem, file); + mem.resize(tags.size()); + smi.ReadMemInfo(tags.size(), tags.data(), mem.data(), file.c_str()); } } BENCHMARK(BM_ReadMemInfo_new); @@ -276,7 +277,7 @@ static void BM_ZramTotal_new(benchmark::State& state) { std::string zram_mmstat_dir = exec_dir + "/testdata1/"; SysMemInfo smi; for (auto _ : state) { - uint64_t zram_total __attribute__((unused)) = smi.mem_zram_kb(zram_mmstat_dir); + uint64_t zram_total __attribute__((unused)) = smi.mem_zram_kb(zram_mmstat_dir.c_str()); } } BENCHMARK(BM_ZramTotal_new); @@ -390,14 +391,16 @@ Hugepagesize: 2048 kB)meminfo"; android::base::WriteStringToFd(meminfo, tf.fd); std::string file = std::string(tf.path); - std::vector mem(MEMINFO_COUNT); - std::vector tags(SysMemInfo::kDefaultSysMemInfoTags); + std::vector mem; + std::vector tags(SysMemInfo::kDefaultSysMemInfoTags.begin(), + SysMemInfo::kDefaultSysMemInfoTags.end()); auto it = tags.begin(); tags.insert(it + MEMINFO_ZRAM_TOTAL, "Zram:"); SysMemInfo smi; for (auto _ : state) { - smi.ReadMemInfo(tags, &mem, file); + mem.resize(tags.size()); + smi.ReadMemInfo(tags.size(), tags.data(), mem.data(), file.c_str()); CHECK_EQ(mem[MEMINFO_KERNEL_STACK], 4880u); } } @@ -455,7 +458,7 @@ static void BM_VmallocInfo_new(benchmark::State& state) { std::string vmallocinfo = ::android::base::StringPrintf("%s/testdata1/vmallocinfo", exec_dir.c_str()); for (auto _ : state) { - CHECK_EQ(::android::meminfo::ReadVmallocInfo(vmallocinfo), 29884416); + CHECK_EQ(::android::meminfo::ReadVmallocInfo(vmallocinfo.c_str()), 29884416); } } BENCHMARK(BM_VmallocInfo_new); diff --git a/libmeminfo/libmeminfo_test.cpp b/libmeminfo/libmeminfo_test.cpp index 4c2be9186..00e139f61 100644 --- a/libmeminfo/libmeminfo_test.cpp +++ b/libmeminfo/libmeminfo_test.cpp @@ -585,10 +585,10 @@ TEST(SysMemInfo, TestZramTotal) { SysMemInfo mi; std::string zram_mmstat_dir = exec_dir + "/testdata1/"; - EXPECT_EQ(mi.mem_zram_kb(zram_mmstat_dir), 30504); + EXPECT_EQ(mi.mem_zram_kb(zram_mmstat_dir.c_str()), 30504); std::string zram_memused_dir = exec_dir + "/testdata2/"; - EXPECT_EQ(mi.mem_zram_kb(zram_memused_dir), 30504); + EXPECT_EQ(mi.mem_zram_kb(zram_memused_dir.c_str()), 30504); } enum { @@ -660,15 +660,16 @@ Hugepagesize: 2048 kB)meminfo"; ASSERT_TRUE(tf.fd != -1); ASSERT_TRUE(::android::base::WriteStringToFd(meminfo, tf.fd)); std::string file = std::string(tf.path); - std::vector mem(MEMINFO_COUNT); - std::vector tags(SysMemInfo::kDefaultSysMemInfoTags); + std::vector mem; + std::vector tags(SysMemInfo::kDefaultSysMemInfoTags.begin(), + SysMemInfo::kDefaultSysMemInfoTags.end()); auto it = tags.begin(); tags.insert(it + MEMINFO_ZRAM_TOTAL, "Zram:"); SysMemInfo mi; // Read system memory info - EXPECT_TRUE(mi.ReadMemInfo(tags, &mem, file)); - + mem.resize(tags.size()); + EXPECT_TRUE(mi.ReadMemInfo(tags.size(), tags.data(), mem.data(), file.c_str())); EXPECT_EQ(mem[MEMINFO_TOTAL], 3019740); EXPECT_EQ(mem[MEMINFO_FREE], 1809728); EXPECT_EQ(mem[MEMINFO_BUFFERS], 54736); @@ -697,7 +698,7 @@ TEST(SysMemInfo, TestVmallocInfoNoMemory) { ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd)); std::string file = std::string(tf.path); - EXPECT_EQ(ReadVmallocInfo(file), 0); + EXPECT_EQ(ReadVmallocInfo(file.c_str()), 0); } TEST(SysMemInfo, TestVmallocInfoKernel) { @@ -709,7 +710,7 @@ TEST(SysMemInfo, TestVmallocInfoKernel) { ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd)); std::string file = std::string(tf.path); - EXPECT_EQ(ReadVmallocInfo(file), getpagesize()); + EXPECT_EQ(ReadVmallocInfo(file.c_str()), getpagesize()); } TEST(SysMemInfo, TestVmallocInfoModule) { @@ -721,7 +722,7 @@ TEST(SysMemInfo, TestVmallocInfoModule) { ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd)); std::string file = std::string(tf.path); - EXPECT_EQ(ReadVmallocInfo(file), 6 * getpagesize()); + EXPECT_EQ(ReadVmallocInfo(file.c_str()), 6 * getpagesize()); } TEST(SysMemInfo, TestVmallocInfoAll) { @@ -738,7 +739,7 @@ TEST(SysMemInfo, TestVmallocInfoAll) { ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd)); std::string file = std::string(tf.path); - EXPECT_EQ(ReadVmallocInfo(file), 7 * getpagesize()); + EXPECT_EQ(ReadVmallocInfo(file.c_str()), 7 * getpagesize()); } int main(int argc, char** argv) { diff --git a/libmeminfo/sysmeminfo.cpp b/libmeminfo/sysmeminfo.cpp index 5cfa6c373..ef68ac4aa 100644 --- a/libmeminfo/sysmeminfo.cpp +++ b/libmeminfo/sysmeminfo.cpp @@ -45,37 +45,36 @@ namespace android { namespace meminfo { -const std::vector SysMemInfo::kDefaultSysMemInfoTags = { - SysMemInfo::kMemTotal, SysMemInfo::kMemFree, SysMemInfo::kMemBuffers, - SysMemInfo::kMemCached, SysMemInfo::kMemShmem, SysMemInfo::kMemSlab, - SysMemInfo::kMemSReclaim, SysMemInfo::kMemSUnreclaim, SysMemInfo::kMemSwapTotal, - SysMemInfo::kMemSwapFree, SysMemInfo::kMemMapped, SysMemInfo::kMemVmallocUsed, - SysMemInfo::kMemPageTables, SysMemInfo::kMemKernelStack, -}; - -bool SysMemInfo::ReadMemInfo(const std::string& path) { - return ReadMemInfo(SysMemInfo::kDefaultSysMemInfoTags, path, - [&](const std::string& tag, uint64_t val) { mem_in_kb_[tag] = val; }); +bool SysMemInfo::ReadMemInfo(const char* path) { + return ReadMemInfo(path, SysMemInfo::kDefaultSysMemInfoTags.size(), + &*SysMemInfo::kDefaultSysMemInfoTags.begin(), + [&](std::string_view tag, uint64_t val) { + // Safe to store the string_view in the map + // because the tags from + // kDefaultSysMemInfoTags are all + // statically-allocated. + mem_in_kb_[tag] = val; + }); } -bool SysMemInfo::ReadMemInfo(std::vector* out, const std::string& path) { - return ReadMemInfo(SysMemInfo::kDefaultSysMemInfoTags, out, path); -} - -bool SysMemInfo::ReadMemInfo(const std::vector& tags, std::vector* out, - const std::string& path) { +bool SysMemInfo::ReadMemInfo(std::vector* out, const char* path) { out->clear(); - out->resize(tags.size()); + out->resize(SysMemInfo::kDefaultSysMemInfoTags.size()); + return ReadMemInfo(SysMemInfo::kDefaultSysMemInfoTags.size(), + &*SysMemInfo::kDefaultSysMemInfoTags.begin(), out->data(), path); +} - return ReadMemInfo(tags, path, [&]([[maybe_unused]] const std::string& tag, uint64_t val) { - auto it = std::find(tags.begin(), tags.end(), tag); - if (it == tags.end()) { +bool SysMemInfo::ReadMemInfo(size_t ntags, const std::string_view* tags, uint64_t* out, + const char* path) { + return ReadMemInfo(path, ntags, tags, [&]([[maybe_unused]] std::string_view tag, uint64_t val) { + auto it = std::find(tags, tags + ntags, tag); + if (it == tags + ntags) { LOG(ERROR) << "Tried to store invalid tag: " << tag; return; } - auto index = std::distance(tags.begin(), it); + auto index = std::distance(tags, it); // store the values in the same order as the tags - out->at(index) = val; + out[index] = val; }); } @@ -83,46 +82,10 @@ uint64_t SysMemInfo::ReadVmallocInfo() { return ::android::meminfo::ReadVmallocInfo(); } -// TODO: Delete this function if it can't match up with the c-like implementation below. -// Currently, this added about 50 % extra overhead on hikey. -#if 0 -bool SysMemInfo::ReadMemInfo(const std::vector& tags, const std::string& path) { - std::string buffer; - if (!::android::base::ReadFileToString(path, &buffer)) { - PLOG(ERROR) << "Failed to read : " << path; - return false; - } - - uint32_t total_found = 0; - for (auto s = buffer.begin(); s < buffer.end() && total_found < tags.size();) { - for (auto& tag : tags) { - if (tag == std::string(s, s + tag.size())) { - s += tag.size(); - while (isspace(*s)) s++; - auto num_start = s; - while (std::isdigit(*s)) s++; - - std::string number(num_start, num_start + (s - num_start)); - if (!::android::base::ParseUint(number, &mem_in_kb_[tag])) { - LOG(ERROR) << "Failed to parse uint"; - return false; - } - total_found++; - break; - } - } - while (s < buffer.end() && *s != '\n') s++; - if (s < buffer.end()) s++; - } - - return true; -} - -#else -bool SysMemInfo::ReadMemInfo(const std::vector& tags, const std::string& path, - std::function store_val) { +bool SysMemInfo::ReadMemInfo(const char* path, size_t ntags, const std::string_view* tags, + std::function store_val) { char buffer[4096]; - int fd = open(path.c_str(), O_RDONLY | O_CLOEXEC); + int fd = open(path, O_RDONLY | O_CLOEXEC); if (fd < 0) { PLOG(ERROR) << "Failed to open file :" << path; return false; @@ -139,8 +102,9 @@ bool SysMemInfo::ReadMemInfo(const std::vector& tags, const std::st uint32_t found = 0; uint32_t lineno = 0; bool zram_tag_found = false; - while (*p && found < tags.size()) { - for (auto& tag : tags) { + while (*p && found < ntags) { + for (size_t tagno = 0; tagno < ntags; ++tagno) { + const std::string_view& tag = tags[tagno]; // Special case for "Zram:" tag that android_os_Debug and friends look // up along with the rest of the numbers from /proc/meminfo if (!zram_tag_found && tag == "Zram:") { @@ -150,7 +114,7 @@ bool SysMemInfo::ReadMemInfo(const std::vector& tags, const std::st continue; } - if (strncmp(p, tag.c_str(), tag.size()) == 0) { + if (strncmp(p, tag.data(), tag.size()) == 0) { p += tag.size(); while (*p == ' ') p++; char* endptr = nullptr; @@ -175,12 +139,11 @@ bool SysMemInfo::ReadMemInfo(const std::vector& tags, const std::st return true; } -#endif -uint64_t SysMemInfo::mem_zram_kb(const std::string& zram_dev) { +uint64_t SysMemInfo::mem_zram_kb(const char* zram_dev_cstr) { uint64_t mem_zram_total = 0; - if (!zram_dev.empty()) { - if (!MemZramDevice(zram_dev, &mem_zram_total)) { + if (zram_dev_cstr) { + if (!MemZramDevice(zram_dev_cstr, &mem_zram_total)) { return 0; } return mem_zram_total / 1024; @@ -188,15 +151,15 @@ uint64_t SysMemInfo::mem_zram_kb(const std::string& zram_dev) { constexpr uint32_t kMaxZramDevices = 256; for (uint32_t i = 0; i < kMaxZramDevices; i++) { - std::string zram_dev = ::android::base::StringPrintf("/sys/block/zram%u/", i); - if (access(zram_dev.c_str(), F_OK)) { + std::string zram_dev_abspath = ::android::base::StringPrintf("/sys/block/zram%u/", i); + if (access(zram_dev_abspath.c_str(), F_OK)) { // We assume zram devices appear in range 0-255 and appear always in sequence // under /sys/block. So, stop looking for them once we find one is missing. break; } uint64_t mem_zram_dev; - if (!MemZramDevice(zram_dev, &mem_zram_dev)) { + if (!MemZramDevice(zram_dev_abspath.c_str(), &mem_zram_dev)) { return 0; } @@ -206,8 +169,8 @@ uint64_t SysMemInfo::mem_zram_kb(const std::string& zram_dev) { return mem_zram_total / 1024; } -bool SysMemInfo::MemZramDevice(const std::string& zram_dev, uint64_t* mem_zram_dev) { - std::string mmstat = ::android::base::StringPrintf("%s/%s", zram_dev.c_str(), "mm_stat"); +bool SysMemInfo::MemZramDevice(const char* zram_dev, uint64_t* mem_zram_dev) { + std::string mmstat = ::android::base::StringPrintf("%s/%s", zram_dev, "mm_stat"); auto mmstat_fp = std::unique_ptr{fopen(mmstat.c_str(), "re"), fclose}; if (mmstat_fp != nullptr) { // only if we do have mmstat, use it. Otherwise, fall through to trying out the old @@ -220,7 +183,8 @@ bool SysMemInfo::MemZramDevice(const std::string& zram_dev, uint64_t* mem_zram_d } std::string content; - if (::android::base::ReadFileToString(zram_dev + "mem_used_total", &content)) { + if (::android::base::ReadFileToString( + ::android::base::StringPrintf("%s/mem_used_total", zram_dev), &content)) { *mem_zram_dev = strtoull(content.c_str(), NULL, 10); if (*mem_zram_dev == ULLONG_MAX) { PLOG(ERROR) << "Malformed mem_used_total file for zram dev: " << zram_dev @@ -236,9 +200,9 @@ bool SysMemInfo::MemZramDevice(const std::string& zram_dev, uint64_t* mem_zram_d } // Public methods -uint64_t ReadVmallocInfo(const std::string& path) { +uint64_t ReadVmallocInfo(const char* path) { uint64_t vmalloc_total = 0; - auto fp = std::unique_ptr{fopen(path.c_str(), "re"), fclose}; + auto fp = std::unique_ptr{fopen(path, "re"), fclose}; if (fp == nullptr) { return vmalloc_total; } From f66b74f820c9ecfb09dc45b88dae1fc3b73b61ea Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Wed, 4 Sep 2019 15:26:52 -0700 Subject: [PATCH 020/388] init: add exec_reboot_on_failure builtin Add exec_reboot_on_failure builtin and refactor the VDC commands that had similar functionality. These will now also reboot in the case that the program cannot be found or run for any reason. Test: boots normally, reboots if command is not found or if command returns status '1' Change-Id: I1c99498c2b741512a50188e1a325c25e9ec8fba0 (cherry picked from commit 7896e7adccbd272533ee2250f4a9c65cd4ca66d0) --- init/builtins.cpp | 69 +++++++++++++++++++++++++++-------------- init/check_builtins.cpp | 9 ++++++ init/check_builtins.h | 1 + 3 files changed, 56 insertions(+), 23 deletions(-) diff --git a/init/builtins.cpp b/init/builtins.cpp index 7c66de5f8..d2c73cb69 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -80,6 +80,7 @@ using namespace std::literals::string_literals; using android::base::Basename; +using android::base::StringPrintf; using android::base::unique_fd; using android::fs_mgr::Fstab; using android::fs_mgr::ReadFstabFromFile; @@ -1062,34 +1063,59 @@ static bool is_file_crypto() { return android::base::GetProperty("ro.crypto.type", "") == "file"; } -static Result ExecWithRebootOnFailure(const std::string& reboot_reason, - const BuiltinArguments& args) { - auto service = Service::MakeTemporaryOneshotService(args.args); +static Result ExecWithFunctionOnFailure(const std::vector& args, + std::function function) { + auto service = Service::MakeTemporaryOneshotService(args); if (!service) { - return Error() << "Could not create exec service: " << service.error(); + function("MakeTemporaryOneshotService failed: " + service.error().message()); } - (*service)->AddReapCallback([reboot_reason](const siginfo_t& siginfo) { + (*service)->AddReapCallback([function](const siginfo_t& siginfo) { if (siginfo.si_code != CLD_EXITED || siginfo.si_status != 0) { - // TODO (b/122850122): support this in gsi - if (fscrypt_is_native() && !android::gsi::IsGsiRunning()) { - LOG(ERROR) << "Rebooting into recovery, reason: " << reboot_reason; - if (auto result = reboot_into_recovery( - {"--prompt_and_wipe_data", "--reason="s + reboot_reason}); - !result) { - LOG(FATAL) << "Could not reboot into recovery: " << result.error(); - } - } else { - LOG(ERROR) << "Failure (reboot suppressed): " << reboot_reason; - } + function(StringPrintf("Exec service failed, status %d", siginfo.si_status)); } }); if (auto result = (*service)->ExecStart(); !result) { - return Error() << "Could not start exec service: " << result.error(); + function("ExecStart failed: " + result.error().message()); } ServiceList::GetInstance().AddService(std::move(*service)); return {}; } +static Result do_exec_reboot_on_failure(const BuiltinArguments& args) { + auto reboot_reason = args[1]; + auto reboot = [reboot_reason](const std::string& message) { + property_set(LAST_REBOOT_REASON_PROPERTY, reboot_reason); + sync(); + LOG(FATAL) << message << ": rebooting into bootloader, reason: " << reboot_reason; + }; + + std::vector remaining_args(args.begin() + 1, args.end()); + remaining_args[0] = args[0]; + + return ExecWithFunctionOnFailure(remaining_args, reboot); +} + +static Result ExecVdcRebootOnFailure(const std::string& vdc_arg) { + auto reboot_reason = vdc_arg + "_failed"; + + auto reboot = [reboot_reason](const std::string& message) { + // TODO (b/122850122): support this in gsi + if (fscrypt_is_native() && !android::gsi::IsGsiRunning()) { + LOG(ERROR) << message << ": Rebooting into recovery, reason: " << reboot_reason; + if (auto result = reboot_into_recovery( + {"--prompt_and_wipe_data", "--reason="s + reboot_reason}); + !result) { + LOG(FATAL) << "Could not reboot into recovery: " << result.error(); + } + } else { + LOG(ERROR) << "Failure (reboot suppressed): " << reboot_reason; + } + }; + + std::vector args = {"exec", "/system/bin/vdc", "--wait", "cryptfs", vdc_arg}; + return ExecWithFunctionOnFailure(args, reboot); +} + static Result do_installkey(const BuiltinArguments& args) { if (!is_file_crypto()) return {}; @@ -1097,15 +1123,11 @@ static Result do_installkey(const BuiltinArguments& args) { if (!make_dir(unencrypted_dir, 0700) && errno != EEXIST) { return ErrnoError() << "Failed to create " << unencrypted_dir; } - return ExecWithRebootOnFailure( - "enablefilecrypto_failed", - {{"exec", "/system/bin/vdc", "--wait", "cryptfs", "enablefilecrypto"}, args.context}); + return ExecVdcRebootOnFailure("enablefilecrypto"); } static Result do_init_user0(const BuiltinArguments& args) { - return ExecWithRebootOnFailure( - "init_user0_failed", - {{"exec", "/system/bin/vdc", "--wait", "cryptfs", "init_user0"}, args.context}); + return ExecVdcRebootOnFailure("init_user0"); } static Result do_mark_post_data(const BuiltinArguments& args) { @@ -1180,6 +1202,7 @@ const BuiltinFunctionMap& GetBuiltinFunctionMap() { {"enable", {1, 1, {false, do_enable}}}, {"exec", {1, kMax, {false, do_exec}}}, {"exec_background", {1, kMax, {false, do_exec_background}}}, + {"exec_reboot_on_failure", {2, kMax, {false, do_exec_reboot_on_failure}}}, {"exec_start", {1, 1, {false, do_exec_start}}}, {"export", {2, 2, {false, do_export}}}, {"hostname", {1, 1, {true, do_hostname}}}, diff --git a/init/check_builtins.cpp b/init/check_builtins.cpp index 771f1d773..2efaeeafa 100644 --- a/init/check_builtins.cpp +++ b/init/check_builtins.cpp @@ -81,6 +81,15 @@ Result check_exec_background(const BuiltinArguments& args) { return check_exec(std::move(args)); } +Result check_exec_reboot_on_failure(const BuiltinArguments& args) { + BuiltinArguments remaining_args(args.context); + + remaining_args.args = std::vector(args.begin() + 1, args.end()); + remaining_args.args[0] = args[0]; + + return check_exec(remaining_args); +} + Result check_interface_restart(const BuiltinArguments& args) { if (auto result = IsKnownInterface(args[1]); !result) { return result.error(); diff --git a/init/check_builtins.h b/init/check_builtins.h index 4ff0d0c3b..fb345560a 100644 --- a/init/check_builtins.h +++ b/init/check_builtins.h @@ -25,6 +25,7 @@ namespace init { Result check_chown(const BuiltinArguments& args); Result check_exec(const BuiltinArguments& args); Result check_exec_background(const BuiltinArguments& args); +Result check_exec_reboot_on_failure(const BuiltinArguments& args); Result check_interface_restart(const BuiltinArguments& args); Result check_interface_start(const BuiltinArguments& args); Result check_interface_stop(const BuiltinArguments& args); From 6c26c2d9facf6ea0eedd4234f78613fab37ea7b0 Mon Sep 17 00:00:00 2001 From: Jim Blackler Date: Tue, 10 Sep 2019 15:30:05 +0100 Subject: [PATCH 021/388] lmkd: Maintain pid to taskname mapping to amend kill reports. Required because the kernel cannot always get the taskname safely at the time the process is killed (due to competition for mm->mmap_sem). Test: manually Bug: 130017100 Signed-off-by: Jim Blackler Change-Id: I27a2c3340da321570f0832d58fe9e79ca031620b --- lmkd/lmkd.c | 26 +++++++++++--- lmkd/statslog.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ lmkd/statslog.h | 29 +++++++++++++++ 3 files changed, 147 insertions(+), 4 deletions(-) diff --git a/lmkd/lmkd.c b/lmkd/lmkd.c index d17da128b..f06717da0 100644 --- a/lmkd/lmkd.c +++ b/lmkd/lmkd.c @@ -362,6 +362,9 @@ static uint32_t killcnt_total = 0; /* PAGE_SIZE / 1024 */ static long page_k; +static char* proc_get_name(int pid); +static void poll_kernel(); + static bool parse_int64(const char* str, int64_t* ret) { char* endptr; long long val = strtoll(str, &endptr, 10); @@ -634,6 +637,9 @@ static void cmd_procprio(LMKD_CTRL_PACKET packet) { } if (use_inkernel_interface) { +#ifdef LMKD_LOG_STATS + stats_store_taskname(params.pid, proc_get_name(params.pid)); +#endif return; } @@ -704,6 +710,16 @@ static void cmd_procremove(LMKD_CTRL_PACKET packet) { struct lmk_procremove params; if (use_inkernel_interface) { +#ifdef LMKD_LOG_STATS + /* Perform an extra check before the pid is removed, after which it + * will be impossible for poll_kernel to get the taskname. poll_kernel() + * is potentially a long-running blocking function; however this method + * handles AMS requests but does not block AMS.*/ + if (enable_stats_log) { + poll_kernel(); + } + stats_remove_taskname(params.pid); +#endif return; } @@ -721,6 +737,9 @@ static void cmd_procpurge() { struct proc *next; if (use_inkernel_interface) { +#ifdef LMKD_LOG_STATS + stats_purge_tasknames(); +#endif return; } @@ -1925,7 +1944,6 @@ err_open_mpfd: #ifdef LMKD_LOG_STATS static int kernel_poll_fd = -1; - static void poll_kernel() { if (kernel_poll_fd == -1) { // not waiting @@ -1958,9 +1976,9 @@ static void poll_kernel() { /* only the death of the group leader process is logged */ if (fields_read == 10 && group_leader_pid == pid) { int64_t process_start_time_ns = starttime * (NS_PER_SEC / sysconf(_SC_CLK_TCK)); - stats_write_lmk_kill_occurred(log_ctx, LMK_KILL_OCCURRED, uid, taskname, oom_score_adj, - min_flt, maj_flt, rss_in_pages * PAGE_SIZE, 0, 0, - process_start_time_ns, min_score_adj); + stats_write_lmk_kill_occurred_pid(log_ctx, LMK_KILL_OCCURRED, uid, pid, oom_score_adj, + min_flt, maj_flt, rss_in_pages * PAGE_SIZE, 0, 0, + process_start_time_ns, min_score_adj); } free(taskname); diff --git a/lmkd/statslog.c b/lmkd/statslog.c index 0c230aeb9..f3a6e55d8 100644 --- a/lmkd/statslog.c +++ b/lmkd/statslog.c @@ -18,8 +18,22 @@ #include #include #include +#include +#include #include +#define LINE_MAX 128 + +struct proc { + int pid; + char taskname[LINE_MAX]; + struct proc* pidhash_next; +}; + +#define PIDHASH_SZ 1024 +static struct proc** pidhash = NULL; +#define pid_hashfn(x) ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1)) + static int64_t getElapsedRealTimeNs() { struct timespec t; t.tv_sec = t.tv_nsec = 0; @@ -57,6 +71,17 @@ stats_write_lmk_state_changed(android_log_context ctx, int32_t code, int32_t sta return write_to_logger(ctx, LOG_ID_STATS); } +static struct proc* pid_lookup(int pid) { + struct proc* procp; + + if (!pidhash) return NULL; + + for (procp = pidhash[pid_hashfn(pid)]; procp && procp->pid != pid; procp = procp->pidhash_next) + ; + + return procp; +} + /** * Logs the event when LMKD kills a process to reduce memory pressure. * Code: LMK_KILL_OCCURRED = 51 @@ -124,3 +149,74 @@ stats_write_lmk_kill_occurred(android_log_context ctx, int32_t code, int32_t uid return write_to_logger(ctx, LOG_ID_STATS); } + +int stats_write_lmk_kill_occurred_pid(android_log_context ctx, int32_t code, int32_t uid, int pid, + int32_t oom_score, int64_t pgfault, int64_t pgmajfault, + int64_t rss_in_bytes, int64_t cache_in_bytes, + int64_t swap_in_bytes, int64_t process_start_time_ns, + int32_t min_oom_score) { + struct proc* proc = pid_lookup(pid); + if (!proc) return -EINVAL; + + return stats_write_lmk_kill_occurred(ctx, code, uid, proc->taskname, oom_score, pgfault, + pgmajfault, rss_in_bytes, cache_in_bytes, swap_in_bytes, + process_start_time_ns, min_oom_score); +} + +static void proc_insert(struct proc* procp) { + if (!pidhash) + pidhash = calloc(PIDHASH_SZ, sizeof(struct proc)); + int hval = pid_hashfn(procp->pid); + procp->pidhash_next = pidhash[hval]; + pidhash[hval] = procp; +} + +void stats_remove_taskname(int pid) { + if (!pidhash) return; + + int hval = pid_hashfn(pid); + struct proc* procp; + struct proc* prevp; + + for (procp = pidhash[hval], prevp = NULL; procp && procp->pid != pid; + procp = procp->pidhash_next) + prevp = procp; + + if (!procp) + return; + + if (!prevp) + pidhash[hval] = procp->pidhash_next; + else + prevp->pidhash_next = procp->pidhash_next; + + free(procp); +} + +void stats_store_taskname(int pid, const char* taskname) { + struct proc* procp = pid_lookup(pid); + if (procp != NULL && strcmp(procp->taskname, taskname) == 0) + return; + procp = malloc(sizeof(struct proc)); + stats_remove_taskname(pid); + procp->pid = pid; + strncpy(procp->taskname, taskname, LINE_MAX - 1); + procp->taskname[LINE_MAX - 1] = '\0'; + proc_insert(procp); +} + +void stats_purge_tasknames() { + if (!pidhash) return; + struct proc* procp; + struct proc* next; + int i; + for (i = 0; i < PIDHASH_SZ; i++) { + procp = pidhash[i]; + while (procp) { + next = procp->pidhash_next; + free(procp); + procp = next; + } + } + memset(pidhash, 0, PIDHASH_SZ * sizeof(struct proc)); +} diff --git a/lmkd/statslog.h b/lmkd/statslog.h index 2edba7a72..50d69f739 100644 --- a/lmkd/statslog.h +++ b/lmkd/statslog.h @@ -80,6 +80,17 @@ struct memory_stat { int stats_write_lmk_state_changed(android_log_context ctx, int32_t code, int32_t state); +/** + * Logs the event when LMKD kills a process to reduce memory pressure. + * Code: LMK_KILL_OCCURRED = 51 + */ +int +stats_write_lmk_kill_occurred_pid(android_log_context ctx, int32_t code, int32_t uid, int pid, + int32_t oom_score, int64_t pgfault, int64_t pgmajfault, + int64_t rss_in_bytes, int64_t cache_in_bytes, + int64_t swap_in_bytes, int64_t process_start_time_ns, + int32_t min_oom_score); + /** * Logs the event when LMKD kills a process to reduce memory pressure. * Code: LMK_KILL_OCCURRED = 51 @@ -91,6 +102,24 @@ stats_write_lmk_kill_occurred(android_log_context ctx, int32_t code, int32_t uid int64_t swap_in_bytes, int64_t process_start_time_ns, int32_t min_oom_score); +/** + * Registers a process taskname by pid, while it is still alive. + */ +void +stats_store_taskname(int pid, const char* taskname); + +/** + * Unregister all process tasknames. + */ +void +stats_purge_tasknames(); + +/** + * Unregister a process taskname, e.g. after it has been killed. + */ +void +stats_remove_taskname(int pid); + __END_DECLS #endif /* _STATSLOG_H_ */ From bf824f8fa50d9f7390057278fefb58e83323a644 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Mon, 7 Oct 2019 17:31:17 -0700 Subject: [PATCH 022/388] FlattenableUtils::align memsets Bug: 141890807 Test: boot, check data is zero'd Change-Id: I45aaeac369f4c5cf3eb44f61c233e00f870a5c79 --- libutils/include/utils/Flattenable.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libutils/include/utils/Flattenable.h b/libutils/include/utils/Flattenable.h index 9d006023d..2c4b8075d 100644 --- a/libutils/include/utils/Flattenable.h +++ b/libutils/include/utils/Flattenable.h @@ -47,7 +47,12 @@ public: template static size_t align(void*& buffer) { - return align( const_cast(buffer) ); + static_assert(!(N & (N - 1)), "Can only align to a power of 2."); + void* b = buffer; + buffer = reinterpret_cast((uintptr_t(buffer) + (N-1)) & ~(N-1)); + size_t delta = size_t(uintptr_t(buffer) - uintptr_t(b)); + memset(b, 0, delta); + return delta; } static void advance(void*& buffer, size_t& size, size_t offset) { From 6baeca576af24b2028d608bdd9a2e717ce95952b Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Mon, 14 Oct 2019 16:18:34 -0700 Subject: [PATCH 023/388] First draft of native StatsEvent API Test: m -j libstatssocket compiles Change-Id: I0da9740d29749d79d14be39e5949b98c58df704d --- libstats/Android.bp | 1 + libstats/stats_event.c | 349 +++++++++++++++++++++++++++++++++++++++++ libstats/stats_event.h | 86 ++++++++++ 3 files changed, 436 insertions(+) create mode 100644 libstats/stats_event.c create mode 100644 libstats/stats_event.h diff --git a/libstats/Android.bp b/libstats/Android.bp index f5ee1dada..c5d05ec16 100644 --- a/libstats/Android.bp +++ b/libstats/Android.bp @@ -22,6 +22,7 @@ cc_library { srcs: [ "stats_event_list.c", "statsd_writer.c", + "stats_event.c", ], host_supported: true, cflags: [ diff --git a/libstats/stats_event.c b/libstats/stats_event.c new file mode 100644 index 000000000..e2f247a1b --- /dev/null +++ b/libstats/stats_event.c @@ -0,0 +1,349 @@ +/* + * 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 "stats_event.h" +#include +#include +#include "include/stats_event_list.h" + +#define byte unsigned char + +#define STATS_EVENT_TAG 1937006964 +#define LOGGER_ENTRY_MAX_PAYLOAD 4068 +// Max payload size is 4 bytes less as 4 bytes are reserved for stats_eventTag. +// See android_util_Stats_Log.cpp +#define MAX_EVENT_PAYLOAD (LOGGER_ENTRY_MAX_PAYLOAD - 4) + +/* POSITIONS */ +#define POS_NUM_ELEMENTS 1 +#define POS_TIMESTAMP (POS_NUM_ELEMENTS + 1) +#define POS_ATOM_ID (POS_TIMESTAMP + sizeof(byte) + sizeof(uint64_t)) +#define POS_FIRST_FIELD (POS_ATOM_ID + sizeof(byte) + sizeof(uint32_t)) + +/* TYPE IDS */ +#define INT32_TYPE 0x00 +#define INT64_TYPE 0x01 +#define STRING_TYPE 0x02 +#define LIST_TYPE 0x03 +#define FLOAT_TYPE 0x04 +#define BOOL_TYPE 0x05 +#define BYTE_ARRAY_TYPE 0x06 +#define OBJECT_TYPE 0x07 +#define KEY_VALUE_PAIR_TYPE 0x08 +#define ATTRIBUTION_CHAIN_TYPE 0x09 +#define ERROR_TYPE 0x0F + +/* LIMITS */ +#define MAX_ANNOTATION_COUNT 15 +#define MAX_ANNOTATION_ID 127 +#define MAX_ATTRIBUTION_NODES 127 +#define MAX_NUM_ELEMENTS 127 + +// The stats_event struct holds the serialized encoding of an event +// within a buf. Also includes other required fields. +struct stats_event { + byte buf[MAX_EVENT_PAYLOAD]; + size_t bufPos; // current write position within the buf + size_t lastFieldPos; // location of last field within the buf + size_t size; // number of valid bytes within buffer + uint32_t numElements; + uint32_t atomId; + uint64_t timestampNs; + uint32_t errors; + uint32_t tag; +}; + +struct stats_event* stats_event_obtain() { + struct stats_event* event = malloc(sizeof(struct stats_event)); + + memset(event->buf, 0, MAX_EVENT_PAYLOAD); + event->buf[0] = OBJECT_TYPE; + + event->bufPos = POS_FIRST_FIELD; + event->lastFieldPos = 0; + event->size = 0; + event->numElements = 0; + event->atomId = 0; + event->timestampNs = 0; + event->errors = 0; + event->tag = STATS_EVENT_TAG; + return event; +} + +void stats_event_release(struct stats_event* event) { + free(event); // free is a no-op if event is NULL +} + +void stats_event_set_timestamp_ns(struct stats_event* event, uint64_t timestampNs) { + if (event) event->timestampNs = timestampNs; +} + +void stats_event_set_atom_id(struct stats_event* event, uint32_t atomId) { + if (event) event->atomId = atomId; +} + +// Side-effect: modifies event->errors if the buffer would overflow +static bool overflows(struct stats_event* event, size_t size) { + if (event->bufPos + size > MAX_EVENT_PAYLOAD) { + event->errors |= ERROR_OVERFLOW; + return true; + } + return false; +} + +static size_t put_byte(struct stats_event* event, byte value) { + if (!overflows(event, sizeof(value))) { + event->buf[event->bufPos] = value; + return sizeof(byte); + } + return 0; +} + +static size_t put_bool(struct stats_event* event, bool value) { + return put_byte(event, (byte)value); +} + +static size_t put_int32(struct stats_event* event, int32_t value) { + if (!overflows(event, sizeof(value))) { + memcpy(&event->buf[event->bufPos], &value, sizeof(int32_t)); + return sizeof(int32_t); + } + return 0; +} + +static size_t put_int64(struct stats_event* event, int64_t value) { + if (!overflows(event, sizeof(value))) { + memcpy(&event->buf[event->bufPos], &value, sizeof(int64_t)); + return sizeof(int64_t); + } + return 0; +} + +static size_t put_float(struct stats_event* event, float value) { + if (!overflows(event, sizeof(value))) { + memcpy(&event->buf[event->bufPos], &value, sizeof(float)); + return sizeof(float); + } + return 0; +} + +static size_t put_byte_array(struct stats_event* event, void* buf, size_t size) { + if (!overflows(event, size)) { + memcpy(&event->buf[event->bufPos], buf, size); + return size; + } + return 0; +} + +void stats_event_write_int32(struct stats_event* event, int32_t value) { + if (!event || event->errors) return; + + event->lastFieldPos = event->bufPos; + event->bufPos += put_byte(event, INT32_TYPE); + event->bufPos += put_int32(event, value); + event->numElements++; +} + +void stats_event_write_int64(struct stats_event* event, int64_t value) { + if (!event || event->errors) return; + + event->lastFieldPos = event->bufPos; + event->bufPos += put_byte(event, INT64_TYPE); + event->bufPos += put_int64(event, value); + event->numElements++; +} + +void stats_event_write_float(struct stats_event* event, float value) { + if (!event || event->errors) return; + + event->lastFieldPos = event->bufPos; + event->bufPos += put_byte(event, FLOAT_TYPE); + event->bufPos += put_float(event, value); + event->numElements++; +} + +void stats_event_write_bool(struct stats_event* event, bool value) { + if (!event || event->errors) return; + + event->lastFieldPos = event->bufPos; + event->bufPos += put_byte(event, BOOL_TYPE); + event->bufPos += put_bool(event, value); + event->numElements++; +} + +// Buf is assumed to be encoded using UTF8 +void stats_event_write_byte_array(struct stats_event* event, uint8_t* buf, uint32_t numBytes) { + if (!event || !buf || event->errors) return; + + event->lastFieldPos = event->bufPos; + event->bufPos += put_byte(event, BYTE_ARRAY_TYPE); + event->bufPos += put_int32(event, numBytes); + event->bufPos += put_byte_array(event, buf, numBytes); + event->numElements++; +} + +// Buf is assumed to be encoded using UTF8 +void stats_event_write_string8(struct stats_event* event, char* buf, uint32_t numBytes) { + if (!event || !buf || event->errors) return; + + event->lastFieldPos = event->bufPos; + event->bufPos += put_byte(event, STRING_TYPE); + event->bufPos += put_int32(event, numBytes); + event->bufPos += put_byte_array(event, buf, numBytes); + event->numElements++; +} + +// Side-effect: modifies event->errors if the attribution chain is too long +static bool is_attribution_chain_too_long(struct stats_event* event, uint32_t numNodes) { + if (numNodes > MAX_ATTRIBUTION_NODES) { + event->errors |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; + return true; + } + return false; +} + +// Tags are assumed to be encoded using UTF8 +void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, char** tags, + uint32_t* tagLengths, uint32_t numNodes) { + if (!event || event->errors) return; + if (is_attribution_chain_too_long(event, numNodes)) return; + + event->lastFieldPos = event->bufPos; + event->bufPos += put_byte(event, ATTRIBUTION_CHAIN_TYPE); + event->bufPos += put_byte(event, (byte)numNodes); + + for (int i = 0; i < numNodes; i++) { + event->bufPos += put_int32(event, uids[i]); + event->bufPos += put_int32(event, tagLengths[i]); + event->bufPos += put_byte_array(event, tags[i], tagLengths[i]); + } + event->numElements++; +} + +// Side-effect: modifies event->errors if annotation does not follow field +static bool does_annotation_follow_field(struct stats_event* event) { + if (event->lastFieldPos == 0) { + event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; + return false; + } + return true; +} + +// Side-effect: modifies event->errors if annotation id is too large +static bool is_valid_annotation_id(struct stats_event* event, uint32_t annotationId) { + if (annotationId > MAX_ANNOTATION_ID) { + event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; + return false; + } + return true; +} + +// Side-effect: modifies event->errors if field has too many annotations +static void increment_annotation_count(struct stats_event* event) { + byte fieldType = event->buf[event->lastFieldPos] & 0x0F; + byte oldAnnotationCount = event->buf[event->lastFieldPos] & 0xF0; + byte newAnnotationCount = oldAnnotationCount + 1; + + if (newAnnotationCount > MAX_ANNOTATION_COUNT) { + event->errors |= ERROR_TOO_MANY_ANNOTATIONS; + return; + } + + event->buf[event->lastFieldPos] = ((newAnnotationCount << 4) & 0xF0) | fieldType; +} + +void stats_event_add_bool_annotation(struct stats_event* event, uint32_t annotationId, bool value) { + if (!event || event->errors) return; + if (!does_annotation_follow_field(event)) return; + if (!is_valid_annotation_id(event, annotationId)) return; + + event->bufPos += put_byte(event, (byte)annotationId); + event->bufPos += put_byte(event, BOOL_TYPE); + event->bufPos += put_bool(event, value); + increment_annotation_count(event); +} + +void stats_event_add_int32_annotation(struct stats_event* event, uint32_t annotationId, + int32_t value) { + if (!event || event->errors) return; + if (!does_annotation_follow_field(event)) return; + if (!is_valid_annotation_id(event, annotationId)) return; + + event->bufPos += put_byte(event, (byte)annotationId); + event->bufPos += put_byte(event, INT32_TYPE); + event->bufPos += put_int32(event, value); + increment_annotation_count(event); +} + +uint32_t stats_event_get_errors(struct stats_event* event) { + return event->errors; +} + +static void build(struct stats_event* event) { + // store size before we modify bufPos + event->size = event->bufPos; + + if (event->numElements > MAX_NUM_ELEMENTS) { + event->errors |= ERROR_TOO_MANY_FIELDS; + } else { + event->bufPos = POS_NUM_ELEMENTS; + put_byte(event, (byte)event->numElements); + } + + if (event->timestampNs == 0) { + event->errors |= ERROR_NO_TIMESTAMP; + } else { + // Don't use the write functions since they short-circuit if there was + // an error previously. We, regardless, want to know the timestamp and + // atomId. + event->bufPos = POS_TIMESTAMP; + event->bufPos += put_byte(event, INT64_TYPE); + event->bufPos += put_int64(event, event->timestampNs); + } + + if (event->atomId == 0) { + event->errors |= ERROR_NO_ATOM_ID; + } else { + event->bufPos = POS_ATOM_ID; + event->bufPos += put_byte(event, INT32_TYPE); + event->bufPos += put_int64(event, event->atomId); + } + + // If there are errors, rewrite buffer + if (event->errors) { + event->bufPos = POS_NUM_ELEMENTS; + put_byte(event, (byte)3); + + event->bufPos = POS_FIRST_FIELD; + event->bufPos += put_byte(event, ERROR_TYPE); + event->bufPos += put_int32(event, event->errors); + event->size = event->bufPos; + } +} + +void stats_event_write(struct stats_event* event) { + if (!event) return; + + build(event); + + // prepare iovecs for write to statsd + struct iovec vecs[2]; + vecs[0].iov_base = &event->tag; + vecs[0].iov_len = sizeof(event->tag); + vecs[1].iov_base = &event->buf; + vecs[1].iov_len = event->size; + write_to_statsd(vecs, 2); +} diff --git a/libstats/stats_event.h b/libstats/stats_event.h new file mode 100644 index 000000000..16a04f8f8 --- /dev/null +++ b/libstats/stats_event.h @@ -0,0 +1,86 @@ +/* + * 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. + */ + +#ifndef ANDROID_STATS_LOG_STATS_EVENT_H +#define ANDROID_STATS_LOG_STATS_EVENT_H + +#include +#include +#include + +/* + * Functionality to build and store the buffer sent over the statsd socket. + * This code defines and encapsulates the socket protocol. + * + * Usage: + * struct stats_event* event = stats_event_obtain(); + * + * stats_event_set_timestamp_ns(event, timestampNs); + * stats_event_set_atom_id(event, atomId); + * stats_event_write_int32(event, 24); + * stats_event_add_bool_annotation(event, 1, true); // annotations apply to the previous field + * stats_event_add_int32_annotation(event, 2, 128); + * stats_event_write_float(event, 2.0); + * + * stats_event_write(event); + * stats_event_release(event); + * + * Notes: + * (a) write_() and add__annotation() should be called in the order that fields + * and annotations are defined in the atom. + * (b) set_timestamp_ns() and set_atom_id() can be called anytime before stats_event_write(). + * (c) add__annotation() calls apply to the previous field. + * (d) If errors occur, stats_event_write() will write a bitmask of the errors to the socket. + * (e) Strings should be encoded using UTF8 and written using stats_event_write_string8(). + */ + +struct stats_event; + +/* ERRORS */ +#define ERROR_NO_TIMESTAMP 0x1 +#define ERROR_NO_ATOM_ID 0x2 +#define ERROR_OVERFLOW 0x4 +#define ERROR_ATTRIBUTION_CHAIN_TOO_LONG 0x8 +#define ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD 0x10 +#define ERROR_INVALID_ANNOTATION_ID 0x20 +#define ERROR_ANNOTATION_ID_TOO_LARGE 0x40 +#define ERROR_TOO_MANY_ANNOTATIONS 0x80 +#define ERROR_TOO_MANY_FIELDS 0x100 + +/* System API */ +struct stats_event* stats_event_obtain(); +void stats_event_write(struct stats_event* event); +void stats_event_release(struct stats_event* event); + +void stats_event_set_atom_id(struct stats_event* event, const uint32_t atomId); +void stats_event_set_timestamp_ns(struct stats_event* event, const uint64_t timestampNs); + +void stats_event_write_int32(struct stats_event* event, int32_t value); +void stats_event_write_int64(struct stats_event* event, int64_t value); +void stats_event_write_float(struct stats_event* event, float value); +void stats_event_write_bool(struct stats_event* event, bool value); +void stats_event_write_byte_array(struct stats_event* event, uint8_t* buf, uint32_t numBytes); +void stats_event_write_string8(struct stats_event* event, char* buf, uint32_t numBytes); +void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, char** tags, + uint32_t* tagLengths, uint32_t numNodes); + +void stats_event_add_bool_annotation(struct stats_event* event, uint32_t annotationId, bool value); +void stats_event_add_int32_annotation(struct stats_event* event, uint32_t annotationId, + int32_t value); + +uint32_t stats_event_get_errors(struct stats_event* event); + +#endif // ANDROID_STATS_LOG_STATS_EVENT_H From 5f8162b0862cc04fc9d88305c44fde40ae3ea31c Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Fri, 18 Oct 2019 08:31:01 -0700 Subject: [PATCH 024/388] liblog: remove mistakenly added symbols from vndk These functions and headers were all mistakenly added to the vndk. They should not be used by vendors. Test: these symbols do not appear in vendor libraries Change-Id: I03919b437c2d9f0e573b7a6b40249ed12fe874b9 --- libcutils/trace-dev.inc | 1 - liblog/include_vndk/log/log.h | 18 +++++++++--- liblog/include_vndk/log/log_event_list.h | 15 +--------- liblog/include_vndk/log/log_id.h | 35 +++++++++++++++++++++++- liblog/include_vndk/log/log_properties.h | 1 - liblog/include_vndk/log/log_read.h | 1 - liblog/include_vndk/log/log_time.h | 10 +------ liblog/liblog.map.txt | 30 +++++++------------- 8 files changed, 60 insertions(+), 51 deletions(-) mode change 120000 => 100644 liblog/include_vndk/log/log_id.h delete mode 120000 liblog/include_vndk/log/log_properties.h delete mode 120000 liblog/include_vndk/log/log_read.h diff --git a/libcutils/trace-dev.inc b/libcutils/trace-dev.inc index e3da77bec..fc7a870f7 100644 --- a/libcutils/trace-dev.inc +++ b/libcutils/trace-dev.inc @@ -32,7 +32,6 @@ #include #include #include -#include /** * Maximum size of a message that can be logged to the trace buffer. diff --git a/liblog/include_vndk/log/log.h b/liblog/include_vndk/log/log.h index a79beecd4..393b48060 100644 --- a/liblog/include_vndk/log/log.h +++ b/liblog/include_vndk/log/log.h @@ -1,13 +1,11 @@ /*Special log.h file for VNDK linking modules*/ -#ifndef _LIBS_LOG_LOG_H -#define _LIBS_LOG_LOG_H +#pragma once #include #include #include #include -#include #include #include #include @@ -22,4 +20,16 @@ #define LOG_TAG NULL #endif -#endif /*_LIBS_LOG_LOG_H*/ +// Legacy dependencies... +/* deal with possible sys/cdefs.h conflict with fcntl.h */ +#ifdef __unused +#define __unused_defined __unused +#undef __unused +#endif + +#include /* Pick up O_* macros */ + +/* restore definitions from above */ +#ifdef __unused_defined +#define __unused __attribute__((__unused__)) +#endif diff --git a/liblog/include_vndk/log/log_event_list.h b/liblog/include_vndk/log/log_event_list.h index 1f3dd377b..81c879f54 100644 --- a/liblog/include_vndk/log/log_event_list.h +++ b/liblog/include_vndk/log/log_event_list.h @@ -16,8 +16,7 @@ /* Special log_event_list.h file for VNDK linking modules */ -#ifndef _LIBS_LOG_EVENT_LIST_H -#define _LIBS_LOG_EVENT_LIST_H +#pragma once #include @@ -30,10 +29,7 @@ extern "C" { /* * The opaque context used to manipulate lists of events. */ -#ifndef __android_log_context_defined -#define __android_log_context_defined typedef struct android_log_context_internal* android_log_context; -#endif /* * Creates a context associated with an event tag to write elements to @@ -61,18 +57,9 @@ int android_log_write_float32(android_log_context ctx, float value); /* NB: LOG_ID_EVENTS and LOG_ID_SECURITY only valid binary buffers */ int android_log_write_list(android_log_context ctx, log_id_t id); -/* Reset writer context */ -int android_log_reset(android_log_context ctx); - -/* Reset reader context */ -int android_log_parser_reset(android_log_context ctx, - const char* msg, size_t len); - /* Finished with reader or writer context */ int android_log_destroy(android_log_context* ctx); #ifdef __cplusplus } #endif - -#endif /* _LIBS_LOG_EVENT_LIST_H */ diff --git a/liblog/include_vndk/log/log_id.h b/liblog/include_vndk/log/log_id.h deleted file mode 120000 index dce92b991..000000000 --- a/liblog/include_vndk/log/log_id.h +++ /dev/null @@ -1 +0,0 @@ -../../include/log/log_id.h \ No newline at end of file diff --git a/liblog/include_vndk/log/log_id.h b/liblog/include_vndk/log/log_id.h new file mode 100644 index 000000000..3c6df8b72 --- /dev/null +++ b/liblog/include_vndk/log/log_id.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2005-2017 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 + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Send a simple string to the log. + */ +int __android_log_buf_write(int bufID, int prio, const char* tag, const char* text); +int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fmt, ...) + __attribute__((__format__(printf, 4, 5))); + +#ifdef __cplusplus +} +#endif diff --git a/liblog/include_vndk/log/log_properties.h b/liblog/include_vndk/log/log_properties.h deleted file mode 120000 index bbec42614..000000000 --- a/liblog/include_vndk/log/log_properties.h +++ /dev/null @@ -1 +0,0 @@ -../../include/log/log_properties.h \ No newline at end of file diff --git a/liblog/include_vndk/log/log_read.h b/liblog/include_vndk/log/log_read.h deleted file mode 120000 index 01de8b9ec..000000000 --- a/liblog/include_vndk/log/log_read.h +++ /dev/null @@ -1 +0,0 @@ -../../include/log/log_read.h \ No newline at end of file diff --git a/liblog/include_vndk/log/log_time.h b/liblog/include_vndk/log/log_time.h index 5a09959a7..014af0897 100644 --- a/liblog/include_vndk/log/log_time.h +++ b/liblog/include_vndk/log/log_time.h @@ -14,8 +14,7 @@ * limitations under the License. */ -#ifndef _LIBS_LOG_LOG_TIME_H -#define _LIBS_LOG_LOG_TIME_H +#pragma once #include @@ -30,9 +29,6 @@ #define MS_PER_SEC 1000ULL #endif -#ifndef __struct_log_time_defined -#define __struct_log_time_defined - #define LOG_TIME_SEC(t) ((t)->tv_sec) /* next power of two after NS_PER_SEC */ #define LOG_TIME_NSEC(t) ((t)->tv_nsec & (UINT32_MAX >> 2)) @@ -41,7 +37,3 @@ typedef struct log_time { uint32_t tv_sec; uint32_t tv_nsec; } __attribute__((__packed__)) log_time; - -#endif - -#endif /* _LIBS_LOG_LOG_TIME_H */ diff --git a/liblog/liblog.map.txt b/liblog/liblog.map.txt index ce4c53c82..ece8b7563 100644 --- a/liblog/liblog.map.txt +++ b/liblog/liblog.map.txt @@ -1,7 +1,5 @@ LIBLOG { global: - android_name_to_log_id; # vndk - android_log_id_to_name; # vndk __android_log_assert; __android_log_buf_print; __android_log_buf_write; @@ -14,25 +12,15 @@ LIBLOG { LIBLOG_L { global: - android_logger_clear; # vndk - android_logger_get_id; # vndk - android_logger_get_log_readable_size; # vndk - android_logger_get_log_version; # vndk - android_logger_get_log_size; # vndk - android_logger_list_alloc; # apex vndk - android_logger_list_alloc_time; # apex vndk - android_logger_list_free; # apex vndk - android_logger_list_open; # vndk - android_logger_list_read; # apex vndk - android_logger_open; # apex vndk - android_logger_set_log_size; # vndk + android_logger_list_alloc; # apex + android_logger_list_alloc_time; # apex + android_logger_list_free; # apex + android_logger_list_read; # apex + android_logger_open; # apex }; LIBLOG_M { global: - android_logger_get_prune_list; # vndk - android_logger_set_prune_list; # vndk - android_logger_get_statistics; # vndk __android_log_error_write; # apex vndk __android_log_is_loggable; create_android_logger; # apex vndk @@ -51,7 +39,6 @@ LIBLOG_M { LIBLOG_O { global: __android_log_is_loggable_len; - __android_log_is_debuggable; # vndk }; LIBLOG_Q { @@ -61,21 +48,24 @@ LIBLOG_Q { __android_log_bwrite; # apex __android_log_close; # apex __android_log_security; # apex - android_log_reset; #vndk - android_log_parser_reset; #vndk }; LIBLOG_PRIVATE { global: + __android_log_is_debuggable; __android_log_pmsg_file_read; __android_log_pmsg_file_write; __android_log_security_bswrite; __android_logger_get_buffer_size; __android_logger_property_get_bool; + android_name_to_log_id; android_openEventTagMap; + android_logger_list_open; + android_log_id_to_name; android_log_processBinaryLogBuffer; android_log_processLogBuffer; android_log_read_next; + android_log_reset; android_log_write_list_buffer; android_lookupEventTagNum; create_android_log_parser; From 5d4e5478baa20fc70dba33053cf1928e6f4fdc5c Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Wed, 23 Oct 2019 16:25:55 +0000 Subject: [PATCH 025/388] Revert "liblog: remove mistakenly added symbols from vndk" This reverts commit 5f8162b0862cc04fc9d88305c44fde40ae3ea31c. Reason for revert: Turns out they're being used. Change-Id: Iad9010190c7a4140b69dc553df5debdd88dcf81a --- libcutils/trace-dev.inc | 1 + liblog/include_vndk/log/log.h | 18 +++--------- liblog/include_vndk/log/log_event_list.h | 15 +++++++++- liblog/include_vndk/log/log_id.h | 35 +----------------------- liblog/include_vndk/log/log_properties.h | 1 + liblog/include_vndk/log/log_read.h | 1 + liblog/include_vndk/log/log_time.h | 10 ++++++- liblog/liblog.map.txt | 30 +++++++++++++------- 8 files changed, 51 insertions(+), 60 deletions(-) mode change 100644 => 120000 liblog/include_vndk/log/log_id.h create mode 120000 liblog/include_vndk/log/log_properties.h create mode 120000 liblog/include_vndk/log/log_read.h diff --git a/libcutils/trace-dev.inc b/libcutils/trace-dev.inc index fc7a870f7..e3da77bec 100644 --- a/libcutils/trace-dev.inc +++ b/libcutils/trace-dev.inc @@ -32,6 +32,7 @@ #include #include #include +#include /** * Maximum size of a message that can be logged to the trace buffer. diff --git a/liblog/include_vndk/log/log.h b/liblog/include_vndk/log/log.h index 393b48060..a79beecd4 100644 --- a/liblog/include_vndk/log/log.h +++ b/liblog/include_vndk/log/log.h @@ -1,11 +1,13 @@ /*Special log.h file for VNDK linking modules*/ -#pragma once +#ifndef _LIBS_LOG_LOG_H +#define _LIBS_LOG_LOG_H #include #include #include #include +#include #include #include #include @@ -20,16 +22,4 @@ #define LOG_TAG NULL #endif -// Legacy dependencies... -/* deal with possible sys/cdefs.h conflict with fcntl.h */ -#ifdef __unused -#define __unused_defined __unused -#undef __unused -#endif - -#include /* Pick up O_* macros */ - -/* restore definitions from above */ -#ifdef __unused_defined -#define __unused __attribute__((__unused__)) -#endif +#endif /*_LIBS_LOG_LOG_H*/ diff --git a/liblog/include_vndk/log/log_event_list.h b/liblog/include_vndk/log/log_event_list.h index 81c879f54..1f3dd377b 100644 --- a/liblog/include_vndk/log/log_event_list.h +++ b/liblog/include_vndk/log/log_event_list.h @@ -16,7 +16,8 @@ /* Special log_event_list.h file for VNDK linking modules */ -#pragma once +#ifndef _LIBS_LOG_EVENT_LIST_H +#define _LIBS_LOG_EVENT_LIST_H #include @@ -29,7 +30,10 @@ extern "C" { /* * The opaque context used to manipulate lists of events. */ +#ifndef __android_log_context_defined +#define __android_log_context_defined typedef struct android_log_context_internal* android_log_context; +#endif /* * Creates a context associated with an event tag to write elements to @@ -57,9 +61,18 @@ int android_log_write_float32(android_log_context ctx, float value); /* NB: LOG_ID_EVENTS and LOG_ID_SECURITY only valid binary buffers */ int android_log_write_list(android_log_context ctx, log_id_t id); +/* Reset writer context */ +int android_log_reset(android_log_context ctx); + +/* Reset reader context */ +int android_log_parser_reset(android_log_context ctx, + const char* msg, size_t len); + /* Finished with reader or writer context */ int android_log_destroy(android_log_context* ctx); #ifdef __cplusplus } #endif + +#endif /* _LIBS_LOG_EVENT_LIST_H */ diff --git a/liblog/include_vndk/log/log_id.h b/liblog/include_vndk/log/log_id.h deleted file mode 100644 index 3c6df8b72..000000000 --- a/liblog/include_vndk/log/log_id.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2005-2017 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 - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Send a simple string to the log. - */ -int __android_log_buf_write(int bufID, int prio, const char* tag, const char* text); -int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fmt, ...) - __attribute__((__format__(printf, 4, 5))); - -#ifdef __cplusplus -} -#endif diff --git a/liblog/include_vndk/log/log_id.h b/liblog/include_vndk/log/log_id.h new file mode 120000 index 000000000..dce92b991 --- /dev/null +++ b/liblog/include_vndk/log/log_id.h @@ -0,0 +1 @@ +../../include/log/log_id.h \ No newline at end of file diff --git a/liblog/include_vndk/log/log_properties.h b/liblog/include_vndk/log/log_properties.h new file mode 120000 index 000000000..bbec42614 --- /dev/null +++ b/liblog/include_vndk/log/log_properties.h @@ -0,0 +1 @@ +../../include/log/log_properties.h \ No newline at end of file diff --git a/liblog/include_vndk/log/log_read.h b/liblog/include_vndk/log/log_read.h new file mode 120000 index 000000000..01de8b9ec --- /dev/null +++ b/liblog/include_vndk/log/log_read.h @@ -0,0 +1 @@ +../../include/log/log_read.h \ No newline at end of file diff --git a/liblog/include_vndk/log/log_time.h b/liblog/include_vndk/log/log_time.h index 014af0897..5a09959a7 100644 --- a/liblog/include_vndk/log/log_time.h +++ b/liblog/include_vndk/log/log_time.h @@ -14,7 +14,8 @@ * limitations under the License. */ -#pragma once +#ifndef _LIBS_LOG_LOG_TIME_H +#define _LIBS_LOG_LOG_TIME_H #include @@ -29,6 +30,9 @@ #define MS_PER_SEC 1000ULL #endif +#ifndef __struct_log_time_defined +#define __struct_log_time_defined + #define LOG_TIME_SEC(t) ((t)->tv_sec) /* next power of two after NS_PER_SEC */ #define LOG_TIME_NSEC(t) ((t)->tv_nsec & (UINT32_MAX >> 2)) @@ -37,3 +41,7 @@ typedef struct log_time { uint32_t tv_sec; uint32_t tv_nsec; } __attribute__((__packed__)) log_time; + +#endif + +#endif /* _LIBS_LOG_LOG_TIME_H */ diff --git a/liblog/liblog.map.txt b/liblog/liblog.map.txt index ece8b7563..ce4c53c82 100644 --- a/liblog/liblog.map.txt +++ b/liblog/liblog.map.txt @@ -1,5 +1,7 @@ LIBLOG { global: + android_name_to_log_id; # vndk + android_log_id_to_name; # vndk __android_log_assert; __android_log_buf_print; __android_log_buf_write; @@ -12,15 +14,25 @@ LIBLOG { LIBLOG_L { global: - android_logger_list_alloc; # apex - android_logger_list_alloc_time; # apex - android_logger_list_free; # apex - android_logger_list_read; # apex - android_logger_open; # apex + android_logger_clear; # vndk + android_logger_get_id; # vndk + android_logger_get_log_readable_size; # vndk + android_logger_get_log_version; # vndk + android_logger_get_log_size; # vndk + android_logger_list_alloc; # apex vndk + android_logger_list_alloc_time; # apex vndk + android_logger_list_free; # apex vndk + android_logger_list_open; # vndk + android_logger_list_read; # apex vndk + android_logger_open; # apex vndk + android_logger_set_log_size; # vndk }; LIBLOG_M { global: + android_logger_get_prune_list; # vndk + android_logger_set_prune_list; # vndk + android_logger_get_statistics; # vndk __android_log_error_write; # apex vndk __android_log_is_loggable; create_android_logger; # apex vndk @@ -39,6 +51,7 @@ LIBLOG_M { LIBLOG_O { global: __android_log_is_loggable_len; + __android_log_is_debuggable; # vndk }; LIBLOG_Q { @@ -48,24 +61,21 @@ LIBLOG_Q { __android_log_bwrite; # apex __android_log_close; # apex __android_log_security; # apex + android_log_reset; #vndk + android_log_parser_reset; #vndk }; LIBLOG_PRIVATE { global: - __android_log_is_debuggable; __android_log_pmsg_file_read; __android_log_pmsg_file_write; __android_log_security_bswrite; __android_logger_get_buffer_size; __android_logger_property_get_bool; - android_name_to_log_id; android_openEventTagMap; - android_logger_list_open; - android_log_id_to_name; android_log_processBinaryLogBuffer; android_log_processLogBuffer; android_log_read_next; - android_log_reset; android_log_write_list_buffer; android_lookupEventTagNum; create_android_log_parser; From 12e96152ca3f0e091433d399eafe0ad6c646351a Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Tue, 15 Oct 2019 14:41:18 -0700 Subject: [PATCH 026/388] fs_mgr: remove configurable zram backing file path Bug: 142795879 Test: zram_loopback_path never change file location. Test: Setting zram_backingdev_size on fstab turns on zram writeback. Change-Id: If244e690405eb925270f767a22e4db95cbd8ba8a Signed-off-by: Minchan Kim --- fs_mgr/fs_mgr.cpp | 21 +++++++--------- fs_mgr/fs_mgr_fstab.cpp | 11 +++----- fs_mgr/include_fstab/fstab/fstab.h | 4 +-- fs_mgr/tests/fs_mgr_test.cpp | 40 ++++++++++-------------------- 4 files changed, 26 insertions(+), 50 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 4ba1c49cc..8a41a8b74 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -1493,12 +1493,10 @@ static bool InstallZramDevice(const std::string& device) { return true; } -static bool PrepareZramDevice(const std::string& loop, off64_t size, const std::string& bdev) { - if (loop.empty() && bdev.empty()) return true; +static bool PrepareZramBackingDevice(off64_t size) { - if (bdev.length()) { - return InstallZramDevice(bdev); - } + constexpr const char* file_path = "/data/per_boot/zram_swap"; + if (size == 0) return true; // Get free loopback unique_fd loop_fd(TEMP_FAILURE_RETRY(open("/dev/loop-control", O_RDWR | O_CLOEXEC))); @@ -1514,13 +1512,13 @@ static bool PrepareZramDevice(const std::string& loop, off64_t size, const std:: } // Prepare target path - unique_fd target_fd(TEMP_FAILURE_RETRY(open(loop.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600))); + unique_fd target_fd(TEMP_FAILURE_RETRY(open(file_path, O_RDWR | O_CREAT | O_CLOEXEC, 0600))); if (target_fd.get() == -1) { - PERROR << "Cannot open target path: " << loop; + PERROR << "Cannot open target path: " << file_path; return false; } if (fallocate(target_fd.get(), 0, 0, size) < 0) { - PERROR << "Cannot truncate target path: " << loop; + PERROR << "Cannot truncate target path: " << file_path; return false; } @@ -1556,11 +1554,10 @@ bool fs_mgr_swapon_all(const Fstab& fstab) { continue; } - if (!PrepareZramDevice(entry.zram_loopback_path, entry.zram_loopback_size, entry.zram_backing_dev_path)) { - LERROR << "Skipping losetup for '" << entry.blk_device << "'"; - } - if (entry.zram_size > 0) { + if (!PrepareZramBackingDevice(entry.zram_backingdev_size)) { + LERROR << "Failure of zram backing device file for '" << entry.blk_device << "'"; + } // A zram_size was specified, so we need to configure the // device. There is no point in having multiple zram devices // on a system (all the memory comes from the same pool) so diff --git a/fs_mgr/fs_mgr_fstab.cpp b/fs_mgr/fs_mgr_fstab.cpp index 2ff5243e1..19afcdf41 100644 --- a/fs_mgr/fs_mgr_fstab.cpp +++ b/fs_mgr/fs_mgr_fstab.cpp @@ -343,15 +343,10 @@ void ParseFsMgrFlags(const std::string& flags, FstabEntry* entry) { } else if (StartsWith(flag, "sysfs_path=")) { // The path to trigger device gc by idle-maint of vold. entry->sysfs_path = arg; - } else if (StartsWith(flag, "zram_loopback_path=")) { - // The path to use loopback for zram. - entry->zram_loopback_path = arg; - } else if (StartsWith(flag, "zram_loopback_size=")) { - if (!ParseByteCount(arg, &entry->zram_loopback_size)) { - LWARNING << "Warning: zram_loopback_size= flag malformed: " << arg; + } else if (StartsWith(flag, "zram_backingdev_size=")) { + if (!ParseByteCount(arg, &entry->zram_backingdev_size)) { + LWARNING << "Warning: zram_backingdev_size= flag malformed: " << arg; } - } else if (StartsWith(flag, "zram_backing_dev_path=")) { - entry->zram_backing_dev_path = arg; } else { LWARNING << "Warning: unknown flag: " << flag; } diff --git a/fs_mgr/include_fstab/fstab/fstab.h b/fs_mgr/include_fstab/fstab/fstab.h index 3c517dc44..953aa6b34 100644 --- a/fs_mgr/include_fstab/fstab/fstab.h +++ b/fs_mgr/include_fstab/fstab/fstab.h @@ -52,9 +52,7 @@ struct FstabEntry { off64_t logical_blk_size = 0; std::string sysfs_path; std::string vbmeta_partition; - std::string zram_loopback_path; - uint64_t zram_loopback_size = 512 * 1024 * 1024; // 512MB by default; - std::string zram_backing_dev_path; + uint64_t zram_backingdev_size = 0; std::string avb_keys; struct FsMgrFlags { diff --git a/fs_mgr/tests/fs_mgr_test.cpp b/fs_mgr/tests/fs_mgr_test.cpp index a7ea81793..544976fc2 100644 --- a/fs_mgr/tests/fs_mgr_test.cpp +++ b/fs_mgr/tests/fs_mgr_test.cpp @@ -392,9 +392,9 @@ TEST(fs_mgr, ReadFstabFromFile_FsMgrOptions_AllBad) { TemporaryFile tf; ASSERT_TRUE(tf.fd != -1); std::string fstab_contents = R"fs( -source none0 swap defaults encryptable,forceencrypt,fileencryption,forcefdeorfbe,keydirectory,length,swapprio,zramsize,max_comp_streams,reservedsize,eraseblk,logicalblk,sysfs_path,zram_loopback_path,zram_loopback_size,zram_backing_dev_path +source none0 swap defaults encryptable,forceencrypt,fileencryption,forcefdeorfbe,keydirectory,length,swapprio,zramsize,max_comp_streams,reservedsize,eraseblk,logicalblk,sysfs_path,zram_backingdev_size -source none1 swap defaults encryptable=,forceencrypt=,fileencryption=,keydirectory=,length=,swapprio=,zramsize=,max_comp_streams=,avb=,reservedsize=,eraseblk=,logicalblk=,sysfs_path=,zram_loopback_path=,zram_loopback_size=,zram_backing_dev_path= +source none1 swap defaults encryptable=,forceencrypt=,fileencryption=,keydirectory=,length=,swapprio=,zramsize=,max_comp_streams=,avb=,reservedsize=,eraseblk=,logicalblk=,sysfs_path=,zram_backingdev_size= source none2 swap defaults forcefdeorfbe= @@ -425,9 +425,7 @@ source none2 swap defaults forcefdeorfbe= EXPECT_EQ(0, entry->erase_blk_size); EXPECT_EQ(0, entry->logical_blk_size); EXPECT_EQ("", entry->sysfs_path); - EXPECT_EQ("", entry->zram_loopback_path); - EXPECT_EQ(512U * 1024U * 1024U, entry->zram_loopback_size); - EXPECT_EQ("", entry->zram_backing_dev_path); + EXPECT_EQ(0U, entry->zram_backingdev_size); entry++; EXPECT_EQ("none1", entry->mount_point); @@ -453,9 +451,7 @@ source none2 swap defaults forcefdeorfbe= EXPECT_EQ(0, entry->erase_blk_size); EXPECT_EQ(0, entry->logical_blk_size); EXPECT_EQ("", entry->sysfs_path); - EXPECT_EQ("", entry->zram_loopback_path); - EXPECT_EQ(512U * 1024U * 1024U, entry->zram_loopback_size); - EXPECT_EQ("", entry->zram_backing_dev_path); + EXPECT_EQ(0U, entry->zram_backingdev_size); entry++; // forcefdeorfbe sets file_contents_mode and file_names_mode by default, so test it separately. @@ -1040,14 +1036,10 @@ TEST(fs_mgr, ReadFstabFromFile_FsMgrOptions_Zram) { TemporaryFile tf; ASSERT_TRUE(tf.fd != -1); std::string fstab_contents = R"fs( -source none0 swap defaults zram_loopback_path=/dev/path - -source none1 swap defaults zram_loopback_size=blah -source none2 swap defaults zram_loopback_size=2 -source none3 swap defaults zram_loopback_size=1K -source none4 swap defaults zram_loopback_size=2m - -source none5 swap defaults zram_backing_dev_path=/dev/path2 +source none1 swap defaults zram_backingdev_size=blah +source none2 swap defaults zram_backingdev_size=2 +source none3 swap defaults zram_backingdev_size=1K +source none4 swap defaults zram_backingdev_size=2m )fs"; @@ -1055,29 +1047,23 @@ source none5 swap defaults zram_backing_dev_path=/dev/path2 Fstab fstab; EXPECT_TRUE(ReadFstabFromFile(tf.path, &fstab)); - ASSERT_EQ(6U, fstab.size()); + ASSERT_EQ(4U, fstab.size()); auto entry = fstab.begin(); - EXPECT_EQ("none0", entry->mount_point); - EXPECT_EQ("/dev/path", entry->zram_loopback_path); - entry++; EXPECT_EQ("none1", entry->mount_point); - EXPECT_EQ(512U * 1024U * 1024U, entry->zram_loopback_size); + EXPECT_EQ(0U, entry->zram_backingdev_size); entry++; EXPECT_EQ("none2", entry->mount_point); - EXPECT_EQ(2U, entry->zram_loopback_size); + EXPECT_EQ(2U, entry->zram_backingdev_size); entry++; EXPECT_EQ("none3", entry->mount_point); - EXPECT_EQ(1024U, entry->zram_loopback_size); + EXPECT_EQ(1024U, entry->zram_backingdev_size); entry++; EXPECT_EQ("none4", entry->mount_point); - EXPECT_EQ(2U * 1024U * 1024U, entry->zram_loopback_size); + EXPECT_EQ(2U * 1024U * 1024U, entry->zram_backingdev_size); entry++; - - EXPECT_EQ("none5", entry->mount_point); - EXPECT_EQ("/dev/path2", entry->zram_backing_dev_path); } From 6c7cbc430e29c731cbc35d2b26a13b419ebcacba Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Tue, 22 Oct 2019 10:56:58 -0700 Subject: [PATCH 027/388] Set default timestamp to elapsedRealtimeNanos Test: m -j libstatssocket compiles Change-Id: I62f4c6bb14c3914124a6af25ff46fb0a980204e7 --- libstats/Android.bp | 2 +- libstats/stats_event.c | 11 ++++++++++- libstats/stats_event.h | 9 +++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/libstats/Android.bp b/libstats/Android.bp index c5d05ec16..0440087b2 100644 --- a/libstats/Android.bp +++ b/libstats/Android.bp @@ -22,7 +22,7 @@ cc_library { srcs: [ "stats_event_list.c", "statsd_writer.c", - "stats_event.c", + "stats_event.c", ], host_supported: true, cflags: [ diff --git a/libstats/stats_event.c b/libstats/stats_event.c index e2f247a1b..5bccd9bb4 100644 --- a/libstats/stats_event.c +++ b/libstats/stats_event.c @@ -17,6 +17,7 @@ #include "stats_event.h" #include #include +#include #include "include/stats_event_list.h" #define byte unsigned char @@ -66,6 +67,13 @@ struct stats_event { uint32_t tag; }; +static int64_t get_elapsed_realtime_ns() { + struct timespec t; + t.tv_sec = t.tv_nsec = 0; + clock_gettime(CLOCK_BOOTTIME, &t); + return (int64_t)t.tv_sec * 1000000000LL + t.tv_nsec; +} + struct stats_event* stats_event_obtain() { struct stats_event* event = malloc(sizeof(struct stats_event)); @@ -77,7 +85,7 @@ struct stats_event* stats_event_obtain() { event->size = 0; event->numElements = 0; event->atomId = 0; - event->timestampNs = 0; + event->timestampNs = get_elapsed_realtime_ns(); event->errors = 0; event->tag = STATS_EVENT_TAG; return event; @@ -87,6 +95,7 @@ void stats_event_release(struct stats_event* event) { free(event); // free is a no-op if event is NULL } +// Should only be used for testing void stats_event_set_timestamp_ns(struct stats_event* event, uint64_t timestampNs) { if (event) event->timestampNs = timestampNs; } diff --git a/libstats/stats_event.h b/libstats/stats_event.h index 16a04f8f8..ee886280c 100644 --- a/libstats/stats_event.h +++ b/libstats/stats_event.h @@ -28,7 +28,6 @@ * Usage: * struct stats_event* event = stats_event_obtain(); * - * stats_event_set_timestamp_ns(event, timestampNs); * stats_event_set_atom_id(event, atomId); * stats_event_write_int32(event, 24); * stats_event_add_bool_annotation(event, 1, true); // annotations apply to the previous field @@ -41,7 +40,7 @@ * Notes: * (a) write_() and add__annotation() should be called in the order that fields * and annotations are defined in the atom. - * (b) set_timestamp_ns() and set_atom_id() can be called anytime before stats_event_write(). + * (b) set_atom_id() can be called anytime before stats_event_write(). * (c) add__annotation() calls apply to the previous field. * (d) If errors occur, stats_event_write() will write a bitmask of the errors to the socket. * (e) Strings should be encoded using UTF8 and written using stats_event_write_string8(). @@ -60,13 +59,12 @@ struct stats_event; #define ERROR_TOO_MANY_ANNOTATIONS 0x80 #define ERROR_TOO_MANY_FIELDS 0x100 -/* System API */ +/* SYSTEM API */ struct stats_event* stats_event_obtain(); void stats_event_write(struct stats_event* event); void stats_event_release(struct stats_event* event); void stats_event_set_atom_id(struct stats_event* event, const uint32_t atomId); -void stats_event_set_timestamp_ns(struct stats_event* event, const uint64_t timestampNs); void stats_event_write_int32(struct stats_event* event, int32_t value); void stats_event_write_int64(struct stats_event* event, int64_t value); @@ -83,4 +81,7 @@ void stats_event_add_int32_annotation(struct stats_event* event, uint32_t annota uint32_t stats_event_get_errors(struct stats_event* event); +/* TESTING ONLY */ +void stats_event_set_timestamp_ns(struct stats_event* event, const uint64_t timestampNs); + #endif // ANDROID_STATS_LOG_STATS_EVENT_H From 85f73573d610ffb3fb1960d31fd698f15bffb87f Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Thu, 31 Oct 2019 15:55:23 -0700 Subject: [PATCH 028/388] Move type ids to stats_event.h This allows the parsing code within statsd to access the type ids. Also, we move stats_event.h to the include directory for consistency. Test: m -j libstatssocket Change-Id: I1db7fc9e9d0efd2225612353a8fc49bb13220ff0 --- libstats/{ => include}/stats_event.h | 13 +++++++++++++ libstats/stats_event.c | 15 +-------------- 2 files changed, 14 insertions(+), 14 deletions(-) rename libstats/{ => include}/stats_event.h (92%) diff --git a/libstats/stats_event.h b/libstats/include/stats_event.h similarity index 92% rename from libstats/stats_event.h rename to libstats/include/stats_event.h index ee886280c..504d0890f 100644 --- a/libstats/stats_event.h +++ b/libstats/include/stats_event.h @@ -59,6 +59,19 @@ struct stats_event; #define ERROR_TOO_MANY_ANNOTATIONS 0x80 #define ERROR_TOO_MANY_FIELDS 0x100 +/* TYPE IDS */ +#define INT32_TYPE 0x00 +#define INT64_TYPE 0x01 +#define STRING_TYPE 0x02 +#define LIST_TYPE 0x03 +#define FLOAT_TYPE 0x04 +#define BOOL_TYPE 0x05 +#define BYTE_ARRAY_TYPE 0x06 +#define OBJECT_TYPE 0x07 +#define KEY_VALUE_PAIRS_TYPE 0x08 +#define ATTRIBUTION_CHAIN_TYPE 0x09 +#define ERROR_TYPE 0x0F + /* SYSTEM API */ struct stats_event* stats_event_obtain(); void stats_event_write(struct stats_event* event); diff --git a/libstats/stats_event.c b/libstats/stats_event.c index 5bccd9bb4..58558b3ba 100644 --- a/libstats/stats_event.c +++ b/libstats/stats_event.c @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "stats_event.h" +#include "include/stats_event.h" #include #include #include @@ -34,19 +34,6 @@ #define POS_ATOM_ID (POS_TIMESTAMP + sizeof(byte) + sizeof(uint64_t)) #define POS_FIRST_FIELD (POS_ATOM_ID + sizeof(byte) + sizeof(uint32_t)) -/* TYPE IDS */ -#define INT32_TYPE 0x00 -#define INT64_TYPE 0x01 -#define STRING_TYPE 0x02 -#define LIST_TYPE 0x03 -#define FLOAT_TYPE 0x04 -#define BOOL_TYPE 0x05 -#define BYTE_ARRAY_TYPE 0x06 -#define OBJECT_TYPE 0x07 -#define KEY_VALUE_PAIR_TYPE 0x08 -#define ATTRIBUTION_CHAIN_TYPE 0x09 -#define ERROR_TYPE 0x0F - /* LIMITS */ #define MAX_ANNOTATION_COUNT 15 #define MAX_ANNOTATION_ID 127 From 6a406d6d4e02742b37496418af24eae11dc949d7 Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Mon, 4 Nov 2019 16:13:09 -0800 Subject: [PATCH 029/388] General cleanup; add support for key-value pairs Encoding of key-value pairs follows strategy described in go/statsd-socket-doc. Fixed bug where timestamp and atom id were not contributing to the number of fields in the buffer. Note: Similar to ag/9603344, which was abandoned because of git rebasing issues. Test: m -j libstatssocket compiles Bug: 143079361 Change-Id: I8d23ddf2dbfee518ad970894ac09ba3ad5b5b4ad --- libstats/include/stats_event.h | 36 +++++++++-- libstats/stats_event.c | 114 ++++++++++++++++++++------------- 2 files changed, 100 insertions(+), 50 deletions(-) diff --git a/libstats/include/stats_event.h b/libstats/include/stats_event.h index 504d0890f..2811f52f4 100644 --- a/libstats/include/stats_event.h +++ b/libstats/include/stats_event.h @@ -53,11 +53,13 @@ struct stats_event; #define ERROR_NO_ATOM_ID 0x2 #define ERROR_OVERFLOW 0x4 #define ERROR_ATTRIBUTION_CHAIN_TOO_LONG 0x8 -#define ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD 0x10 -#define ERROR_INVALID_ANNOTATION_ID 0x20 -#define ERROR_ANNOTATION_ID_TOO_LARGE 0x40 -#define ERROR_TOO_MANY_ANNOTATIONS 0x80 -#define ERROR_TOO_MANY_FIELDS 0x100 +#define ERROR_TOO_MANY_KEY_VALUE_PAIRS 0x10 +#define ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD 0x20 +#define ERROR_INVALID_ANNOTATION_ID 0x40 +#define ERROR_ANNOTATION_ID_TOO_LARGE 0x80 +#define ERROR_TOO_MANY_ANNOTATIONS 0x100 +#define ERROR_TOO_MANY_FIELDS 0x200 +#define ERROR_INVALID_VALUE_TYPE 0x400 /* TYPE IDS */ #define INT32_TYPE 0x00 @@ -88,6 +90,30 @@ void stats_event_write_string8(struct stats_event* event, char* buf, uint32_t nu void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, char** tags, uint32_t* tagLengths, uint32_t numNodes); +/* key_value_pair struct can be constructed as follows: + * struct key_value_pair pair; + * pair.key = key; + * pair.typeId = STRING_TYPE; + * pair.stringValue = buf; + * pair.stringBytes = strlen(buf); + */ +struct key_value_pair { + int32_t key; + uint8_t valueType; // expected to be INT32_TYPE, INT64_TYPE, FLOAT_TYPE, or STRING_TYPE + union { + int32_t int32Value; + int64_t int64Value; + float floatValue; + struct { + char* stringValue; + uint32_t stringBytes; + }; + }; +}; + +void stats_event_add_key_value_pairs(struct stats_event* event, struct key_value_pair* pairs, + uint32_t numPairs); + void stats_event_add_bool_annotation(struct stats_event* event, uint32_t annotationId, bool value); void stats_event_add_int32_annotation(struct stats_event* event, uint32_t annotationId, int32_t value); diff --git a/libstats/stats_event.c b/libstats/stats_event.c index 58558b3ba..5e41d72a6 100644 --- a/libstats/stats_event.c +++ b/libstats/stats_event.c @@ -36,9 +36,7 @@ /* LIMITS */ #define MAX_ANNOTATION_COUNT 15 -#define MAX_ANNOTATION_ID 127 -#define MAX_ATTRIBUTION_NODES 127 -#define MAX_NUM_ELEMENTS 127 +#define MAX_BYTE_VALUE 127 // parsing side requires that lengths fit in 7 bits // The stats_event struct holds the serialized encoding of an event // within a buf. Also includes other required fields. @@ -46,6 +44,7 @@ struct stats_event { byte buf[MAX_EVENT_PAYLOAD]; size_t bufPos; // current write position within the buf size_t lastFieldPos; // location of last field within the buf + byte lastFieldType; // type of last field size_t size; // number of valid bytes within buffer uint32_t numElements; uint32_t atomId; @@ -69,6 +68,7 @@ struct stats_event* stats_event_obtain() { event->bufPos = POS_FIRST_FIELD; event->lastFieldPos = 0; + event->lastFieldType = OBJECT_TYPE; event->size = 0; event->numElements = 0; event->atomId = 0; @@ -144,81 +144,69 @@ static size_t put_byte_array(struct stats_event* event, void* buf, size_t size) return 0; } +static void start_field(struct stats_event* event, byte typeId) { + event->lastFieldPos = event->bufPos; + event->lastFieldType = typeId; + event->bufPos += put_byte(event, typeId); + event->numElements++; +} + void stats_event_write_int32(struct stats_event* event, int32_t value) { if (!event || event->errors) return; - event->lastFieldPos = event->bufPos; - event->bufPos += put_byte(event, INT32_TYPE); + start_field(event, INT32_TYPE); event->bufPos += put_int32(event, value); - event->numElements++; } void stats_event_write_int64(struct stats_event* event, int64_t value) { if (!event || event->errors) return; - event->lastFieldPos = event->bufPos; - event->bufPos += put_byte(event, INT64_TYPE); + start_field(event, INT64_TYPE); event->bufPos += put_int64(event, value); - event->numElements++; } void stats_event_write_float(struct stats_event* event, float value) { if (!event || event->errors) return; - event->lastFieldPos = event->bufPos; - event->bufPos += put_byte(event, FLOAT_TYPE); + start_field(event, FLOAT_TYPE); event->bufPos += put_float(event, value); - event->numElements++; } void stats_event_write_bool(struct stats_event* event, bool value) { if (!event || event->errors) return; - event->lastFieldPos = event->bufPos; - event->bufPos += put_byte(event, BOOL_TYPE); + start_field(event, BOOL_TYPE); event->bufPos += put_bool(event, value); - event->numElements++; } // Buf is assumed to be encoded using UTF8 void stats_event_write_byte_array(struct stats_event* event, uint8_t* buf, uint32_t numBytes) { if (!event || !buf || event->errors) return; - event->lastFieldPos = event->bufPos; - event->bufPos += put_byte(event, BYTE_ARRAY_TYPE); + start_field(event, BYTE_ARRAY_TYPE); event->bufPos += put_int32(event, numBytes); event->bufPos += put_byte_array(event, buf, numBytes); - event->numElements++; } // Buf is assumed to be encoded using UTF8 void stats_event_write_string8(struct stats_event* event, char* buf, uint32_t numBytes) { if (!event || !buf || event->errors) return; - event->lastFieldPos = event->bufPos; - event->bufPos += put_byte(event, STRING_TYPE); + start_field(event, STRING_TYPE); event->bufPos += put_int32(event, numBytes); event->bufPos += put_byte_array(event, buf, numBytes); - event->numElements++; -} - -// Side-effect: modifies event->errors if the attribution chain is too long -static bool is_attribution_chain_too_long(struct stats_event* event, uint32_t numNodes) { - if (numNodes > MAX_ATTRIBUTION_NODES) { - event->errors |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; - return true; - } - return false; } // Tags are assumed to be encoded using UTF8 void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, char** tags, uint32_t* tagLengths, uint32_t numNodes) { if (!event || event->errors) return; - if (is_attribution_chain_too_long(event, numNodes)) return; + if (numNodes > MAX_BYTE_VALUE) { + event->errors |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; + return; + } - event->lastFieldPos = event->bufPos; - event->bufPos += put_byte(event, ATTRIBUTION_CHAIN_TYPE); + start_field(event, ATTRIBUTION_CHAIN_TYPE); event->bufPos += put_byte(event, (byte)numNodes); for (int i = 0; i < numNodes; i++) { @@ -226,7 +214,41 @@ void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* ui event->bufPos += put_int32(event, tagLengths[i]); event->bufPos += put_byte_array(event, tags[i], tagLengths[i]); } - event->numElements++; +} + +void stats_event_add_key_value_pairs(struct stats_event* event, struct key_value_pair* pairs, + uint32_t numPairs) { + if (!event || event->errors) return; + if (numPairs > MAX_BYTE_VALUE) { + event->errors |= ERROR_TOO_MANY_KEY_VALUE_PAIRS; + return; + } + + start_field(event, KEY_VALUE_PAIRS_TYPE); + event->bufPos += put_byte(event, (byte)numPairs); + + for (int i = 0; i < numPairs; i++) { + event->bufPos += put_int32(event, pairs[i].key); + event->bufPos += put_byte(event, pairs[i].valueType); + switch (pairs[i].valueType) { + case INT32_TYPE: + event->bufPos += put_int32(event, pairs[i].int32Value); + break; + case INT64_TYPE: + event->bufPos += put_int64(event, pairs[i].int64Value); + break; + case FLOAT_TYPE: + event->bufPos += put_float(event, pairs[i].floatValue); + break; + case STRING_TYPE: + event->bufPos += put_int32(event, pairs[i].stringBytes); + event->bufPos += put_byte_array(event, pairs[i].stringValue, pairs[i].stringBytes); + break; + default: + event->errors |= ERROR_INVALID_VALUE_TYPE; + return; + } + } } // Side-effect: modifies event->errors if annotation does not follow field @@ -240,7 +262,7 @@ static bool does_annotation_follow_field(struct stats_event* event) { // Side-effect: modifies event->errors if annotation id is too large static bool is_valid_annotation_id(struct stats_event* event, uint32_t annotationId) { - if (annotationId > MAX_ANNOTATION_ID) { + if (annotationId > MAX_BYTE_VALUE) { event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; return false; } @@ -250,15 +272,15 @@ static bool is_valid_annotation_id(struct stats_event* event, uint32_t annotatio // Side-effect: modifies event->errors if field has too many annotations static void increment_annotation_count(struct stats_event* event) { byte fieldType = event->buf[event->lastFieldPos] & 0x0F; - byte oldAnnotationCount = event->buf[event->lastFieldPos] & 0xF0; - byte newAnnotationCount = oldAnnotationCount + 1; + uint32_t oldAnnotationCount = event->buf[event->lastFieldPos] & 0xF0; + uint32_t newAnnotationCount = oldAnnotationCount + 1; if (newAnnotationCount > MAX_ANNOTATION_COUNT) { event->errors |= ERROR_TOO_MANY_ANNOTATIONS; return; } - event->buf[event->lastFieldPos] = ((newAnnotationCount << 4) & 0xF0) | fieldType; + event->buf[event->lastFieldPos] = (((byte)newAnnotationCount << 4) & 0xF0) | fieldType; } void stats_event_add_bool_annotation(struct stats_event* event, uint32_t annotationId, bool value) { @@ -292,13 +314,6 @@ static void build(struct stats_event* event) { // store size before we modify bufPos event->size = event->bufPos; - if (event->numElements > MAX_NUM_ELEMENTS) { - event->errors |= ERROR_TOO_MANY_FIELDS; - } else { - event->bufPos = POS_NUM_ELEMENTS; - put_byte(event, (byte)event->numElements); - } - if (event->timestampNs == 0) { event->errors |= ERROR_NO_TIMESTAMP; } else { @@ -308,6 +323,7 @@ static void build(struct stats_event* event) { event->bufPos = POS_TIMESTAMP; event->bufPos += put_byte(event, INT64_TYPE); event->bufPos += put_int64(event, event->timestampNs); + event->numElements++; } if (event->atomId == 0) { @@ -316,6 +332,14 @@ static void build(struct stats_event* event) { event->bufPos = POS_ATOM_ID; event->bufPos += put_byte(event, INT32_TYPE); event->bufPos += put_int64(event, event->atomId); + event->numElements++; + } + + if (event->numElements > MAX_BYTE_VALUE) { + event->errors |= ERROR_TOO_MANY_FIELDS; + } else { + event->bufPos = POS_NUM_ELEMENTS; + put_byte(event, (byte)event->numElements); } // If there are errors, rewrite buffer From 0e957b82c8afa24ac10960665316047b970a5b90 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Wed, 6 Nov 2019 12:45:10 +0900 Subject: [PATCH 030/388] Rename # vndk tag to # llndk The APIs that are tagged with # vndk are actually for LLNDK libraries. Although LLNDK is part of VNDK, calling those APIs 'vndk' has given users a wrong perception that the APIs don't need to be kept stable because that's the norm for most of the VNDK libraries that are not LLNDK. In order to eliminate the misunderstanding, rename the tag to 'llndk' so that people introducing new such API will realize what they are signing themselves up for. Bug: 143765505 Test: m Change-Id: Iae2acdf1ff4097a64a5c6280797c66abb1d5a5e6 --- liblog/liblog.map.txt | 62 +++++++++++++-------------- libsync/libsync.map.txt | 8 ++-- libvndksupport/libvndksupport.map.txt | 6 +-- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/liblog/liblog.map.txt b/liblog/liblog.map.txt index aea33507f..2dd8059e1 100644 --- a/liblog/liblog.map.txt +++ b/liblog/liblog.map.txt @@ -1,7 +1,7 @@ LIBLOG { global: - android_name_to_log_id; # vndk - android_log_id_to_name; # vndk + android_name_to_log_id; # llndk + android_log_id_to_name; # llndk __android_log_assert; __android_log_buf_print; __android_log_buf_write; @@ -14,44 +14,44 @@ LIBLOG { LIBLOG_L { global: - android_logger_clear; # vndk - android_logger_get_id; # vndk - android_logger_get_log_readable_size; # vndk - android_logger_get_log_version; # vndk - android_logger_get_log_size; # vndk - android_logger_list_alloc; # apex vndk - android_logger_list_alloc_time; # apex vndk - android_logger_list_free; # apex vndk - android_logger_list_open; # vndk - android_logger_list_read; # apex vndk - android_logger_open; # apex vndk - android_logger_set_log_size; # vndk + android_logger_clear; # llndk + android_logger_get_id; # llndk + android_logger_get_log_readable_size; # llndk + android_logger_get_log_version; # llndk + android_logger_get_log_size; # llndk + android_logger_list_alloc; # apex llndk + android_logger_list_alloc_time; # apex llndk + android_logger_list_free; # apex llndk + android_logger_list_open; # llndk + android_logger_list_read; # apex llndk + android_logger_open; # apex llndk + android_logger_set_log_size; # llndk }; LIBLOG_M { global: - android_logger_get_prune_list; # vndk - android_logger_set_prune_list; # vndk - android_logger_get_statistics; # vndk - __android_log_error_write; # apex vndk + android_logger_get_prune_list; # llndk + android_logger_set_prune_list; # llndk + android_logger_get_statistics; # llndk + __android_log_error_write; # apex llndk __android_log_is_loggable; - create_android_logger; # apex vndk - android_log_destroy; # apex vndk - android_log_write_list_begin; # apex vndk - android_log_write_list_end; # apex vndk - android_log_write_int32; # apex vndk - android_log_write_int64; # apex vndk - android_log_write_string8; # apex vndk - android_log_write_string8_len; # apex vndk - android_log_write_float32; # apex vndk - android_log_write_list; # apex vndk + create_android_logger; # apex llndk + android_log_destroy; # apex llndk + android_log_write_list_begin; # apex llndk + android_log_write_list_end; # apex llndk + android_log_write_int32; # apex llndk + android_log_write_int64; # apex llndk + android_log_write_string8; # apex llndk + android_log_write_string8_len; # apex llndk + android_log_write_float32; # apex llndk + android_log_write_list; # apex llndk }; LIBLOG_O { global: __android_log_is_loggable_len; - __android_log_is_debuggable; # apex vndk + __android_log_is_debuggable; # apex llndk }; LIBLOG_Q { @@ -62,8 +62,8 @@ LIBLOG_Q { __android_log_close; # apex __android_log_security; # apex __android_log_security_bswrite; # apex - android_log_reset; # vndk - android_log_parser_reset; # vndk + android_log_reset; # llndk + android_log_parser_reset; # llndk }; LIBLOG_PRIVATE { diff --git a/libsync/libsync.map.txt b/libsync/libsync.map.txt index 53bb07a70..91c3528d1 100644 --- a/libsync/libsync.map.txt +++ b/libsync/libsync.map.txt @@ -19,10 +19,10 @@ LIBSYNC { sync_merge; # introduced=26 sync_file_info; # introduced=26 sync_file_info_free; # introduced=26 - sync_wait; # vndk - sync_fence_info; # vndk - sync_pt_info; # vndk - sync_fence_info_free; # vndk + sync_wait; # llndk + sync_fence_info; # llndk + sync_pt_info; # llndk + sync_fence_info_free; # llndk local: *; }; diff --git a/libvndksupport/libvndksupport.map.txt b/libvndksupport/libvndksupport.map.txt index ac9a99c3c..a44ed180e 100644 --- a/libvndksupport/libvndksupport.map.txt +++ b/libvndksupport/libvndksupport.map.txt @@ -1,8 +1,8 @@ LIBVNDKSUPPORT { global: - android_is_in_vendor_process; # vndk apex - android_load_sphal_library; # vndk apex - android_unload_sphal_library; # vndk apex + android_is_in_vendor_process; # llndk apex + android_load_sphal_library; # llndk apex + android_unload_sphal_library; # llndk apex local: *; }; From c6512a4bf8ac8b86caed324ab68d31174a39100a Mon Sep 17 00:00:00 2001 From: Ray Essick Date: Thu, 31 Oct 2019 13:53:05 -0700 Subject: [PATCH 031/388] configs for jailed procs to dump code coverage data list system calls used for dumping code coverage information; empty on non code coverage builds. Mini-jail configurations can include this file instead of trying to manage the list themselves. Bug: 139313557 Test: arm32/arm64/x86 media svcs w/native coverage on, kill -37 to dump stats. Change-Id: I7323a9739803756a76f54e4a98e995522cab71ef --- code_coverage/Android.mk | 37 ++++++++++++++ .../empty_policy/code_coverage.arm.policy | 2 + .../empty_policy/code_coverage.arm64.policy | 2 + .../empty_policy/code_coverage.x86.policy | 2 + .../empty_policy/code_coverage.x86_64.policy | 2 + .../seccomp_policy/code_coverage.arm.policy | 14 +++++ .../seccomp_policy/code_coverage.arm64.policy | 13 +++++ .../seccomp_policy/code_coverage.policy.def | 51 +++++++++++++++++++ .../seccomp_policy/code_coverage.x86.policy | 13 +++++ .../code_coverage.x86_64.policy | 12 +++++ code_coverage/seccomp_policy/generate.sh | 12 +++++ 11 files changed, 160 insertions(+) create mode 100644 code_coverage/Android.mk create mode 100644 code_coverage/empty_policy/code_coverage.arm.policy create mode 100644 code_coverage/empty_policy/code_coverage.arm64.policy create mode 100644 code_coverage/empty_policy/code_coverage.x86.policy create mode 100644 code_coverage/empty_policy/code_coverage.x86_64.policy create mode 100644 code_coverage/seccomp_policy/code_coverage.arm.policy create mode 100644 code_coverage/seccomp_policy/code_coverage.arm64.policy create mode 100644 code_coverage/seccomp_policy/code_coverage.policy.def create mode 100644 code_coverage/seccomp_policy/code_coverage.x86.policy create mode 100644 code_coverage/seccomp_policy/code_coverage.x86_64.policy create mode 100755 code_coverage/seccomp_policy/generate.sh diff --git a/code_coverage/Android.mk b/code_coverage/Android.mk new file mode 100644 index 000000000..80ab36be6 --- /dev/null +++ b/code_coverage/Android.mk @@ -0,0 +1,37 @@ +# policies to allow processes inside minijail to dump code coverage information +# + +LOCAL_PATH := $(call my-dir) + + +include $(CLEAR_VARS) +LOCAL_MODULE := code_coverage.policy +LOCAL_MODULE_CLASS := ETC +LOCAL_MULTILIB := both + +ifeq ($(TARGET_ARCH), $(filter $(TARGET_ARCH), arm arm64)) +LOCAL_MODULE_STEM_32 := code_coverage.arm.policy +LOCAL_MODULE_STEM_64 := code_coverage.arm64.policy +endif + +ifeq ($(TARGET_ARCH), $(filter $(TARGET_ARCH), x86 x86_64)) +LOCAL_MODULE_STEM_32 := code_coverage.x86.policy +LOCAL_MODULE_STEM_64 := code_coverage.x86_64.policy +endif + +# different files for different configurations +ifeq ($(NATIVE_COVERAGE),true) +LOCAL_SRC_FILES_arm := seccomp_policy/code_coverage.arm.policy +LOCAL_SRC_FILES_arm64 := seccomp_policy/code_coverage.arm64.policy +LOCAL_SRC_FILES_x86 := seccomp_policy/code_coverage.x86.policy +LOCAL_SRC_FILES_x86_64 := seccomp_policy/code_coverage.x86_64.policy +else +LOCAL_SRC_FILES_arm := empty_policy/code_coverage.arm.policy +LOCAL_SRC_FILES_arm64 := empty_policy/code_coverage.arm64.policy +LOCAL_SRC_FILES_x86 := empty_policy/code_coverage.x86.policy +LOCAL_SRC_FILES_x86_64 := empty_policy/code_coverage.x86_64.policy +endif + +LOCAL_MODULE_TARGET_ARCH := arm arm64 x86 x86_64 +LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/seccomp_policy +include $(BUILD_PREBUILT) diff --git a/code_coverage/empty_policy/code_coverage.arm.policy b/code_coverage/empty_policy/code_coverage.arm.policy new file mode 100644 index 000000000..4c9132b06 --- /dev/null +++ b/code_coverage/empty_policy/code_coverage.arm.policy @@ -0,0 +1,2 @@ +# empty unless code_coverage is enabled. +# code_coverage.arm.policy diff --git a/code_coverage/empty_policy/code_coverage.arm64.policy b/code_coverage/empty_policy/code_coverage.arm64.policy new file mode 100644 index 000000000..dc5c35a4d --- /dev/null +++ b/code_coverage/empty_policy/code_coverage.arm64.policy @@ -0,0 +1,2 @@ +# empty unless code_coverage is enabled. +# code_coverage.arm64.policy diff --git a/code_coverage/empty_policy/code_coverage.x86.policy b/code_coverage/empty_policy/code_coverage.x86.policy new file mode 100644 index 000000000..044f34c96 --- /dev/null +++ b/code_coverage/empty_policy/code_coverage.x86.policy @@ -0,0 +1,2 @@ +# empty unless code_coverage is enabled. +# code_coverage.x86.policy diff --git a/code_coverage/empty_policy/code_coverage.x86_64.policy b/code_coverage/empty_policy/code_coverage.x86_64.policy new file mode 100644 index 000000000..6dcd22d79 --- /dev/null +++ b/code_coverage/empty_policy/code_coverage.x86_64.policy @@ -0,0 +1,2 @@ +# empty unless code_coverage is enabled. +# code_coverage.x86_64.policy diff --git a/code_coverage/seccomp_policy/code_coverage.arm.policy b/code_coverage/seccomp_policy/code_coverage.arm.policy new file mode 100644 index 000000000..d6784e371 --- /dev/null +++ b/code_coverage/seccomp_policy/code_coverage.arm.policy @@ -0,0 +1,14 @@ +close: 1 +mkdirat: 1 +msync: 1 +munmap: 1 +openat: 1 +write: 1 +fcntl64: 1 +fstat64: 1 +geteuid32: 1 +_llseek: 1 +mmap2: 1 +sigreturn: 1 +gettimeofday: 1 +prctl: 1 diff --git a/code_coverage/seccomp_policy/code_coverage.arm64.policy b/code_coverage/seccomp_policy/code_coverage.arm64.policy new file mode 100644 index 000000000..4c3dd2664 --- /dev/null +++ b/code_coverage/seccomp_policy/code_coverage.arm64.policy @@ -0,0 +1,13 @@ +close: 1 +mkdirat: 1 +msync: 1 +munmap: 1 +openat: 1 +write: 1 +fcntl: 1 +fstat: 1 +geteuid: 1 +lseek: 1 +mmap: 1 +rt_sigreturn: 1 +prctl: 1 diff --git a/code_coverage/seccomp_policy/code_coverage.policy.def b/code_coverage/seccomp_policy/code_coverage.policy.def new file mode 100644 index 000000000..f136084bc --- /dev/null +++ b/code_coverage/seccomp_policy/code_coverage.policy.def @@ -0,0 +1,51 @@ +// SECCOMP_MODE_STRICT +// +// minijail allowances for code coverage +// this is processed with generate.sh, so we can use appropriate directives +// size specific: __LP64__ for 64 bit, else 32 bit +// arch specific: __arm__, __aarch64__, __i386__, __x86_64__ + +// includes *all* syscalls used during the coverage dumping +// no skipping just because they might have been in another policy file. + +// coverage tool uses different operations on different passes +// 1st: uses write() to fill the file +// 2nd-Nth: uses mmap() to update in place + +close: 1 +mkdirat: 1 +msync: 1 +munmap: 1 +openat: 1 +write: 1 + +#if defined(__LP64__) +fcntl: 1 +fstat: 1 +geteuid: 1 +lseek: 1 +mmap: 1 +rt_sigreturn: 1 +#else +fcntl64: 1 +fstat64: 1 +geteuid32: 1 +_llseek: 1 +mmap2: 1 +sigreturn: 1 +#endif + +#if defined(__arm__) +gettimeofday: 1 +#endif + +#if defined(__i386__) +madvise: 1 +#endif + +#if defined(__arm__) +prctl: 1 +#elif defined(__aarch64__) +prctl: 1 +#endif + diff --git a/code_coverage/seccomp_policy/code_coverage.x86.policy b/code_coverage/seccomp_policy/code_coverage.x86.policy new file mode 100644 index 000000000..24ff8b9c0 --- /dev/null +++ b/code_coverage/seccomp_policy/code_coverage.x86.policy @@ -0,0 +1,13 @@ +close: 1 +mkdirat: 1 +msync: 1 +munmap: 1 +openat: 1 +write: 1 +fcntl64: 1 +fstat64: 1 +geteuid32: 1 +_llseek: 1 +mmap2: 1 +sigreturn: 1 +madvise: 1 diff --git a/code_coverage/seccomp_policy/code_coverage.x86_64.policy b/code_coverage/seccomp_policy/code_coverage.x86_64.policy new file mode 100644 index 000000000..308103654 --- /dev/null +++ b/code_coverage/seccomp_policy/code_coverage.x86_64.policy @@ -0,0 +1,12 @@ +close: 1 +mkdirat: 1 +msync: 1 +munmap: 1 +openat: 1 +write: 1 +fcntl: 1 +fstat: 1 +geteuid: 1 +lseek: 1 +mmap: 1 +rt_sigreturn: 1 diff --git a/code_coverage/seccomp_policy/generate.sh b/code_coverage/seccomp_policy/generate.sh new file mode 100755 index 000000000..ae582c647 --- /dev/null +++ b/code_coverage/seccomp_policy/generate.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# generate the arch-specific files from the generic one + +set -ex + +cd "$(dirname "$0")" +CPP='cpp -undef -E -P code_coverage.policy.def' +$CPP -D__arm__ -o code_coverage.arm.policy +$CPP -D__aarch64__ -D__LP64__ -o code_coverage.arm64.policy +$CPP -D__i386__ -o code_coverage.x86.policy +$CPP -D__x86_64__ -D__LP64__ -o code_coverage.x86_64.policy From 7b8fcfea0ef7593f2c20d1f2bf81477d1f4544d0 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 8 Nov 2019 15:59:30 -0800 Subject: [PATCH 032/388] Remove unused android_memset16()/android_memset32(). Pixelflinger is gone. Test: treehugger Change-Id: I6954ae6a860102be0f6d76f33e76ed3210e5c152 --- libcutils/Android.bp | 24 - libcutils/arch-arm/memset32.S | 100 ---- libcutils/arch-arm64/android_memset.S | 211 ------- libcutils/arch-mips/android_memset.c | 100 ---- libcutils/arch-x86/android_memset16.S | 719 ----------------------- libcutils/arch-x86/android_memset32.S | 510 ---------------- libcutils/arch-x86_64/android_memset16.S | 565 ------------------ libcutils/arch-x86_64/android_memset32.S | 373 ------------ libcutils/include/cutils/memory.h | 11 +- libcutils/memset_test.cpp | 181 ------ 10 files changed, 1 insertion(+), 2793 deletions(-) delete mode 100644 libcutils/arch-arm/memset32.S delete mode 100644 libcutils/arch-arm64/android_memset.S delete mode 100644 libcutils/arch-mips/android_memset.c delete mode 100755 libcutils/arch-x86/android_memset16.S delete mode 100755 libcutils/arch-x86/android_memset32.S delete mode 100644 libcutils/arch-x86_64/android_memset16.S delete mode 100644 libcutils/arch-x86_64/android_memset32.S delete mode 100644 libcutils/memset_test.cpp diff --git a/libcutils/Android.bp b/libcutils/Android.bp index 88e1bdb69..125589652 100644 --- a/libcutils/Android.bp +++ b/libcutils/Android.bp @@ -114,36 +114,17 @@ cc_library { }, android_arm: { - srcs: ["arch-arm/memset32.S"], sanitize: { misc_undefined: ["integer"], }, }, android_arm64: { - srcs: ["arch-arm64/android_memset.S"], - sanitize: { - misc_undefined: ["integer"], - }, - }, - - android_mips: { - srcs: ["arch-mips/android_memset.c"], - sanitize: { - misc_undefined: ["integer"], - }, - }, - android_mips64: { - srcs: ["arch-mips/android_memset.c"], sanitize: { misc_undefined: ["integer"], }, }, android_x86: { - srcs: [ - "arch-x86/android_memset16.S", - "arch-x86/android_memset32.S", - ], // TODO: This is to work around b/29412086. // Remove once __mulodi4 is available and move the "sanitize" block // to the android target. @@ -153,10 +134,6 @@ cc_library { }, android_x86_64: { - srcs: [ - "arch-x86_64/android_memset16.S", - "arch-x86_64/android_memset32.S", - ], sanitize: { misc_undefined: ["integer"], }, @@ -206,7 +183,6 @@ cc_defaults { "android_get_control_socket_test.cpp", "ashmem_test.cpp", "fs_config_test.cpp", - "memset_test.cpp", "multiuser_test.cpp", "properties_test.cpp", "sched_policy_test.cpp", diff --git a/libcutils/arch-arm/memset32.S b/libcutils/arch-arm/memset32.S deleted file mode 100644 index 1e89636b4..000000000 --- a/libcutils/arch-arm/memset32.S +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2006 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. - */ -/* - * memset32.S - * - */ - - .syntax unified - - .text - .align - - .global android_memset32 - .type android_memset32, %function - .global android_memset16 - .type android_memset16, %function - - /* - * Optimized memset32 and memset16 for ARM. - * - * void android_memset16(uint16_t* dst, uint16_t value, size_t size); - * void android_memset32(uint32_t* dst, uint32_t value, size_t size); - * - */ - -android_memset16: - .fnstart - cmp r2, #1 - bxle lr - - /* expand the data to 32 bits */ - mov r1, r1, lsl #16 - orr r1, r1, r1, lsr #16 - - /* align to 32 bits */ - tst r0, #2 - strhne r1, [r0], #2 - subne r2, r2, #2 - .fnend - -android_memset32: - .fnstart - .cfi_startproc - str lr, [sp, #-4]! - .cfi_def_cfa_offset 4 - .cfi_rel_offset lr, 0 - - /* align the destination to a cache-line */ - mov r12, r1 - mov lr, r1 - rsb r3, r0, #0 - ands r3, r3, #0x1C - beq .Laligned32 - cmp r3, r2 - andhi r3, r2, #0x1C - sub r2, r2, r3 - - /* conditionally writes 0 to 7 words (length in r3) */ - movs r3, r3, lsl #28 - stmiacs r0!, {r1, lr} - stmiacs r0!, {r1, lr} - stmiami r0!, {r1, lr} - movs r3, r3, lsl #2 - strcs r1, [r0], #4 - -.Laligned32: - mov r3, r1 -1: subs r2, r2, #32 - stmiahs r0!, {r1,r3,r12,lr} - stmiahs r0!, {r1,r3,r12,lr} - bhs 1b - add r2, r2, #32 - - /* conditionally stores 0 to 30 bytes */ - movs r2, r2, lsl #28 - stmiacs r0!, {r1,r3,r12,lr} - stmiami r0!, {r1,lr} - movs r2, r2, lsl #2 - strcs r1, [r0], #4 - strhmi lr, [r0], #2 - - ldr lr, [sp], #4 - .cfi_def_cfa_offset 0 - .cfi_restore lr - bx lr - .cfi_endproc - .fnend diff --git a/libcutils/arch-arm64/android_memset.S b/libcutils/arch-arm64/android_memset.S deleted file mode 100644 index 9a83a6876..000000000 --- a/libcutils/arch-arm64/android_memset.S +++ /dev/null @@ -1,211 +0,0 @@ -/* Copyright (c) 2012, Linaro Limited - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the Linaro nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* Assumptions: - * - * ARMv8-a, AArch64 - * Unaligned accesses - * - */ - -/* By default we assume that the DC instruction can be used to zero - data blocks more efficiently. In some circumstances this might be - unsafe, for example in an asymmetric multiprocessor environment with - different DC clear lengths (neither the upper nor lower lengths are - safe to use). */ - -#define dst x0 -#define count x2 -#define tmp1 x3 -#define tmp1w w3 -#define tmp2 x4 -#define tmp2w w4 -#define zva_len_x x5 -#define zva_len w5 -#define zva_bits_x x6 - -#define A_l x1 -#define A_lw w1 -#define tmp3w w9 - -#define ENTRY(f) \ - .text; \ - .globl f; \ - .align 0; \ - .type f, %function; \ - f: \ - .cfi_startproc \ - -#define END(f) \ - .cfi_endproc; \ - .size f, .-f; \ - -ENTRY(android_memset16) - ands A_lw, A_lw, #0xffff - b.eq .Lzero_mem - orr A_lw, A_lw, A_lw, lsl #16 - b .Lexpand_to_64 -END(android_memset16) - -ENTRY(android_memset32) - cmp A_lw, #0 - b.eq .Lzero_mem -.Lexpand_to_64: - orr A_l, A_l, A_l, lsl #32 -.Ltail_maybe_long: - cmp count, #64 - b.ge .Lnot_short -.Ltail_maybe_tiny: - cmp count, #15 - b.le .Ltail15tiny -.Ltail63: - ands tmp1, count, #0x30 - b.eq .Ltail15 - add dst, dst, tmp1 - cmp tmp1w, #0x20 - b.eq 1f - b.lt 2f - stp A_l, A_l, [dst, #-48] -1: - stp A_l, A_l, [dst, #-32] -2: - stp A_l, A_l, [dst, #-16] - -.Ltail15: - and count, count, #15 - add dst, dst, count - stp A_l, A_l, [dst, #-16] /* Repeat some/all of last store. */ - ret - -.Ltail15tiny: - /* Set up to 15 bytes. Does not assume earlier memory - being set. */ - tbz count, #3, 1f - str A_l, [dst], #8 -1: - tbz count, #2, 1f - str A_lw, [dst], #4 -1: - tbz count, #1, 1f - strh A_lw, [dst], #2 -1: - ret - - /* Critical loop. Start at a new cache line boundary. Assuming - * 64 bytes per line, this ensures the entire loop is in one line. */ - .p2align 6 -.Lnot_short: - neg tmp2, dst - ands tmp2, tmp2, #15 - b.eq 2f - /* Bring DST to 128-bit (16-byte) alignment. We know that there's - * more than that to set, so we simply store 16 bytes and advance by - * the amount required to reach alignment. */ - sub count, count, tmp2 - stp A_l, A_l, [dst] - add dst, dst, tmp2 - /* There may be less than 63 bytes to go now. */ - cmp count, #63 - b.le .Ltail63 -2: - sub dst, dst, #16 /* Pre-bias. */ - sub count, count, #64 -1: - stp A_l, A_l, [dst, #16] - stp A_l, A_l, [dst, #32] - stp A_l, A_l, [dst, #48] - stp A_l, A_l, [dst, #64]! - subs count, count, #64 - b.ge 1b - tst count, #0x3f - add dst, dst, #16 - b.ne .Ltail63 - ret - - /* For zeroing memory, check to see if we can use the ZVA feature to - * zero entire 'cache' lines. */ -.Lzero_mem: - mov A_l, #0 - cmp count, #63 - b.le .Ltail_maybe_tiny - neg tmp2, dst - ands tmp2, tmp2, #15 - b.eq 1f - sub count, count, tmp2 - stp A_l, A_l, [dst] - add dst, dst, tmp2 - cmp count, #63 - b.le .Ltail63 -1: - /* For zeroing small amounts of memory, it's not worth setting up - * the line-clear code. */ - cmp count, #128 - b.lt .Lnot_short - mrs tmp1, dczid_el0 - tbnz tmp1, #4, .Lnot_short - mov tmp3w, #4 - and zva_len, tmp1w, #15 /* Safety: other bits reserved. */ - lsl zva_len, tmp3w, zva_len - -.Lzero_by_line: - /* Compute how far we need to go to become suitably aligned. We're - * already at quad-word alignment. */ - cmp count, zva_len_x - b.lt .Lnot_short /* Not enough to reach alignment. */ - sub zva_bits_x, zva_len_x, #1 - neg tmp2, dst - ands tmp2, tmp2, zva_bits_x - b.eq 1f /* Already aligned. */ - /* Not aligned, check that there's enough to copy after alignment. */ - sub tmp1, count, tmp2 - cmp tmp1, #64 - ccmp tmp1, zva_len_x, #8, ge /* NZCV=0b1000 */ - b.lt .Lnot_short - /* We know that there's at least 64 bytes to zero and that it's safe - * to overrun by 64 bytes. */ - mov count, tmp1 -2: - stp A_l, A_l, [dst] - stp A_l, A_l, [dst, #16] - stp A_l, A_l, [dst, #32] - subs tmp2, tmp2, #64 - stp A_l, A_l, [dst, #48] - add dst, dst, #64 - b.ge 2b - /* We've overrun a bit, so adjust dst downwards. */ - add dst, dst, tmp2 -1: - sub count, count, zva_len_x -3: - dc zva, dst - add dst, dst, zva_len_x - subs count, count, zva_len_x - b.ge 3b - ands count, count, zva_bits_x - b.ne .Ltail_maybe_long - ret -END(android_memset32) diff --git a/libcutils/arch-mips/android_memset.c b/libcutils/arch-mips/android_memset.c deleted file mode 100644 index c0fe3d1e6..000000000 --- a/libcutils/arch-mips/android_memset.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* generic C version for any machine */ - -#include - -#ifdef __clang__ -__attribute__((no_sanitize("integer"))) -#endif -void android_memset16(uint16_t* dst, uint16_t value, size_t size) -{ - /* optimized version of - size >>= 1; - while (size--) - *dst++ = value; - */ - - size >>= 1; - if (((uintptr_t)dst & 2) && size) { - /* fill unpaired first elem separately */ - *dst++ = value; - size--; - } - /* dst is now 32-bit-aligned */ - /* fill body with 32-bit pairs */ - uint32_t value32 = (((uint32_t)value) << 16) | ((uint32_t)value); - android_memset32((uint32_t*) dst, value32, size<<1); - if (size & 1) { - dst[size-1] = value; /* fill unpaired last elem */ - } -} - - -#ifdef __clang__ -__attribute__((no_sanitize("integer"))) -#endif -void android_memset32(uint32_t* dst, uint32_t value, size_t size) -{ - /* optimized version of - size >>= 2; - while (size--) - *dst++ = value; - */ - - size >>= 2; - if (((uintptr_t)dst & 4) && size) { - /* fill unpaired first 32-bit elem separately */ - *dst++ = value; - size--; - } - /* dst is now 64-bit aligned */ - /* fill body with 64-bit pairs */ - uint64_t value64 = (((uint64_t)value) << 32) | ((uint64_t)value); - uint64_t* dst64 = (uint64_t*)dst; - - while (size >= 12) { - dst64[0] = value64; - dst64[1] = value64; - dst64[2] = value64; - dst64[3] = value64; - dst64[4] = value64; - dst64[5] = value64; - size -= 12; - dst64 += 6; - } - - /* fill remainder with original 32-bit single-elem loop */ - dst = (uint32_t*) dst64; - while (size != 0) { - size--; - *dst++ = value; - } - -} diff --git a/libcutils/arch-x86/android_memset16.S b/libcutils/arch-x86/android_memset16.S deleted file mode 100755 index cb2ff1412..000000000 --- a/libcutils/arch-x86/android_memset16.S +++ /dev/null @@ -1,719 +0,0 @@ -/* - * Copyright (C) 2010 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 "cache.h" - -#ifndef MEMSET -# define MEMSET android_memset16 -#endif - -#ifndef L -# define L(label) .L##label -#endif - -#ifndef ALIGN -# define ALIGN(n) .p2align n -#endif - -#ifndef cfi_startproc -# define cfi_startproc .cfi_startproc -#endif - -#ifndef cfi_endproc -# define cfi_endproc .cfi_endproc -#endif - -#ifndef cfi_rel_offset -# define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off -#endif - -#ifndef cfi_restore -# define cfi_restore(reg) .cfi_restore reg -#endif - -#ifndef cfi_adjust_cfa_offset -# define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off -#endif - -#ifndef ENTRY -# define ENTRY(name) \ - .type name, @function; \ - .globl name; \ - .p2align 4; \ -name: \ - cfi_startproc -#endif - -#ifndef END -# define END(name) \ - cfi_endproc; \ - .size name, .-name -#endif - -#define CFI_PUSH(REG) \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (REG, 0) - -#define CFI_POP(REG) \ - cfi_adjust_cfa_offset (-4); \ - cfi_restore (REG) - -#define PUSH(REG) pushl REG; CFI_PUSH (REG) -#define POP(REG) popl REG; CFI_POP (REG) - -#ifdef USE_AS_BZERO16 -# define DEST PARMS -# define LEN DEST+4 -# define SETRTNVAL -#else -# define DEST PARMS -# define CHR DEST+4 -# define LEN CHR+4 -# define SETRTNVAL movl DEST(%esp), %eax -#endif - -#if (defined SHARED || defined __PIC__) -# define ENTRANCE PUSH (%ebx); -# define RETURN_END POP (%ebx); ret -# define RETURN RETURN_END; CFI_PUSH (%ebx) -# define PARMS 8 /* Preserve EBX. */ -# define JMPTBL(I, B) I - B - -/* Load an entry in a jump table into EBX and branch to it. TABLE is a - jump table with relative offsets. */ -# define BRANCH_TO_JMPTBL_ENTRY(TABLE) \ - /* We first load PC into EBX. */ \ - call __x86.get_pc_thunk.bx; \ - /* Get the address of the jump table. */ \ - add $(TABLE - .), %ebx; \ - /* Get the entry and convert the relative offset to the \ - absolute address. */ \ - add (%ebx,%ecx,4), %ebx; \ - /* We loaded the jump table and adjuested EDX. Go. */ \ - jmp *%ebx - - .section .gnu.linkonce.t.__x86.get_pc_thunk.bx,"ax",@progbits - .globl __x86.get_pc_thunk.bx - .hidden __x86.get_pc_thunk.bx - ALIGN (4) - .type __x86.get_pc_thunk.bx,@function -__x86.get_pc_thunk.bx: - movl (%esp), %ebx - ret -#else -# define ENTRANCE -# define RETURN_END ret -# define RETURN RETURN_END -# define PARMS 4 -# define JMPTBL(I, B) I - -/* Branch to an entry in a jump table. TABLE is a jump table with - absolute offsets. */ -# define BRANCH_TO_JMPTBL_ENTRY(TABLE) \ - jmp *TABLE(,%ecx,4) -#endif - - .section .text.sse2,"ax",@progbits - ALIGN (4) -ENTRY (MEMSET) - ENTRANCE - - movl LEN(%esp), %ecx - shr $1, %ecx -#ifdef USE_AS_BZERO16 - xor %eax, %eax -#else - movzwl CHR(%esp), %eax - mov %eax, %edx - shl $16, %eax - or %edx, %eax -#endif - movl DEST(%esp), %edx - cmp $32, %ecx - jae L(32wordsormore) - -L(write_less32words): - lea (%edx, %ecx, 2), %edx - BRANCH_TO_JMPTBL_ENTRY (L(table_less32words)) - - - .pushsection .rodata.sse2,"a",@progbits - ALIGN (2) -L(table_less32words): - .int JMPTBL (L(write_0words), L(table_less32words)) - .int JMPTBL (L(write_1words), L(table_less32words)) - .int JMPTBL (L(write_2words), L(table_less32words)) - .int JMPTBL (L(write_3words), L(table_less32words)) - .int JMPTBL (L(write_4words), L(table_less32words)) - .int JMPTBL (L(write_5words), L(table_less32words)) - .int JMPTBL (L(write_6words), L(table_less32words)) - .int JMPTBL (L(write_7words), L(table_less32words)) - .int JMPTBL (L(write_8words), L(table_less32words)) - .int JMPTBL (L(write_9words), L(table_less32words)) - .int JMPTBL (L(write_10words), L(table_less32words)) - .int JMPTBL (L(write_11words), L(table_less32words)) - .int JMPTBL (L(write_12words), L(table_less32words)) - .int JMPTBL (L(write_13words), L(table_less32words)) - .int JMPTBL (L(write_14words), L(table_less32words)) - .int JMPTBL (L(write_15words), L(table_less32words)) - .int JMPTBL (L(write_16words), L(table_less32words)) - .int JMPTBL (L(write_17words), L(table_less32words)) - .int JMPTBL (L(write_18words), L(table_less32words)) - .int JMPTBL (L(write_19words), L(table_less32words)) - .int JMPTBL (L(write_20words), L(table_less32words)) - .int JMPTBL (L(write_21words), L(table_less32words)) - .int JMPTBL (L(write_22words), L(table_less32words)) - .int JMPTBL (L(write_23words), L(table_less32words)) - .int JMPTBL (L(write_24words), L(table_less32words)) - .int JMPTBL (L(write_25words), L(table_less32words)) - .int JMPTBL (L(write_26words), L(table_less32words)) - .int JMPTBL (L(write_27words), L(table_less32words)) - .int JMPTBL (L(write_28words), L(table_less32words)) - .int JMPTBL (L(write_29words), L(table_less32words)) - .int JMPTBL (L(write_30words), L(table_less32words)) - .int JMPTBL (L(write_31words), L(table_less32words)) - .popsection - - ALIGN (4) -L(write_28words): - movl %eax, -56(%edx) - movl %eax, -52(%edx) -L(write_24words): - movl %eax, -48(%edx) - movl %eax, -44(%edx) -L(write_20words): - movl %eax, -40(%edx) - movl %eax, -36(%edx) -L(write_16words): - movl %eax, -32(%edx) - movl %eax, -28(%edx) -L(write_12words): - movl %eax, -24(%edx) - movl %eax, -20(%edx) -L(write_8words): - movl %eax, -16(%edx) - movl %eax, -12(%edx) -L(write_4words): - movl %eax, -8(%edx) - movl %eax, -4(%edx) -L(write_0words): - SETRTNVAL - RETURN - - ALIGN (4) -L(write_29words): - movl %eax, -58(%edx) - movl %eax, -54(%edx) -L(write_25words): - movl %eax, -50(%edx) - movl %eax, -46(%edx) -L(write_21words): - movl %eax, -42(%edx) - movl %eax, -38(%edx) -L(write_17words): - movl %eax, -34(%edx) - movl %eax, -30(%edx) -L(write_13words): - movl %eax, -26(%edx) - movl %eax, -22(%edx) -L(write_9words): - movl %eax, -18(%edx) - movl %eax, -14(%edx) -L(write_5words): - movl %eax, -10(%edx) - movl %eax, -6(%edx) -L(write_1words): - mov %ax, -2(%edx) - SETRTNVAL - RETURN - - ALIGN (4) -L(write_30words): - movl %eax, -60(%edx) - movl %eax, -56(%edx) -L(write_26words): - movl %eax, -52(%edx) - movl %eax, -48(%edx) -L(write_22words): - movl %eax, -44(%edx) - movl %eax, -40(%edx) -L(write_18words): - movl %eax, -36(%edx) - movl %eax, -32(%edx) -L(write_14words): - movl %eax, -28(%edx) - movl %eax, -24(%edx) -L(write_10words): - movl %eax, -20(%edx) - movl %eax, -16(%edx) -L(write_6words): - movl %eax, -12(%edx) - movl %eax, -8(%edx) -L(write_2words): - movl %eax, -4(%edx) - SETRTNVAL - RETURN - - ALIGN (4) -L(write_31words): - movl %eax, -62(%edx) - movl %eax, -58(%edx) -L(write_27words): - movl %eax, -54(%edx) - movl %eax, -50(%edx) -L(write_23words): - movl %eax, -46(%edx) - movl %eax, -42(%edx) -L(write_19words): - movl %eax, -38(%edx) - movl %eax, -34(%edx) -L(write_15words): - movl %eax, -30(%edx) - movl %eax, -26(%edx) -L(write_11words): - movl %eax, -22(%edx) - movl %eax, -18(%edx) -L(write_7words): - movl %eax, -14(%edx) - movl %eax, -10(%edx) -L(write_3words): - movl %eax, -6(%edx) - movw %ax, -2(%edx) - SETRTNVAL - RETURN - - ALIGN (4) - -L(32wordsormore): - shl $1, %ecx - test $0x01, %edx - jz L(aligned2bytes) - mov %eax, (%edx) - mov %eax, -4(%edx, %ecx) - sub $2, %ecx - add $1, %edx - rol $8, %eax -L(aligned2bytes): -#ifdef USE_AS_BZERO16 - pxor %xmm0, %xmm0 -#else - movd %eax, %xmm0 - pshufd $0, %xmm0, %xmm0 -#endif - testl $0xf, %edx - jz L(aligned_16) -/* ECX > 32 and EDX is not 16 byte aligned. */ -L(not_aligned_16): - movdqu %xmm0, (%edx) - movl %edx, %eax - and $-16, %edx - add $16, %edx - sub %edx, %eax - add %eax, %ecx - movd %xmm0, %eax - - ALIGN (4) -L(aligned_16): - cmp $128, %ecx - jae L(128bytesormore) - -L(aligned_16_less128bytes): - add %ecx, %edx - shr $1, %ecx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes)) - - ALIGN (4) -L(128bytesormore): -#ifdef SHARED_CACHE_SIZE - PUSH (%ebx) - mov $SHARED_CACHE_SIZE, %ebx -#else -# if (defined SHARED || defined __PIC__) - call __x86.get_pc_thunk.bx - add $_GLOBAL_OFFSET_TABLE_, %ebx - mov __x86_shared_cache_size@GOTOFF(%ebx), %ebx -# else - PUSH (%ebx) - mov __x86_shared_cache_size, %ebx -# endif -#endif - cmp %ebx, %ecx - jae L(128bytesormore_nt_start) - - -#ifdef DATA_CACHE_SIZE - POP (%ebx) -# define RESTORE_EBX_STATE CFI_PUSH (%ebx) - cmp $DATA_CACHE_SIZE, %ecx -#else -# if (defined SHARED || defined __PIC__) -# define RESTORE_EBX_STATE - call __x86.get_pc_thunk.bx - add $_GLOBAL_OFFSET_TABLE_, %ebx - cmp __x86_data_cache_size@GOTOFF(%ebx), %ecx -# else - POP (%ebx) -# define RESTORE_EBX_STATE CFI_PUSH (%ebx) - cmp __x86_data_cache_size, %ecx -# endif -#endif - - jae L(128bytes_L2_normal) - subl $128, %ecx -L(128bytesormore_normal): - sub $128, %ecx - movdqa %xmm0, (%edx) - movdqa %xmm0, 0x10(%edx) - movdqa %xmm0, 0x20(%edx) - movdqa %xmm0, 0x30(%edx) - movdqa %xmm0, 0x40(%edx) - movdqa %xmm0, 0x50(%edx) - movdqa %xmm0, 0x60(%edx) - movdqa %xmm0, 0x70(%edx) - lea 128(%edx), %edx - jb L(128bytesless_normal) - - - sub $128, %ecx - movdqa %xmm0, (%edx) - movdqa %xmm0, 0x10(%edx) - movdqa %xmm0, 0x20(%edx) - movdqa %xmm0, 0x30(%edx) - movdqa %xmm0, 0x40(%edx) - movdqa %xmm0, 0x50(%edx) - movdqa %xmm0, 0x60(%edx) - movdqa %xmm0, 0x70(%edx) - lea 128(%edx), %edx - jae L(128bytesormore_normal) - -L(128bytesless_normal): - lea 128(%ecx), %ecx - add %ecx, %edx - shr $1, %ecx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes)) - - ALIGN (4) -L(128bytes_L2_normal): - prefetcht0 0x380(%edx) - prefetcht0 0x3c0(%edx) - sub $128, %ecx - movdqa %xmm0, (%edx) - movaps %xmm0, 0x10(%edx) - movaps %xmm0, 0x20(%edx) - movaps %xmm0, 0x30(%edx) - movaps %xmm0, 0x40(%edx) - movaps %xmm0, 0x50(%edx) - movaps %xmm0, 0x60(%edx) - movaps %xmm0, 0x70(%edx) - add $128, %edx - cmp $128, %ecx - jae L(128bytes_L2_normal) - -L(128bytesless_L2_normal): - add %ecx, %edx - shr $1, %ecx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes)) - - RESTORE_EBX_STATE -L(128bytesormore_nt_start): - sub %ebx, %ecx - mov %ebx, %eax - and $0x7f, %eax - add %eax, %ecx - movd %xmm0, %eax - ALIGN (4) -L(128bytesormore_shared_cache_loop): - prefetcht0 0x3c0(%edx) - prefetcht0 0x380(%edx) - sub $0x80, %ebx - movdqa %xmm0, (%edx) - movdqa %xmm0, 0x10(%edx) - movdqa %xmm0, 0x20(%edx) - movdqa %xmm0, 0x30(%edx) - movdqa %xmm0, 0x40(%edx) - movdqa %xmm0, 0x50(%edx) - movdqa %xmm0, 0x60(%edx) - movdqa %xmm0, 0x70(%edx) - add $0x80, %edx - cmp $0x80, %ebx - jae L(128bytesormore_shared_cache_loop) - cmp $0x80, %ecx - jb L(shared_cache_loop_end) - ALIGN (4) -L(128bytesormore_nt): - sub $0x80, %ecx - movntdq %xmm0, (%edx) - movntdq %xmm0, 0x10(%edx) - movntdq %xmm0, 0x20(%edx) - movntdq %xmm0, 0x30(%edx) - movntdq %xmm0, 0x40(%edx) - movntdq %xmm0, 0x50(%edx) - movntdq %xmm0, 0x60(%edx) - movntdq %xmm0, 0x70(%edx) - add $0x80, %edx - cmp $0x80, %ecx - jae L(128bytesormore_nt) - sfence -L(shared_cache_loop_end): -#if defined DATA_CACHE_SIZE || !(defined SHARED || defined __PIC__) - POP (%ebx) -#endif - add %ecx, %edx - shr $1, %ecx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes)) - - - .pushsection .rodata.sse2,"a",@progbits - ALIGN (2) -L(table_16_128bytes): - .int JMPTBL (L(aligned_16_0bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_2bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_4bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_6bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_8bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_10bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_12bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_14bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_16bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_18bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_20bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_22bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_24bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_26bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_28bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_30bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_32bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_34bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_36bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_38bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_40bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_42bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_44bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_46bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_48bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_50bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_52bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_54bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_56bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_58bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_60bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_62bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_64bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_66bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_68bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_70bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_72bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_74bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_76bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_78bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_80bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_82bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_84bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_86bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_88bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_90bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_92bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_94bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_96bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_98bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_100bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_102bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_104bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_106bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_108bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_110bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_112bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_114bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_116bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_118bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_120bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_122bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_124bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_126bytes), L(table_16_128bytes)) - .popsection - - - ALIGN (4) -L(aligned_16_112bytes): - movdqa %xmm0, -112(%edx) -L(aligned_16_96bytes): - movdqa %xmm0, -96(%edx) -L(aligned_16_80bytes): - movdqa %xmm0, -80(%edx) -L(aligned_16_64bytes): - movdqa %xmm0, -64(%edx) -L(aligned_16_48bytes): - movdqa %xmm0, -48(%edx) -L(aligned_16_32bytes): - movdqa %xmm0, -32(%edx) -L(aligned_16_16bytes): - movdqa %xmm0, -16(%edx) -L(aligned_16_0bytes): - SETRTNVAL - RETURN - - - ALIGN (4) -L(aligned_16_114bytes): - movdqa %xmm0, -114(%edx) -L(aligned_16_98bytes): - movdqa %xmm0, -98(%edx) -L(aligned_16_82bytes): - movdqa %xmm0, -82(%edx) -L(aligned_16_66bytes): - movdqa %xmm0, -66(%edx) -L(aligned_16_50bytes): - movdqa %xmm0, -50(%edx) -L(aligned_16_34bytes): - movdqa %xmm0, -34(%edx) -L(aligned_16_18bytes): - movdqa %xmm0, -18(%edx) -L(aligned_16_2bytes): - movw %ax, -2(%edx) - SETRTNVAL - RETURN - - ALIGN (4) -L(aligned_16_116bytes): - movdqa %xmm0, -116(%edx) -L(aligned_16_100bytes): - movdqa %xmm0, -100(%edx) -L(aligned_16_84bytes): - movdqa %xmm0, -84(%edx) -L(aligned_16_68bytes): - movdqa %xmm0, -68(%edx) -L(aligned_16_52bytes): - movdqa %xmm0, -52(%edx) -L(aligned_16_36bytes): - movdqa %xmm0, -36(%edx) -L(aligned_16_20bytes): - movdqa %xmm0, -20(%edx) -L(aligned_16_4bytes): - movl %eax, -4(%edx) - SETRTNVAL - RETURN - - - ALIGN (4) -L(aligned_16_118bytes): - movdqa %xmm0, -118(%edx) -L(aligned_16_102bytes): - movdqa %xmm0, -102(%edx) -L(aligned_16_86bytes): - movdqa %xmm0, -86(%edx) -L(aligned_16_70bytes): - movdqa %xmm0, -70(%edx) -L(aligned_16_54bytes): - movdqa %xmm0, -54(%edx) -L(aligned_16_38bytes): - movdqa %xmm0, -38(%edx) -L(aligned_16_22bytes): - movdqa %xmm0, -22(%edx) -L(aligned_16_6bytes): - movl %eax, -6(%edx) - movw %ax, -2(%edx) - SETRTNVAL - RETURN - - - ALIGN (4) -L(aligned_16_120bytes): - movdqa %xmm0, -120(%edx) -L(aligned_16_104bytes): - movdqa %xmm0, -104(%edx) -L(aligned_16_88bytes): - movdqa %xmm0, -88(%edx) -L(aligned_16_72bytes): - movdqa %xmm0, -72(%edx) -L(aligned_16_56bytes): - movdqa %xmm0, -56(%edx) -L(aligned_16_40bytes): - movdqa %xmm0, -40(%edx) -L(aligned_16_24bytes): - movdqa %xmm0, -24(%edx) -L(aligned_16_8bytes): - movq %xmm0, -8(%edx) - SETRTNVAL - RETURN - - - ALIGN (4) -L(aligned_16_122bytes): - movdqa %xmm0, -122(%edx) -L(aligned_16_106bytes): - movdqa %xmm0, -106(%edx) -L(aligned_16_90bytes): - movdqa %xmm0, -90(%edx) -L(aligned_16_74bytes): - movdqa %xmm0, -74(%edx) -L(aligned_16_58bytes): - movdqa %xmm0, -58(%edx) -L(aligned_16_42bytes): - movdqa %xmm0, -42(%edx) -L(aligned_16_26bytes): - movdqa %xmm0, -26(%edx) -L(aligned_16_10bytes): - movq %xmm0, -10(%edx) - movw %ax, -2(%edx) - SETRTNVAL - RETURN - - - ALIGN (4) -L(aligned_16_124bytes): - movdqa %xmm0, -124(%edx) -L(aligned_16_108bytes): - movdqa %xmm0, -108(%edx) -L(aligned_16_92bytes): - movdqa %xmm0, -92(%edx) -L(aligned_16_76bytes): - movdqa %xmm0, -76(%edx) -L(aligned_16_60bytes): - movdqa %xmm0, -60(%edx) -L(aligned_16_44bytes): - movdqa %xmm0, -44(%edx) -L(aligned_16_28bytes): - movdqa %xmm0, -28(%edx) -L(aligned_16_12bytes): - movq %xmm0, -12(%edx) - movl %eax, -4(%edx) - SETRTNVAL - RETURN - - - ALIGN (4) -L(aligned_16_126bytes): - movdqa %xmm0, -126(%edx) -L(aligned_16_110bytes): - movdqa %xmm0, -110(%edx) -L(aligned_16_94bytes): - movdqa %xmm0, -94(%edx) -L(aligned_16_78bytes): - movdqa %xmm0, -78(%edx) -L(aligned_16_62bytes): - movdqa %xmm0, -62(%edx) -L(aligned_16_46bytes): - movdqa %xmm0, -46(%edx) -L(aligned_16_30bytes): - movdqa %xmm0, -30(%edx) -L(aligned_16_14bytes): - movq %xmm0, -14(%edx) - movl %eax, -6(%edx) - movw %ax, -2(%edx) - SETRTNVAL - RETURN - -END (MEMSET) diff --git a/libcutils/arch-x86/android_memset32.S b/libcutils/arch-x86/android_memset32.S deleted file mode 100755 index f4326dc90..000000000 --- a/libcutils/arch-x86/android_memset32.S +++ /dev/null @@ -1,510 +0,0 @@ -/* - * Copyright (C) 2010 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 "cache.h" - -#ifndef MEMSET -# define MEMSET android_memset32 -#endif - -#ifndef L -# define L(label) .L##label -#endif - -#ifndef ALIGN -# define ALIGN(n) .p2align n -#endif - -#ifndef cfi_startproc -# define cfi_startproc .cfi_startproc -#endif - -#ifndef cfi_endproc -# define cfi_endproc .cfi_endproc -#endif - -#ifndef cfi_rel_offset -# define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off -#endif - -#ifndef cfi_restore -# define cfi_restore(reg) .cfi_restore reg -#endif - -#ifndef cfi_adjust_cfa_offset -# define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off -#endif - -#ifndef ENTRY -# define ENTRY(name) \ - .type name, @function; \ - .globl name; \ - .p2align 4; \ -name: \ - cfi_startproc -#endif - -#ifndef END -# define END(name) \ - cfi_endproc; \ - .size name, .-name -#endif - -#define CFI_PUSH(REG) \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (REG, 0) - -#define CFI_POP(REG) \ - cfi_adjust_cfa_offset (-4); \ - cfi_restore (REG) - -#define PUSH(REG) pushl REG; CFI_PUSH (REG) -#define POP(REG) popl REG; CFI_POP (REG) - -#ifdef USE_AS_BZERO32 -# define DEST PARMS -# define LEN DEST+4 -# define SETRTNVAL -#else -# define DEST PARMS -# define DWDS DEST+4 -# define LEN DWDS+4 -# define SETRTNVAL movl DEST(%esp), %eax -#endif - -#if (defined SHARED || defined __PIC__) -# define ENTRANCE PUSH (%ebx); -# define RETURN_END POP (%ebx); ret -# define RETURN RETURN_END; CFI_PUSH (%ebx) -# define PARMS 8 /* Preserve EBX. */ -# define JMPTBL(I, B) I - B - -/* Load an entry in a jump table into EBX and branch to it. TABLE is a - jump table with relative offsets. */ -# define BRANCH_TO_JMPTBL_ENTRY(TABLE) \ - /* We first load PC into EBX. */ \ - call __x86.get_pc_thunk.bx; \ - /* Get the address of the jump table. */ \ - add $(TABLE - .), %ebx; \ - /* Get the entry and convert the relative offset to the \ - absolute address. */ \ - add (%ebx,%ecx,4), %ebx; \ - /* We loaded the jump table and adjuested EDX. Go. */ \ - jmp *%ebx - - .section .gnu.linkonce.t.__x86.get_pc_thunk.bx,"ax",@progbits - .globl __x86.get_pc_thunk.bx - .hidden __x86.get_pc_thunk.bx - ALIGN (4) - .type __x86.get_pc_thunk.bx,@function -__x86.get_pc_thunk.bx: - movl (%esp), %ebx - ret -#else -# define ENTRANCE -# define RETURN_END ret -# define RETURN RETURN_END -# define PARMS 4 -# define JMPTBL(I, B) I - -/* Branch to an entry in a jump table. TABLE is a jump table with - absolute offsets. */ -# define BRANCH_TO_JMPTBL_ENTRY(TABLE) \ - jmp *TABLE(,%ecx,4) -#endif - - .section .text.sse2,"ax",@progbits - ALIGN (4) -ENTRY (MEMSET) - ENTRANCE - - movl LEN(%esp), %ecx - shr $2, %ecx -#ifdef USE_AS_BZERO32 - xor %eax, %eax -#else - mov DWDS(%esp), %eax - mov %eax, %edx -#endif - movl DEST(%esp), %edx - cmp $16, %ecx - jae L(16dbwordsormore) - -L(write_less16dbwords): - lea (%edx, %ecx, 4), %edx - BRANCH_TO_JMPTBL_ENTRY (L(table_less16dbwords)) - - .pushsection .rodata.sse2,"a",@progbits - ALIGN (2) -L(table_less16dbwords): - .int JMPTBL (L(write_0dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_1dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_2dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_3dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_4dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_5dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_6dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_7dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_8dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_9dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_10dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_11dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_12dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_13dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_14dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_15dbwords), L(table_less16dbwords)) - .popsection - - ALIGN (4) -L(write_15dbwords): - movl %eax, -60(%edx) -L(write_14dbwords): - movl %eax, -56(%edx) -L(write_13dbwords): - movl %eax, -52(%edx) -L(write_12dbwords): - movl %eax, -48(%edx) -L(write_11dbwords): - movl %eax, -44(%edx) -L(write_10dbwords): - movl %eax, -40(%edx) -L(write_9dbwords): - movl %eax, -36(%edx) -L(write_8dbwords): - movl %eax, -32(%edx) -L(write_7dbwords): - movl %eax, -28(%edx) -L(write_6dbwords): - movl %eax, -24(%edx) -L(write_5dbwords): - movl %eax, -20(%edx) -L(write_4dbwords): - movl %eax, -16(%edx) -L(write_3dbwords): - movl %eax, -12(%edx) -L(write_2dbwords): - movl %eax, -8(%edx) -L(write_1dbwords): - movl %eax, -4(%edx) -L(write_0dbwords): - SETRTNVAL - RETURN - - ALIGN (4) -L(16dbwordsormore): - test $3, %edx - jz L(aligned4bytes) - mov %eax, (%edx) - mov %eax, -4(%edx, %ecx, 4) - sub $1, %ecx - rol $24, %eax - add $1, %edx - test $3, %edx - jz L(aligned4bytes) - ror $8, %eax - add $1, %edx - test $3, %edx - jz L(aligned4bytes) - ror $8, %eax - add $1, %edx -L(aligned4bytes): - shl $2, %ecx - -#ifdef USE_AS_BZERO32 - pxor %xmm0, %xmm0 -#else - movd %eax, %xmm0 - pshufd $0, %xmm0, %xmm0 -#endif - testl $0xf, %edx - jz L(aligned_16) -/* ECX > 32 and EDX is not 16 byte aligned. */ -L(not_aligned_16): - movdqu %xmm0, (%edx) - movl %edx, %eax - and $-16, %edx - add $16, %edx - sub %edx, %eax - add %eax, %ecx - movd %xmm0, %eax - ALIGN (4) -L(aligned_16): - cmp $128, %ecx - jae L(128bytesormore) - -L(aligned_16_less128bytes): - add %ecx, %edx - shr $2, %ecx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes)) - - ALIGN (4) -L(128bytesormore): -#ifdef SHARED_CACHE_SIZE - PUSH (%ebx) - mov $SHARED_CACHE_SIZE, %ebx -#else -# if (defined SHARED || defined __PIC__) - call __x86.get_pc_thunk.bx - add $_GLOBAL_OFFSET_TABLE_, %ebx - mov __x86_shared_cache_size@GOTOFF(%ebx), %ebx -# else - PUSH (%ebx) - mov __x86_shared_cache_size, %ebx -# endif -#endif - cmp %ebx, %ecx - jae L(128bytesormore_nt_start) - -#ifdef DATA_CACHE_SIZE - POP (%ebx) -# define RESTORE_EBX_STATE CFI_PUSH (%ebx) - cmp $DATA_CACHE_SIZE, %ecx -#else -# if (defined SHARED || defined __PIC__) -# define RESTORE_EBX_STATE - call __x86.get_pc_thunk.bx - add $_GLOBAL_OFFSET_TABLE_, %ebx - cmp __x86_data_cache_size@GOTOFF(%ebx), %ecx -# else - POP (%ebx) -# define RESTORE_EBX_STATE CFI_PUSH (%ebx) - cmp __x86_data_cache_size, %ecx -# endif -#endif - - jae L(128bytes_L2_normal) - subl $128, %ecx -L(128bytesormore_normal): - sub $128, %ecx - movdqa %xmm0, (%edx) - movdqa %xmm0, 0x10(%edx) - movdqa %xmm0, 0x20(%edx) - movdqa %xmm0, 0x30(%edx) - movdqa %xmm0, 0x40(%edx) - movdqa %xmm0, 0x50(%edx) - movdqa %xmm0, 0x60(%edx) - movdqa %xmm0, 0x70(%edx) - lea 128(%edx), %edx - jb L(128bytesless_normal) - - - sub $128, %ecx - movdqa %xmm0, (%edx) - movdqa %xmm0, 0x10(%edx) - movdqa %xmm0, 0x20(%edx) - movdqa %xmm0, 0x30(%edx) - movdqa %xmm0, 0x40(%edx) - movdqa %xmm0, 0x50(%edx) - movdqa %xmm0, 0x60(%edx) - movdqa %xmm0, 0x70(%edx) - lea 128(%edx), %edx - jae L(128bytesormore_normal) - -L(128bytesless_normal): - lea 128(%ecx), %ecx - add %ecx, %edx - shr $2, %ecx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes)) - - ALIGN (4) -L(128bytes_L2_normal): - prefetcht0 0x380(%edx) - prefetcht0 0x3c0(%edx) - sub $128, %ecx - movdqa %xmm0, (%edx) - movaps %xmm0, 0x10(%edx) - movaps %xmm0, 0x20(%edx) - movaps %xmm0, 0x30(%edx) - movaps %xmm0, 0x40(%edx) - movaps %xmm0, 0x50(%edx) - movaps %xmm0, 0x60(%edx) - movaps %xmm0, 0x70(%edx) - add $128, %edx - cmp $128, %ecx - jae L(128bytes_L2_normal) - -L(128bytesless_L2_normal): - add %ecx, %edx - shr $2, %ecx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes)) - - RESTORE_EBX_STATE -L(128bytesormore_nt_start): - sub %ebx, %ecx - mov %ebx, %eax - and $0x7f, %eax - add %eax, %ecx - movd %xmm0, %eax - ALIGN (4) -L(128bytesormore_shared_cache_loop): - prefetcht0 0x3c0(%edx) - prefetcht0 0x380(%edx) - sub $0x80, %ebx - movdqa %xmm0, (%edx) - movdqa %xmm0, 0x10(%edx) - movdqa %xmm0, 0x20(%edx) - movdqa %xmm0, 0x30(%edx) - movdqa %xmm0, 0x40(%edx) - movdqa %xmm0, 0x50(%edx) - movdqa %xmm0, 0x60(%edx) - movdqa %xmm0, 0x70(%edx) - add $0x80, %edx - cmp $0x80, %ebx - jae L(128bytesormore_shared_cache_loop) - cmp $0x80, %ecx - jb L(shared_cache_loop_end) - - ALIGN (4) -L(128bytesormore_nt): - sub $0x80, %ecx - movntdq %xmm0, (%edx) - movntdq %xmm0, 0x10(%edx) - movntdq %xmm0, 0x20(%edx) - movntdq %xmm0, 0x30(%edx) - movntdq %xmm0, 0x40(%edx) - movntdq %xmm0, 0x50(%edx) - movntdq %xmm0, 0x60(%edx) - movntdq %xmm0, 0x70(%edx) - add $0x80, %edx - cmp $0x80, %ecx - jae L(128bytesormore_nt) - sfence -L(shared_cache_loop_end): -#if defined DATA_CACHE_SIZE || !(defined SHARED || defined __PIC__) - POP (%ebx) -#endif - add %ecx, %edx - shr $2, %ecx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes)) - - .pushsection .rodata.sse2,"a",@progbits - ALIGN (2) -L(table_16_128bytes): - .int JMPTBL (L(aligned_16_0bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_4bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_8bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_12bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_16bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_20bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_24bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_28bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_32bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_36bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_40bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_44bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_48bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_52bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_56bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_60bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_64bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_68bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_72bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_76bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_80bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_84bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_88bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_92bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_96bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_100bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_104bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_108bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_112bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_116bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_120bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_124bytes), L(table_16_128bytes)) - .popsection - - ALIGN (4) -L(aligned_16_112bytes): - movdqa %xmm0, -112(%edx) -L(aligned_16_96bytes): - movdqa %xmm0, -96(%edx) -L(aligned_16_80bytes): - movdqa %xmm0, -80(%edx) -L(aligned_16_64bytes): - movdqa %xmm0, -64(%edx) -L(aligned_16_48bytes): - movdqa %xmm0, -48(%edx) -L(aligned_16_32bytes): - movdqa %xmm0, -32(%edx) -L(aligned_16_16bytes): - movdqa %xmm0, -16(%edx) -L(aligned_16_0bytes): - SETRTNVAL - RETURN - - ALIGN (4) -L(aligned_16_116bytes): - movdqa %xmm0, -116(%edx) -L(aligned_16_100bytes): - movdqa %xmm0, -100(%edx) -L(aligned_16_84bytes): - movdqa %xmm0, -84(%edx) -L(aligned_16_68bytes): - movdqa %xmm0, -68(%edx) -L(aligned_16_52bytes): - movdqa %xmm0, -52(%edx) -L(aligned_16_36bytes): - movdqa %xmm0, -36(%edx) -L(aligned_16_20bytes): - movdqa %xmm0, -20(%edx) -L(aligned_16_4bytes): - movl %eax, -4(%edx) - SETRTNVAL - RETURN - - ALIGN (4) -L(aligned_16_120bytes): - movdqa %xmm0, -120(%edx) -L(aligned_16_104bytes): - movdqa %xmm0, -104(%edx) -L(aligned_16_88bytes): - movdqa %xmm0, -88(%edx) -L(aligned_16_72bytes): - movdqa %xmm0, -72(%edx) -L(aligned_16_56bytes): - movdqa %xmm0, -56(%edx) -L(aligned_16_40bytes): - movdqa %xmm0, -40(%edx) -L(aligned_16_24bytes): - movdqa %xmm0, -24(%edx) -L(aligned_16_8bytes): - movq %xmm0, -8(%edx) - SETRTNVAL - RETURN - - ALIGN (4) -L(aligned_16_124bytes): - movdqa %xmm0, -124(%edx) -L(aligned_16_108bytes): - movdqa %xmm0, -108(%edx) -L(aligned_16_92bytes): - movdqa %xmm0, -92(%edx) -L(aligned_16_76bytes): - movdqa %xmm0, -76(%edx) -L(aligned_16_60bytes): - movdqa %xmm0, -60(%edx) -L(aligned_16_44bytes): - movdqa %xmm0, -44(%edx) -L(aligned_16_28bytes): - movdqa %xmm0, -28(%edx) -L(aligned_16_12bytes): - movq %xmm0, -12(%edx) - movl %eax, -4(%edx) - SETRTNVAL - RETURN - -END (MEMSET) diff --git a/libcutils/arch-x86_64/android_memset16.S b/libcutils/arch-x86_64/android_memset16.S deleted file mode 100644 index cb6d4a320..000000000 --- a/libcutils/arch-x86_64/android_memset16.S +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright (C) 2014 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 "cache.h" - -#ifndef MEMSET -# define MEMSET android_memset16 -#endif - -#ifndef L -# define L(label) .L##label -#endif - -#ifndef ALIGN -# define ALIGN(n) .p2align n -#endif - -#ifndef cfi_startproc -# define cfi_startproc .cfi_startproc -#endif - -#ifndef cfi_endproc -# define cfi_endproc .cfi_endproc -#endif - -#ifndef ENTRY -# define ENTRY(name) \ - .type name, @function; \ - .globl name; \ - .p2align 4; \ -name: \ - cfi_startproc -#endif - -#ifndef END -# define END(name) \ - cfi_endproc; \ - .size name, .-name -#endif - -#define JMPTBL(I, B) I - B - -/* Branch to an entry in a jump table. TABLE is a jump table with - relative offsets. INDEX is a register contains the index into the - jump table. SCALE is the scale of INDEX. */ -#define BRANCH_TO_JMPTBL_ENTRY(TABLE, INDEX, SCALE) \ - lea TABLE(%rip), %r11; \ - movslq (%r11, INDEX, SCALE), INDEX; \ - lea (%r11, INDEX), INDEX; \ - jmp *INDEX - - .section .text.sse2,"ax",@progbits - ALIGN (4) -ENTRY (MEMSET) // Address in rdi - shr $1, %rdx // Count in rdx - movzwl %si, %ecx - /* Fill the whole ECX with pattern. */ - shl $16, %esi - or %esi, %ecx // Pattern in ecx - - cmp $32, %rdx - jae L(32wordsormore) - -L(write_less32words): - lea (%rdi, %rdx, 2), %rdi - BRANCH_TO_JMPTBL_ENTRY (L(table_less32words), %rdx, 4) - - .pushsection .rodata.sse2,"a",@progbits - ALIGN (2) -L(table_less32words): - .int JMPTBL (L(write_0words), L(table_less32words)) - .int JMPTBL (L(write_1words), L(table_less32words)) - .int JMPTBL (L(write_2words), L(table_less32words)) - .int JMPTBL (L(write_3words), L(table_less32words)) - .int JMPTBL (L(write_4words), L(table_less32words)) - .int JMPTBL (L(write_5words), L(table_less32words)) - .int JMPTBL (L(write_6words), L(table_less32words)) - .int JMPTBL (L(write_7words), L(table_less32words)) - .int JMPTBL (L(write_8words), L(table_less32words)) - .int JMPTBL (L(write_9words), L(table_less32words)) - .int JMPTBL (L(write_10words), L(table_less32words)) - .int JMPTBL (L(write_11words), L(table_less32words)) - .int JMPTBL (L(write_12words), L(table_less32words)) - .int JMPTBL (L(write_13words), L(table_less32words)) - .int JMPTBL (L(write_14words), L(table_less32words)) - .int JMPTBL (L(write_15words), L(table_less32words)) - .int JMPTBL (L(write_16words), L(table_less32words)) - .int JMPTBL (L(write_17words), L(table_less32words)) - .int JMPTBL (L(write_18words), L(table_less32words)) - .int JMPTBL (L(write_19words), L(table_less32words)) - .int JMPTBL (L(write_20words), L(table_less32words)) - .int JMPTBL (L(write_21words), L(table_less32words)) - .int JMPTBL (L(write_22words), L(table_less32words)) - .int JMPTBL (L(write_23words), L(table_less32words)) - .int JMPTBL (L(write_24words), L(table_less32words)) - .int JMPTBL (L(write_25words), L(table_less32words)) - .int JMPTBL (L(write_26words), L(table_less32words)) - .int JMPTBL (L(write_27words), L(table_less32words)) - .int JMPTBL (L(write_28words), L(table_less32words)) - .int JMPTBL (L(write_29words), L(table_less32words)) - .int JMPTBL (L(write_30words), L(table_less32words)) - .int JMPTBL (L(write_31words), L(table_less32words)) - .popsection - - ALIGN (4) -L(write_28words): - movl %ecx, -56(%rdi) - movl %ecx, -52(%rdi) -L(write_24words): - movl %ecx, -48(%rdi) - movl %ecx, -44(%rdi) -L(write_20words): - movl %ecx, -40(%rdi) - movl %ecx, -36(%rdi) -L(write_16words): - movl %ecx, -32(%rdi) - movl %ecx, -28(%rdi) -L(write_12words): - movl %ecx, -24(%rdi) - movl %ecx, -20(%rdi) -L(write_8words): - movl %ecx, -16(%rdi) - movl %ecx, -12(%rdi) -L(write_4words): - movl %ecx, -8(%rdi) - movl %ecx, -4(%rdi) -L(write_0words): - ret - - ALIGN (4) -L(write_29words): - movl %ecx, -58(%rdi) - movl %ecx, -54(%rdi) -L(write_25words): - movl %ecx, -50(%rdi) - movl %ecx, -46(%rdi) -L(write_21words): - movl %ecx, -42(%rdi) - movl %ecx, -38(%rdi) -L(write_17words): - movl %ecx, -34(%rdi) - movl %ecx, -30(%rdi) -L(write_13words): - movl %ecx, -26(%rdi) - movl %ecx, -22(%rdi) -L(write_9words): - movl %ecx, -18(%rdi) - movl %ecx, -14(%rdi) -L(write_5words): - movl %ecx, -10(%rdi) - movl %ecx, -6(%rdi) -L(write_1words): - mov %cx, -2(%rdi) - ret - - ALIGN (4) -L(write_30words): - movl %ecx, -60(%rdi) - movl %ecx, -56(%rdi) -L(write_26words): - movl %ecx, -52(%rdi) - movl %ecx, -48(%rdi) -L(write_22words): - movl %ecx, -44(%rdi) - movl %ecx, -40(%rdi) -L(write_18words): - movl %ecx, -36(%rdi) - movl %ecx, -32(%rdi) -L(write_14words): - movl %ecx, -28(%rdi) - movl %ecx, -24(%rdi) -L(write_10words): - movl %ecx, -20(%rdi) - movl %ecx, -16(%rdi) -L(write_6words): - movl %ecx, -12(%rdi) - movl %ecx, -8(%rdi) -L(write_2words): - movl %ecx, -4(%rdi) - ret - - ALIGN (4) -L(write_31words): - movl %ecx, -62(%rdi) - movl %ecx, -58(%rdi) -L(write_27words): - movl %ecx, -54(%rdi) - movl %ecx, -50(%rdi) -L(write_23words): - movl %ecx, -46(%rdi) - movl %ecx, -42(%rdi) -L(write_19words): - movl %ecx, -38(%rdi) - movl %ecx, -34(%rdi) -L(write_15words): - movl %ecx, -30(%rdi) - movl %ecx, -26(%rdi) -L(write_11words): - movl %ecx, -22(%rdi) - movl %ecx, -18(%rdi) -L(write_7words): - movl %ecx, -14(%rdi) - movl %ecx, -10(%rdi) -L(write_3words): - movl %ecx, -6(%rdi) - movw %cx, -2(%rdi) - ret - - ALIGN (4) -L(32wordsormore): - shl $1, %rdx - test $0x01, %edi - jz L(aligned2bytes) - mov %ecx, (%rdi) - mov %ecx, -4(%rdi, %rdx) - sub $2, %rdx - add $1, %rdi - rol $8, %ecx -L(aligned2bytes): - /* Fill xmm0 with the pattern. */ - movd %ecx, %xmm0 - pshufd $0, %xmm0, %xmm0 - - testl $0xf, %edi - jz L(aligned_16) -/* RDX > 32 and RDI is not 16 byte aligned. */ - movdqu %xmm0, (%rdi) - mov %rdi, %rsi - and $-16, %rdi - add $16, %rdi - sub %rdi, %rsi - add %rsi, %rdx - - ALIGN (4) -L(aligned_16): - cmp $128, %rdx - jge L(128bytesormore) - -L(aligned_16_less128bytes): - add %rdx, %rdi - shr $1, %rdx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes), %rdx, 4) - - ALIGN (4) -L(128bytesormore): - cmp $SHARED_CACHE_SIZE, %rdx - jg L(128bytesormore_nt) - -L(128bytesormore_normal): - sub $128, %rdx - movdqa %xmm0, (%rdi) - movdqa %xmm0, 0x10(%rdi) - movdqa %xmm0, 0x20(%rdi) - movdqa %xmm0, 0x30(%rdi) - movdqa %xmm0, 0x40(%rdi) - movdqa %xmm0, 0x50(%rdi) - movdqa %xmm0, 0x60(%rdi) - movdqa %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jl L(128bytesless_normal) - - sub $128, %rdx - movdqa %xmm0, (%rdi) - movdqa %xmm0, 0x10(%rdi) - movdqa %xmm0, 0x20(%rdi) - movdqa %xmm0, 0x30(%rdi) - movdqa %xmm0, 0x40(%rdi) - movdqa %xmm0, 0x50(%rdi) - movdqa %xmm0, 0x60(%rdi) - movdqa %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jl L(128bytesless_normal) - - sub $128, %rdx - movdqa %xmm0, (%rdi) - movdqa %xmm0, 0x10(%rdi) - movdqa %xmm0, 0x20(%rdi) - movdqa %xmm0, 0x30(%rdi) - movdqa %xmm0, 0x40(%rdi) - movdqa %xmm0, 0x50(%rdi) - movdqa %xmm0, 0x60(%rdi) - movdqa %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jl L(128bytesless_normal) - - sub $128, %rdx - movdqa %xmm0, (%rdi) - movdqa %xmm0, 0x10(%rdi) - movdqa %xmm0, 0x20(%rdi) - movdqa %xmm0, 0x30(%rdi) - movdqa %xmm0, 0x40(%rdi) - movdqa %xmm0, 0x50(%rdi) - movdqa %xmm0, 0x60(%rdi) - movdqa %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jge L(128bytesormore_normal) - -L(128bytesless_normal): - add %rdx, %rdi - shr $1, %rdx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes), %rdx, 4) - - ALIGN (4) -L(128bytesormore_nt): - sub $128, %rdx - movntdq %xmm0, (%rdi) - movntdq %xmm0, 0x10(%rdi) - movntdq %xmm0, 0x20(%rdi) - movntdq %xmm0, 0x30(%rdi) - movntdq %xmm0, 0x40(%rdi) - movntdq %xmm0, 0x50(%rdi) - movntdq %xmm0, 0x60(%rdi) - movntdq %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jge L(128bytesormore_nt) - - sfence - add %rdx, %rdi - shr $1, %rdx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes), %rdx, 4) - - .pushsection .rodata.sse2,"a",@progbits - ALIGN (2) -L(table_16_128bytes): - .int JMPTBL (L(aligned_16_0bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_2bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_4bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_6bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_8bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_10bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_12bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_14bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_16bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_18bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_20bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_22bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_24bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_26bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_28bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_30bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_32bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_34bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_36bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_38bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_40bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_42bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_44bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_46bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_48bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_50bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_52bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_54bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_56bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_58bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_60bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_62bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_64bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_66bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_68bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_70bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_72bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_74bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_76bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_78bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_80bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_82bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_84bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_86bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_88bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_90bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_92bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_94bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_96bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_98bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_100bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_102bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_104bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_106bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_108bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_110bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_112bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_114bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_116bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_118bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_120bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_122bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_124bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_126bytes), L(table_16_128bytes)) - .popsection - - ALIGN (4) -L(aligned_16_112bytes): - movdqa %xmm0, -112(%rdi) -L(aligned_16_96bytes): - movdqa %xmm0, -96(%rdi) -L(aligned_16_80bytes): - movdqa %xmm0, -80(%rdi) -L(aligned_16_64bytes): - movdqa %xmm0, -64(%rdi) -L(aligned_16_48bytes): - movdqa %xmm0, -48(%rdi) -L(aligned_16_32bytes): - movdqa %xmm0, -32(%rdi) -L(aligned_16_16bytes): - movdqa %xmm0, -16(%rdi) -L(aligned_16_0bytes): - ret - - ALIGN (4) -L(aligned_16_114bytes): - movdqa %xmm0, -114(%rdi) -L(aligned_16_98bytes): - movdqa %xmm0, -98(%rdi) -L(aligned_16_82bytes): - movdqa %xmm0, -82(%rdi) -L(aligned_16_66bytes): - movdqa %xmm0, -66(%rdi) -L(aligned_16_50bytes): - movdqa %xmm0, -50(%rdi) -L(aligned_16_34bytes): - movdqa %xmm0, -34(%rdi) -L(aligned_16_18bytes): - movdqa %xmm0, -18(%rdi) -L(aligned_16_2bytes): - movw %cx, -2(%rdi) - ret - - ALIGN (4) -L(aligned_16_116bytes): - movdqa %xmm0, -116(%rdi) -L(aligned_16_100bytes): - movdqa %xmm0, -100(%rdi) -L(aligned_16_84bytes): - movdqa %xmm0, -84(%rdi) -L(aligned_16_68bytes): - movdqa %xmm0, -68(%rdi) -L(aligned_16_52bytes): - movdqa %xmm0, -52(%rdi) -L(aligned_16_36bytes): - movdqa %xmm0, -36(%rdi) -L(aligned_16_20bytes): - movdqa %xmm0, -20(%rdi) -L(aligned_16_4bytes): - movl %ecx, -4(%rdi) - ret - - ALIGN (4) -L(aligned_16_118bytes): - movdqa %xmm0, -118(%rdi) -L(aligned_16_102bytes): - movdqa %xmm0, -102(%rdi) -L(aligned_16_86bytes): - movdqa %xmm0, -86(%rdi) -L(aligned_16_70bytes): - movdqa %xmm0, -70(%rdi) -L(aligned_16_54bytes): - movdqa %xmm0, -54(%rdi) -L(aligned_16_38bytes): - movdqa %xmm0, -38(%rdi) -L(aligned_16_22bytes): - movdqa %xmm0, -22(%rdi) -L(aligned_16_6bytes): - movl %ecx, -6(%rdi) - movw %cx, -2(%rdi) - ret - - ALIGN (4) -L(aligned_16_120bytes): - movdqa %xmm0, -120(%rdi) -L(aligned_16_104bytes): - movdqa %xmm0, -104(%rdi) -L(aligned_16_88bytes): - movdqa %xmm0, -88(%rdi) -L(aligned_16_72bytes): - movdqa %xmm0, -72(%rdi) -L(aligned_16_56bytes): - movdqa %xmm0, -56(%rdi) -L(aligned_16_40bytes): - movdqa %xmm0, -40(%rdi) -L(aligned_16_24bytes): - movdqa %xmm0, -24(%rdi) -L(aligned_16_8bytes): - movq %xmm0, -8(%rdi) - ret - - ALIGN (4) -L(aligned_16_122bytes): - movdqa %xmm0, -122(%rdi) -L(aligned_16_106bytes): - movdqa %xmm0, -106(%rdi) -L(aligned_16_90bytes): - movdqa %xmm0, -90(%rdi) -L(aligned_16_74bytes): - movdqa %xmm0, -74(%rdi) -L(aligned_16_58bytes): - movdqa %xmm0, -58(%rdi) -L(aligned_16_42bytes): - movdqa %xmm0, -42(%rdi) -L(aligned_16_26bytes): - movdqa %xmm0, -26(%rdi) -L(aligned_16_10bytes): - movq %xmm0, -10(%rdi) - movw %cx, -2(%rdi) - ret - - ALIGN (4) -L(aligned_16_124bytes): - movdqa %xmm0, -124(%rdi) -L(aligned_16_108bytes): - movdqa %xmm0, -108(%rdi) -L(aligned_16_92bytes): - movdqa %xmm0, -92(%rdi) -L(aligned_16_76bytes): - movdqa %xmm0, -76(%rdi) -L(aligned_16_60bytes): - movdqa %xmm0, -60(%rdi) -L(aligned_16_44bytes): - movdqa %xmm0, -44(%rdi) -L(aligned_16_28bytes): - movdqa %xmm0, -28(%rdi) -L(aligned_16_12bytes): - movq %xmm0, -12(%rdi) - movl %ecx, -4(%rdi) - ret - - ALIGN (4) -L(aligned_16_126bytes): - movdqa %xmm0, -126(%rdi) -L(aligned_16_110bytes): - movdqa %xmm0, -110(%rdi) -L(aligned_16_94bytes): - movdqa %xmm0, -94(%rdi) -L(aligned_16_78bytes): - movdqa %xmm0, -78(%rdi) -L(aligned_16_62bytes): - movdqa %xmm0, -62(%rdi) -L(aligned_16_46bytes): - movdqa %xmm0, -46(%rdi) -L(aligned_16_30bytes): - movdqa %xmm0, -30(%rdi) -L(aligned_16_14bytes): - movq %xmm0, -14(%rdi) - movl %ecx, -6(%rdi) - movw %cx, -2(%rdi) - ret - -END (MEMSET) diff --git a/libcutils/arch-x86_64/android_memset32.S b/libcutils/arch-x86_64/android_memset32.S deleted file mode 100644 index 1514aa2c8..000000000 --- a/libcutils/arch-x86_64/android_memset32.S +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright (C) 2014 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 "cache.h" - -#ifndef MEMSET -# define MEMSET android_memset32 -#endif - -#ifndef L -# define L(label) .L##label -#endif - -#ifndef ALIGN -# define ALIGN(n) .p2align n -#endif - -#ifndef cfi_startproc -# define cfi_startproc .cfi_startproc -#endif - -#ifndef cfi_endproc -# define cfi_endproc .cfi_endproc -#endif - -#ifndef ENTRY -# define ENTRY(name) \ - .type name, @function; \ - .globl name; \ - .p2align 4; \ -name: \ - cfi_startproc -#endif - -#ifndef END -# define END(name) \ - cfi_endproc; \ - .size name, .-name -#endif - -#define JMPTBL(I, B) I - B - -/* Branch to an entry in a jump table. TABLE is a jump table with - relative offsets. INDEX is a register contains the index into the - jump table. SCALE is the scale of INDEX. */ -#define BRANCH_TO_JMPTBL_ENTRY(TABLE, INDEX, SCALE) \ - lea TABLE(%rip), %r11; \ - movslq (%r11, INDEX, SCALE), INDEX; \ - lea (%r11, INDEX), INDEX; \ - jmp *INDEX - - .section .text.sse2,"ax",@progbits - ALIGN (4) -ENTRY (MEMSET) // Address in rdi - shr $2, %rdx // Count in rdx - movl %esi, %ecx // Pattern in ecx - - cmp $16, %rdx - jae L(16dbwordsormore) - -L(write_less16dbwords): - lea (%rdi, %rdx, 4), %rdi - BRANCH_TO_JMPTBL_ENTRY (L(table_less16dbwords), %rdx, 4) - - .pushsection .rodata.sse2,"a",@progbits - ALIGN (2) -L(table_less16dbwords): - .int JMPTBL (L(write_0dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_1dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_2dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_3dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_4dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_5dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_6dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_7dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_8dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_9dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_10dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_11dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_12dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_13dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_14dbwords), L(table_less16dbwords)) - .int JMPTBL (L(write_15dbwords), L(table_less16dbwords)) - .popsection - - ALIGN (4) -L(write_15dbwords): - movl %ecx, -60(%rdi) -L(write_14dbwords): - movl %ecx, -56(%rdi) -L(write_13dbwords): - movl %ecx, -52(%rdi) -L(write_12dbwords): - movl %ecx, -48(%rdi) -L(write_11dbwords): - movl %ecx, -44(%rdi) -L(write_10dbwords): - movl %ecx, -40(%rdi) -L(write_9dbwords): - movl %ecx, -36(%rdi) -L(write_8dbwords): - movl %ecx, -32(%rdi) -L(write_7dbwords): - movl %ecx, -28(%rdi) -L(write_6dbwords): - movl %ecx, -24(%rdi) -L(write_5dbwords): - movl %ecx, -20(%rdi) -L(write_4dbwords): - movl %ecx, -16(%rdi) -L(write_3dbwords): - movl %ecx, -12(%rdi) -L(write_2dbwords): - movl %ecx, -8(%rdi) -L(write_1dbwords): - movl %ecx, -4(%rdi) -L(write_0dbwords): - ret - - ALIGN (4) -L(16dbwordsormore): - test $3, %edi - jz L(aligned4bytes) - mov %ecx, (%rdi) - mov %ecx, -4(%rdi, %rdx, 4) - sub $1, %rdx - rol $24, %ecx - add $1, %rdi - test $3, %edi - jz L(aligned4bytes) - ror $8, %ecx - add $1, %rdi - test $3, %edi - jz L(aligned4bytes) - ror $8, %ecx - add $1, %rdi -L(aligned4bytes): - shl $2, %rdx - - /* Fill xmm0 with the pattern. */ - movd %ecx, %xmm0 - pshufd $0, %xmm0, %xmm0 - - testl $0xf, %edi - jz L(aligned_16) -/* RDX > 32 and RDI is not 16 byte aligned. */ - movdqu %xmm0, (%rdi) - mov %rdi, %rsi - and $-16, %rdi - add $16, %rdi - sub %rdi, %rsi - add %rsi, %rdx - - ALIGN (4) -L(aligned_16): - cmp $128, %rdx - jge L(128bytesormore) - -L(aligned_16_less128bytes): - add %rdx, %rdi - shr $2, %rdx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes), %rdx, 4) - - ALIGN (4) -L(128bytesormore): - cmp $SHARED_CACHE_SIZE, %rdx - jg L(128bytesormore_nt) - -L(128bytesormore_normal): - sub $128, %rdx - movdqa %xmm0, (%rdi) - movdqa %xmm0, 0x10(%rdi) - movdqa %xmm0, 0x20(%rdi) - movdqa %xmm0, 0x30(%rdi) - movdqa %xmm0, 0x40(%rdi) - movdqa %xmm0, 0x50(%rdi) - movdqa %xmm0, 0x60(%rdi) - movdqa %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jl L(128bytesless_normal) - - sub $128, %rdx - movdqa %xmm0, (%rdi) - movdqa %xmm0, 0x10(%rdi) - movdqa %xmm0, 0x20(%rdi) - movdqa %xmm0, 0x30(%rdi) - movdqa %xmm0, 0x40(%rdi) - movdqa %xmm0, 0x50(%rdi) - movdqa %xmm0, 0x60(%rdi) - movdqa %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jl L(128bytesless_normal) - - sub $128, %rdx - movdqa %xmm0, (%rdi) - movdqa %xmm0, 0x10(%rdi) - movdqa %xmm0, 0x20(%rdi) - movdqa %xmm0, 0x30(%rdi) - movdqa %xmm0, 0x40(%rdi) - movdqa %xmm0, 0x50(%rdi) - movdqa %xmm0, 0x60(%rdi) - movdqa %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jl L(128bytesless_normal) - - sub $128, %rdx - movdqa %xmm0, (%rdi) - movdqa %xmm0, 0x10(%rdi) - movdqa %xmm0, 0x20(%rdi) - movdqa %xmm0, 0x30(%rdi) - movdqa %xmm0, 0x40(%rdi) - movdqa %xmm0, 0x50(%rdi) - movdqa %xmm0, 0x60(%rdi) - movdqa %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jge L(128bytesormore_normal) - -L(128bytesless_normal): - add %rdx, %rdi - shr $2, %rdx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes), %rdx, 4) - - ALIGN (4) -L(128bytesormore_nt): - sub $128, %rdx - movntdq %xmm0, (%rdi) - movntdq %xmm0, 0x10(%rdi) - movntdq %xmm0, 0x20(%rdi) - movntdq %xmm0, 0x30(%rdi) - movntdq %xmm0, 0x40(%rdi) - movntdq %xmm0, 0x50(%rdi) - movntdq %xmm0, 0x60(%rdi) - movntdq %xmm0, 0x70(%rdi) - lea 128(%rdi), %rdi - cmp $128, %rdx - jge L(128bytesormore_nt) - - sfence - add %rdx, %rdi - shr $2, %rdx - BRANCH_TO_JMPTBL_ENTRY (L(table_16_128bytes), %rdx, 4) - - .pushsection .rodata.sse2,"a",@progbits - ALIGN (2) -L(table_16_128bytes): - .int JMPTBL (L(aligned_16_0bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_4bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_8bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_12bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_16bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_20bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_24bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_28bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_32bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_36bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_40bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_44bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_48bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_52bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_56bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_60bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_64bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_68bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_72bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_76bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_80bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_84bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_88bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_92bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_96bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_100bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_104bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_108bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_112bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_116bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_120bytes), L(table_16_128bytes)) - .int JMPTBL (L(aligned_16_124bytes), L(table_16_128bytes)) - .popsection - - ALIGN (4) -L(aligned_16_112bytes): - movdqa %xmm0, -112(%rdi) -L(aligned_16_96bytes): - movdqa %xmm0, -96(%rdi) -L(aligned_16_80bytes): - movdqa %xmm0, -80(%rdi) -L(aligned_16_64bytes): - movdqa %xmm0, -64(%rdi) -L(aligned_16_48bytes): - movdqa %xmm0, -48(%rdi) -L(aligned_16_32bytes): - movdqa %xmm0, -32(%rdi) -L(aligned_16_16bytes): - movdqa %xmm0, -16(%rdi) -L(aligned_16_0bytes): - ret - - ALIGN (4) -L(aligned_16_116bytes): - movdqa %xmm0, -116(%rdi) -L(aligned_16_100bytes): - movdqa %xmm0, -100(%rdi) -L(aligned_16_84bytes): - movdqa %xmm0, -84(%rdi) -L(aligned_16_68bytes): - movdqa %xmm0, -68(%rdi) -L(aligned_16_52bytes): - movdqa %xmm0, -52(%rdi) -L(aligned_16_36bytes): - movdqa %xmm0, -36(%rdi) -L(aligned_16_20bytes): - movdqa %xmm0, -20(%rdi) -L(aligned_16_4bytes): - movl %ecx, -4(%rdi) - ret - - ALIGN (4) -L(aligned_16_120bytes): - movdqa %xmm0, -120(%rdi) -L(aligned_16_104bytes): - movdqa %xmm0, -104(%rdi) -L(aligned_16_88bytes): - movdqa %xmm0, -88(%rdi) -L(aligned_16_72bytes): - movdqa %xmm0, -72(%rdi) -L(aligned_16_56bytes): - movdqa %xmm0, -56(%rdi) -L(aligned_16_40bytes): - movdqa %xmm0, -40(%rdi) -L(aligned_16_24bytes): - movdqa %xmm0, -24(%rdi) -L(aligned_16_8bytes): - movq %xmm0, -8(%rdi) - ret - - ALIGN (4) -L(aligned_16_124bytes): - movdqa %xmm0, -124(%rdi) -L(aligned_16_108bytes): - movdqa %xmm0, -108(%rdi) -L(aligned_16_92bytes): - movdqa %xmm0, -92(%rdi) -L(aligned_16_76bytes): - movdqa %xmm0, -76(%rdi) -L(aligned_16_60bytes): - movdqa %xmm0, -60(%rdi) -L(aligned_16_44bytes): - movdqa %xmm0, -44(%rdi) -L(aligned_16_28bytes): - movdqa %xmm0, -28(%rdi) -L(aligned_16_12bytes): - movq %xmm0, -12(%rdi) - movl %ecx, -4(%rdi) - ret - -END (MEMSET) diff --git a/libcutils/include/cutils/memory.h b/libcutils/include/cutils/memory.h index 4d2688255..c6476c138 100644 --- a/libcutils/include/cutils/memory.h +++ b/libcutils/include/cutils/memory.h @@ -14,8 +14,7 @@ * limitations under the License. */ -#ifndef ANDROID_CUTILS_MEMORY_H -#define ANDROID_CUTILS_MEMORY_H +#pragma once #include #include @@ -24,12 +23,6 @@ extern "C" { #endif -/* size is given in bytes and must be multiple of 2 */ -void android_memset16(uint16_t* dst, uint16_t value, size_t size); - -/* size is given in bytes and must be multiple of 4 */ -void android_memset32(uint32_t* dst, uint32_t value, size_t size); - #if defined(__GLIBC__) || defined(_WIN32) /* Declaration of strlcpy() for platforms that don't already have it. */ size_t strlcpy(char *dst, const char *src, size_t size); @@ -38,5 +31,3 @@ size_t strlcpy(char *dst, const char *src, size_t size); #ifdef __cplusplus } // extern "C" #endif - -#endif // ANDROID_CUTILS_MEMORY_H diff --git a/libcutils/memset_test.cpp b/libcutils/memset_test.cpp deleted file mode 100644 index a98485faa..000000000 --- a/libcutils/memset_test.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2014 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 -#include - -#include - -#include -#include - -#define FENCEPOST_LENGTH 8 - -#define MAX_TEST_SIZE (64*1024) -// Choose values that have no repeating byte values. -#define MEMSET16_PATTERN 0xb139 -#define MEMSET32_PATTERN 0x48193a27 - -enum test_e { - MEMSET16 = 0, - MEMSET32, -}; - -static int g_memset16_aligns[][2] = { - { 2, 0 }, - { 4, 0 }, - { 8, 0 }, - { 16, 0 }, - { 32, 0 }, - { 64, 0 }, - { 128, 0 }, - - { 4, 2 }, - - { 8, 2 }, - { 8, 4 }, - { 8, 6 }, - - { 128, 2 }, - { 128, 4 }, - { 128, 6 }, - { 128, 8 }, - { 128, 10 }, - { 128, 12 }, - { 128, 14 }, - { 128, 16 }, -}; - -static int g_memset32_aligns[][2] = { - { 4, 0 }, - { 8, 0 }, - { 16, 0 }, - { 32, 0 }, - { 64, 0 }, - { 128, 0 }, - - { 8, 4 }, - - { 128, 4 }, - { 128, 8 }, - { 128, 12 }, - { 128, 16 }, -}; - -static size_t GetIncrement(size_t len, size_t min_incr) { - if (len >= 4096) { - return 1024; - } else if (len >= 1024) { - return 256; - } - return min_incr; -} - -// Return a pointer into the current buffer with the specified alignment. -static void *GetAlignedPtr(void *orig_ptr, int alignment, int or_mask) { - uint64_t ptr = reinterpret_cast(orig_ptr); - if (alignment > 0) { - // When setting the alignment, set it to exactly the alignment chosen. - // The pointer returned will be guaranteed not to be aligned to anything - // more than that. - ptr += alignment - (ptr & (alignment - 1)); - ptr |= alignment | or_mask; - } - - return reinterpret_cast(ptr); -} - -static void SetFencepost(uint8_t *buffer) { - for (int i = 0; i < FENCEPOST_LENGTH; i += 2) { - buffer[i] = 0xde; - buffer[i+1] = 0xad; - } -} - -static void VerifyFencepost(uint8_t *buffer) { - for (int i = 0; i < FENCEPOST_LENGTH; i += 2) { - if (buffer[i] != 0xde || buffer[i+1] != 0xad) { - uint8_t expected_value; - if (buffer[i] == 0xde) { - i++; - expected_value = 0xad; - } else { - expected_value = 0xde; - } - ASSERT_EQ(expected_value, buffer[i]); - } - } -} - -void RunMemsetTests(test_e test_type, uint32_t value, int align[][2], size_t num_aligns) { - size_t min_incr = 4; - if (test_type == MEMSET16) { - min_incr = 2; - value |= value << 16; - } - std::unique_ptr expected_buf(new uint32_t[MAX_TEST_SIZE/sizeof(uint32_t)]); - for (size_t i = 0; i < MAX_TEST_SIZE/sizeof(uint32_t); i++) { - expected_buf[i] = value; - } - - // Allocate one large buffer with lots of extra space so that we can - // guarantee that all possible alignments will fit. - std::unique_ptr buf(new uint8_t[3*MAX_TEST_SIZE]); - uint8_t *buf_align; - for (size_t i = 0; i < num_aligns; i++) { - size_t incr = min_incr; - for (size_t len = incr; len <= MAX_TEST_SIZE; len += incr) { - incr = GetIncrement(len, min_incr); - - buf_align = reinterpret_cast(GetAlignedPtr( - buf.get()+FENCEPOST_LENGTH, align[i][0], align[i][1])); - - SetFencepost(&buf_align[-FENCEPOST_LENGTH]); - SetFencepost(&buf_align[len]); - - memset(buf_align, 0xff, len); - if (test_type == MEMSET16) { - android_memset16(reinterpret_cast(buf_align), value, len); - } else { - android_memset32(reinterpret_cast(buf_align), value, len); - } - ASSERT_EQ(0, memcmp(expected_buf.get(), buf_align, len)) - << "Failed size " << len << " align " << align[i][0] << " " << align[i][1] << "\n"; - - VerifyFencepost(&buf_align[-FENCEPOST_LENGTH]); - VerifyFencepost(&buf_align[len]); - } - } -} - -TEST(libcutils, android_memset16_non_zero) { - RunMemsetTests(MEMSET16, MEMSET16_PATTERN, g_memset16_aligns, sizeof(g_memset16_aligns)/sizeof(int[2])); -} - -TEST(libcutils, android_memset16_zero) { - RunMemsetTests(MEMSET16, 0, g_memset16_aligns, sizeof(g_memset16_aligns)/sizeof(int[2])); -} - -TEST(libcutils, android_memset32_non_zero) { - RunMemsetTests(MEMSET32, MEMSET32_PATTERN, g_memset32_aligns, sizeof(g_memset32_aligns)/sizeof(int[2])); -} - -TEST(libcutils, android_memset32_zero) { - RunMemsetTests(MEMSET32, 0, g_memset32_aligns, sizeof(g_memset32_aligns)/sizeof(int[2])); -} From 0ca5f8d0f1980f139b8bd919c8960393c201e133 Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Thu, 7 Nov 2019 14:10:32 -0800 Subject: [PATCH 033/388] Simplified stats_event.c; exposed getter methods Simplifications/changes: (1) We remove the bufPos field and track the end of the buffer using only the size field. (2) We rename put_() functions to append_() to signify that the value will be placed at the end of the buffer. We also move the increment of event->size to within the append_() functions; this improves readability of the write_() functions. (3) We immediately write the timestamp and atom id to the buffer in order to simplify stats_event_build(). (4) We never check for null pointers; checking for null pointers delays errors and obfuscates the root problem. (5) We change the the annotationId and numPairs parameters to be uint8_t's. This helps signify to clients that these values must fit in 1 byte. (6) Clients no longer have to pass in the length of strings. Instead, we expect them to pass in null-terminated strings, and we will calculate the length outselves using strnlen. Test: m -j libstatssocket Change-Id: I0173f8bc76ef25118379dce5d2481f5f7a9b7519 --- libstats/include/stats_event.h | 57 ++++--- libstats/stats_event.c | 298 +++++++++++++++------------------ 2 files changed, 165 insertions(+), 190 deletions(-) diff --git a/libstats/include/stats_event.h b/libstats/include/stats_event.h index 2811f52f4..89cb420bd 100644 --- a/libstats/include/stats_event.h +++ b/libstats/include/stats_event.h @@ -34,6 +34,7 @@ * stats_event_add_int32_annotation(event, 2, 128); * stats_event_write_float(event, 2.0); * + * stats_event_build(event); * stats_event_write(event); * stats_event_release(event); * @@ -43,11 +44,9 @@ * (b) set_atom_id() can be called anytime before stats_event_write(). * (c) add__annotation() calls apply to the previous field. * (d) If errors occur, stats_event_write() will write a bitmask of the errors to the socket. - * (e) Strings should be encoded using UTF8 and written using stats_event_write_string8(). + * (e) All strings should be encoded using UTF8. */ -struct stats_event; - /* ERRORS */ #define ERROR_NO_TIMESTAMP 0x1 #define ERROR_NO_ATOM_ID 0x2 @@ -60,6 +59,7 @@ struct stats_event; #define ERROR_TOO_MANY_ANNOTATIONS 0x100 #define ERROR_TOO_MANY_FIELDS 0x200 #define ERROR_INVALID_VALUE_TYPE 0x400 +#define ERROR_STRING_NOT_NULL_TERMINATED 0x800 /* TYPE IDS */ #define INT32_TYPE 0x00 @@ -74,28 +74,39 @@ struct stats_event; #define ATTRIBUTION_CHAIN_TYPE 0x09 #define ERROR_TYPE 0x0F +#ifdef __cplusplus +extern "C" { +#endif + +struct stats_event; + /* SYSTEM API */ struct stats_event* stats_event_obtain(); +// The build function can be called multiple times without error. If the event +// has been built before, this function is a no-op. +void stats_event_build(struct stats_event* event); void stats_event_write(struct stats_event* event); void stats_event_release(struct stats_event* event); -void stats_event_set_atom_id(struct stats_event* event, const uint32_t atomId); +void stats_event_set_atom_id(struct stats_event* event, uint32_t atomId); void stats_event_write_int32(struct stats_event* event, int32_t value); void stats_event_write_int64(struct stats_event* event, int64_t value); void stats_event_write_float(struct stats_event* event, float value); void stats_event_write_bool(struct stats_event* event, bool value); -void stats_event_write_byte_array(struct stats_event* event, uint8_t* buf, uint32_t numBytes); -void stats_event_write_string8(struct stats_event* event, char* buf, uint32_t numBytes); -void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, char** tags, - uint32_t* tagLengths, uint32_t numNodes); + +void stats_event_write_byte_array(struct stats_event* event, uint8_t* buf, size_t numBytes); + +// Buf must be null-terminated. +void stats_event_write_string8(struct stats_event* event, const char* buf); + +// Tags must be null-terminated. +void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, + const char** tags, uint8_t numNodes); /* key_value_pair struct can be constructed as follows: - * struct key_value_pair pair; - * pair.key = key; - * pair.typeId = STRING_TYPE; - * pair.stringValue = buf; - * pair.stringBytes = strlen(buf); + * struct key_value_pair pair = {.key = key, .valueType = STRING_TYPE, + * .stringValue = buf}; */ struct key_value_pair { int32_t key; @@ -104,23 +115,23 @@ struct key_value_pair { int32_t int32Value; int64_t int64Value; float floatValue; - struct { - char* stringValue; - uint32_t stringBytes; - }; + const char* stringValue; // must be null terminated }; }; -void stats_event_add_key_value_pairs(struct stats_event* event, struct key_value_pair* pairs, - uint32_t numPairs); +void stats_event_write_key_value_pairs(struct stats_event* event, struct key_value_pair* pairs, + uint8_t numPairs); -void stats_event_add_bool_annotation(struct stats_event* event, uint32_t annotationId, bool value); -void stats_event_add_int32_annotation(struct stats_event* event, uint32_t annotationId, +void stats_event_add_bool_annotation(struct stats_event* event, uint8_t annotationId, bool value); +void stats_event_add_int32_annotation(struct stats_event* event, uint8_t annotationId, int32_t value); +uint32_t stats_event_get_atom_id(struct stats_event* event); +uint8_t* stats_event_get_buffer(struct stats_event* event, size_t* size); uint32_t stats_event_get_errors(struct stats_event* event); -/* TESTING ONLY */ -void stats_event_set_timestamp_ns(struct stats_event* event, const uint64_t timestampNs); +#ifdef __cplusplus +} +#endif #endif // ANDROID_STATS_LOG_STATS_EVENT_H diff --git a/libstats/stats_event.c b/libstats/stats_event.c index 5e41d72a6..35081dc3f 100644 --- a/libstats/stats_event.c +++ b/libstats/stats_event.c @@ -20,8 +20,6 @@ #include #include "include/stats_event_list.h" -#define byte unsigned char - #define STATS_EVENT_TAG 1937006964 #define LOGGER_ENTRY_MAX_PAYLOAD 4068 // Max payload size is 4 bytes less as 4 bytes are reserved for stats_eventTag. @@ -30,9 +28,9 @@ /* POSITIONS */ #define POS_NUM_ELEMENTS 1 -#define POS_TIMESTAMP (POS_NUM_ELEMENTS + 1) -#define POS_ATOM_ID (POS_TIMESTAMP + sizeof(byte) + sizeof(uint64_t)) -#define POS_FIRST_FIELD (POS_ATOM_ID + sizeof(byte) + sizeof(uint32_t)) +#define POS_TIMESTAMP (POS_NUM_ELEMENTS + sizeof(uint8_t)) +#define POS_ATOM_ID (POS_TIMESTAMP + sizeof(uint8_t) + sizeof(uint64_t)) +#define POS_FIRST_FIELD (POS_ATOM_ID + sizeof(uint8_t) + sizeof(uint32_t)) /* LIMITS */ #define MAX_ANNOTATION_COUNT 15 @@ -41,16 +39,14 @@ // The stats_event struct holds the serialized encoding of an event // within a buf. Also includes other required fields. struct stats_event { - byte buf[MAX_EVENT_PAYLOAD]; - size_t bufPos; // current write position within the buf + uint8_t buf[MAX_EVENT_PAYLOAD]; size_t lastFieldPos; // location of last field within the buf - byte lastFieldType; // type of last field size_t size; // number of valid bytes within buffer uint32_t numElements; uint32_t atomId; - uint64_t timestampNs; uint32_t errors; uint32_t tag; + bool built; }; static int64_t get_elapsed_realtime_ns() { @@ -65,184 +61,184 @@ struct stats_event* stats_event_obtain() { memset(event->buf, 0, MAX_EVENT_PAYLOAD); event->buf[0] = OBJECT_TYPE; - - event->bufPos = POS_FIRST_FIELD; - event->lastFieldPos = 0; - event->lastFieldType = OBJECT_TYPE; - event->size = 0; - event->numElements = 0; event->atomId = 0; - event->timestampNs = get_elapsed_realtime_ns(); event->errors = 0; event->tag = STATS_EVENT_TAG; + event->built = false; + + // place the timestamp + uint64_t timestampNs = get_elapsed_realtime_ns(); + event->buf[POS_TIMESTAMP] = INT64_TYPE; + memcpy(&event->buf[POS_TIMESTAMP + sizeof(uint8_t)], ×tampNs, sizeof(timestampNs)); + + event->numElements = 1; + event->lastFieldPos = 0; // 0 since we haven't written a field yet + event->size = POS_FIRST_FIELD; + return event; } void stats_event_release(struct stats_event* event) { - free(event); // free is a no-op if event is NULL -} - -// Should only be used for testing -void stats_event_set_timestamp_ns(struct stats_event* event, uint64_t timestampNs) { - if (event) event->timestampNs = timestampNs; + free(event); } void stats_event_set_atom_id(struct stats_event* event, uint32_t atomId) { - if (event) event->atomId = atomId; + event->atomId = atomId; + event->buf[POS_ATOM_ID] = INT32_TYPE; + memcpy(&event->buf[POS_ATOM_ID + sizeof(uint8_t)], &atomId, sizeof(atomId)); + event->numElements++; } // Side-effect: modifies event->errors if the buffer would overflow static bool overflows(struct stats_event* event, size_t size) { - if (event->bufPos + size > MAX_EVENT_PAYLOAD) { + if (event->size + size > MAX_EVENT_PAYLOAD) { event->errors |= ERROR_OVERFLOW; return true; } return false; } -static size_t put_byte(struct stats_event* event, byte value) { +// Side-effect: all append functions increment event->size if there is +// sufficient space within the buffer to place the value +static void append_byte(struct stats_event* event, uint8_t value) { if (!overflows(event, sizeof(value))) { - event->buf[event->bufPos] = value; - return sizeof(byte); + event->buf[event->size] = value; + event->size += sizeof(value); } - return 0; } -static size_t put_bool(struct stats_event* event, bool value) { - return put_byte(event, (byte)value); +static void append_bool(struct stats_event* event, bool value) { + append_byte(event, (uint8_t)value); } -static size_t put_int32(struct stats_event* event, int32_t value) { +static void append_int32(struct stats_event* event, int32_t value) { if (!overflows(event, sizeof(value))) { - memcpy(&event->buf[event->bufPos], &value, sizeof(int32_t)); - return sizeof(int32_t); + memcpy(&event->buf[event->size], &value, sizeof(value)); + event->size += sizeof(value); } - return 0; } -static size_t put_int64(struct stats_event* event, int64_t value) { +static void append_int64(struct stats_event* event, int64_t value) { if (!overflows(event, sizeof(value))) { - memcpy(&event->buf[event->bufPos], &value, sizeof(int64_t)); - return sizeof(int64_t); + memcpy(&event->buf[event->size], &value, sizeof(value)); + event->size += sizeof(value); } - return 0; } -static size_t put_float(struct stats_event* event, float value) { +static void append_float(struct stats_event* event, float value) { if (!overflows(event, sizeof(value))) { - memcpy(&event->buf[event->bufPos], &value, sizeof(float)); - return sizeof(float); + memcpy(&event->buf[event->size], &value, sizeof(value)); + event->size += sizeof(float); } - return 0; } -static size_t put_byte_array(struct stats_event* event, void* buf, size_t size) { +static void append_byte_array(struct stats_event* event, uint8_t* buf, size_t size) { if (!overflows(event, size)) { - memcpy(&event->buf[event->bufPos], buf, size); - return size; + memcpy(&event->buf[event->size], buf, size); + event->size += size; } - return 0; } -static void start_field(struct stats_event* event, byte typeId) { - event->lastFieldPos = event->bufPos; - event->lastFieldType = typeId; - event->bufPos += put_byte(event, typeId); +// Side-effect: modifies event->errors if buf is not properly null-terminated +static void append_string(struct stats_event* event, const char* buf) { + size_t size = strnlen(buf, MAX_EVENT_PAYLOAD); + if (event->errors) { + event->errors |= ERROR_STRING_NOT_NULL_TERMINATED; + return; + } + + append_int32(event, size); + append_byte_array(event, (uint8_t*)buf, size); +} + +static void start_field(struct stats_event* event, uint8_t typeId) { + event->lastFieldPos = event->size; + append_byte(event, typeId); event->numElements++; } void stats_event_write_int32(struct stats_event* event, int32_t value) { - if (!event || event->errors) return; + if (event->errors) return; start_field(event, INT32_TYPE); - event->bufPos += put_int32(event, value); + append_int32(event, value); } void stats_event_write_int64(struct stats_event* event, int64_t value) { - if (!event || event->errors) return; + if (event->errors) return; start_field(event, INT64_TYPE); - event->bufPos += put_int64(event, value); + append_int64(event, value); } void stats_event_write_float(struct stats_event* event, float value) { - if (!event || event->errors) return; + if (event->errors) return; start_field(event, FLOAT_TYPE); - event->bufPos += put_float(event, value); + append_float(event, value); } void stats_event_write_bool(struct stats_event* event, bool value) { - if (!event || event->errors) return; + if (event->errors) return; start_field(event, BOOL_TYPE); - event->bufPos += put_bool(event, value); + append_bool(event, value); } -// Buf is assumed to be encoded using UTF8 -void stats_event_write_byte_array(struct stats_event* event, uint8_t* buf, uint32_t numBytes) { - if (!event || !buf || event->errors) return; +void stats_event_write_byte_array(struct stats_event* event, uint8_t* buf, size_t numBytes) { + if (event->errors) return; start_field(event, BYTE_ARRAY_TYPE); - event->bufPos += put_int32(event, numBytes); - event->bufPos += put_byte_array(event, buf, numBytes); + append_int32(event, numBytes); + append_byte_array(event, buf, numBytes); } // Buf is assumed to be encoded using UTF8 -void stats_event_write_string8(struct stats_event* event, char* buf, uint32_t numBytes) { - if (!event || !buf || event->errors) return; +void stats_event_write_string8(struct stats_event* event, const char* buf) { + if (event->errors) return; start_field(event, STRING_TYPE); - event->bufPos += put_int32(event, numBytes); - event->bufPos += put_byte_array(event, buf, numBytes); + append_string(event, buf); } // Tags are assumed to be encoded using UTF8 -void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, char** tags, - uint32_t* tagLengths, uint32_t numNodes) { - if (!event || event->errors) return; - if (numNodes > MAX_BYTE_VALUE) { - event->errors |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; - return; - } +void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, + const char** tags, uint8_t numNodes) { + if (numNodes > MAX_BYTE_VALUE) event->errors |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; + if (event->errors) return; start_field(event, ATTRIBUTION_CHAIN_TYPE); - event->bufPos += put_byte(event, (byte)numNodes); + append_byte(event, numNodes); - for (int i = 0; i < numNodes; i++) { - event->bufPos += put_int32(event, uids[i]); - event->bufPos += put_int32(event, tagLengths[i]); - event->bufPos += put_byte_array(event, tags[i], tagLengths[i]); + for (uint8_t i = 0; i < numNodes; i++) { + append_int32(event, uids[i]); + append_string(event, tags[i]); } } -void stats_event_add_key_value_pairs(struct stats_event* event, struct key_value_pair* pairs, - uint32_t numPairs) { - if (!event || event->errors) return; - if (numPairs > MAX_BYTE_VALUE) { - event->errors |= ERROR_TOO_MANY_KEY_VALUE_PAIRS; - return; - } +void stats_event_write_key_value_pairs(struct stats_event* event, struct key_value_pair* pairs, + uint8_t numPairs) { + if (numPairs > MAX_BYTE_VALUE) event->errors |= ERROR_TOO_MANY_KEY_VALUE_PAIRS; + if (event->errors) return; start_field(event, KEY_VALUE_PAIRS_TYPE); - event->bufPos += put_byte(event, (byte)numPairs); + append_byte(event, numPairs); - for (int i = 0; i < numPairs; i++) { - event->bufPos += put_int32(event, pairs[i].key); - event->bufPos += put_byte(event, pairs[i].valueType); + for (uint8_t i = 0; i < numPairs; i++) { + append_int32(event, pairs[i].key); + append_byte(event, pairs[i].valueType); switch (pairs[i].valueType) { case INT32_TYPE: - event->bufPos += put_int32(event, pairs[i].int32Value); + append_int32(event, pairs[i].int32Value); break; case INT64_TYPE: - event->bufPos += put_int64(event, pairs[i].int64Value); + append_int64(event, pairs[i].int64Value); break; case FLOAT_TYPE: - event->bufPos += put_float(event, pairs[i].floatValue); + append_float(event, pairs[i].floatValue); break; case STRING_TYPE: - event->bufPos += put_int32(event, pairs[i].stringBytes); - event->bufPos += put_byte_array(event, pairs[i].stringValue, pairs[i].stringBytes); + append_string(event, pairs[i].stringValue); break; default: event->errors |= ERROR_INVALID_VALUE_TYPE; @@ -251,28 +247,10 @@ void stats_event_add_key_value_pairs(struct stats_event* event, struct key_value } } -// Side-effect: modifies event->errors if annotation does not follow field -static bool does_annotation_follow_field(struct stats_event* event) { - if (event->lastFieldPos == 0) { - event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; - return false; - } - return true; -} - -// Side-effect: modifies event->errors if annotation id is too large -static bool is_valid_annotation_id(struct stats_event* event, uint32_t annotationId) { - if (annotationId > MAX_BYTE_VALUE) { - event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; - return false; - } - return true; -} - // Side-effect: modifies event->errors if field has too many annotations static void increment_annotation_count(struct stats_event* event) { - byte fieldType = event->buf[event->lastFieldPos] & 0x0F; - uint32_t oldAnnotationCount = event->buf[event->lastFieldPos] & 0xF0; + uint8_t fieldType = event->buf[event->lastFieldPos] & 0x0F; + uint32_t oldAnnotationCount = (event->buf[event->lastFieldPos] & 0xF0) >> 4; uint32_t newAnnotationCount = oldAnnotationCount + 1; if (newAnnotationCount > MAX_ANNOTATION_COUNT) { @@ -280,86 +258,72 @@ static void increment_annotation_count(struct stats_event* event) { return; } - event->buf[event->lastFieldPos] = (((byte)newAnnotationCount << 4) & 0xF0) | fieldType; + event->buf[event->lastFieldPos] = (((uint8_t)newAnnotationCount << 4) & 0xF0) | fieldType; } -void stats_event_add_bool_annotation(struct stats_event* event, uint32_t annotationId, bool value) { - if (!event || event->errors) return; - if (!does_annotation_follow_field(event)) return; - if (!is_valid_annotation_id(event, annotationId)) return; +void stats_event_add_bool_annotation(struct stats_event* event, uint8_t annotationId, bool value) { + if (event->lastFieldPos == 0) event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; + if (annotationId > MAX_BYTE_VALUE) event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; + if (event->errors) return; - event->bufPos += put_byte(event, (byte)annotationId); - event->bufPos += put_byte(event, BOOL_TYPE); - event->bufPos += put_bool(event, value); + append_byte(event, annotationId); + append_byte(event, BOOL_TYPE); + append_bool(event, value); increment_annotation_count(event); } -void stats_event_add_int32_annotation(struct stats_event* event, uint32_t annotationId, +void stats_event_add_int32_annotation(struct stats_event* event, uint8_t annotationId, int32_t value) { - if (!event || event->errors) return; - if (!does_annotation_follow_field(event)) return; - if (!is_valid_annotation_id(event, annotationId)) return; + if (event->lastFieldPos == 0) event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; + if (annotationId > MAX_BYTE_VALUE) event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; + if (event->errors) return; - event->bufPos += put_byte(event, (byte)annotationId); - event->bufPos += put_byte(event, INT32_TYPE); - event->bufPos += put_int32(event, value); + append_byte(event, annotationId); + append_byte(event, INT32_TYPE); + append_int32(event, value); increment_annotation_count(event); } +uint32_t stats_event_get_atom_id(struct stats_event* event) { + return event->atomId; +} + +uint8_t* stats_event_get_buffer(struct stats_event* event, size_t* size) { + if (size) *size = event->size; + return event->buf; +} + uint32_t stats_event_get_errors(struct stats_event* event) { return event->errors; } -static void build(struct stats_event* event) { - // store size before we modify bufPos - event->size = event->bufPos; +void stats_event_build(struct stats_event* event) { + if (event->built) return; - if (event->timestampNs == 0) { - event->errors |= ERROR_NO_TIMESTAMP; - } else { - // Don't use the write functions since they short-circuit if there was - // an error previously. We, regardless, want to know the timestamp and - // atomId. - event->bufPos = POS_TIMESTAMP; - event->bufPos += put_byte(event, INT64_TYPE); - event->bufPos += put_int64(event, event->timestampNs); - event->numElements++; - } - - if (event->atomId == 0) { - event->errors |= ERROR_NO_ATOM_ID; - } else { - event->bufPos = POS_ATOM_ID; - event->bufPos += put_byte(event, INT32_TYPE); - event->bufPos += put_int64(event, event->atomId); - event->numElements++; - } + if (event->atomId == 0) event->errors |= ERROR_NO_ATOM_ID; if (event->numElements > MAX_BYTE_VALUE) { event->errors |= ERROR_TOO_MANY_FIELDS; } else { - event->bufPos = POS_NUM_ELEMENTS; - put_byte(event, (byte)event->numElements); + event->buf[POS_NUM_ELEMENTS] = event->numElements; } - // If there are errors, rewrite buffer + // If there are errors, rewrite buffer. if (event->errors) { - event->bufPos = POS_NUM_ELEMENTS; - put_byte(event, (byte)3); - - event->bufPos = POS_FIRST_FIELD; - event->bufPos += put_byte(event, ERROR_TYPE); - event->bufPos += put_int32(event, event->errors); - event->size = event->bufPos; + event->buf[POS_NUM_ELEMENTS] = 3; + event->buf[POS_FIRST_FIELD] = ERROR_TYPE; + memcpy(&event->buf[POS_FIRST_FIELD + sizeof(uint8_t)], &event->errors, + sizeof(event->errors)); + event->size = POS_FIRST_FIELD + sizeof(uint8_t) + sizeof(uint32_t); } + + event->built = true; } void stats_event_write(struct stats_event* event) { - if (!event) return; + stats_event_build(event); - build(event); - - // prepare iovecs for write to statsd + // Prepare iovecs for write to statsd. struct iovec vecs[2]; vecs[0].iov_base = &event->tag; vecs[0].iov_len = sizeof(event->tag); From e283b30723719900c477d6a3700083ba958457c6 Mon Sep 17 00:00:00 2001 From: Thomas Joseph Avila Date: Fri, 22 Nov 2019 18:54:56 -0800 Subject: [PATCH 034/388] Exempt-From-Owner-Approval: Remove projects being moved into from system/core into system/memory The following directories are being moved into separate projects under system/memory: platform/system/memory/libion platform/system/memory/libmeminfo platform/system/memory/libmemtrack platform/system/memory/libmemunreachable platform/system/memory/lmkd Remove them from system/core. Bug: 141634854 --- libion/Android.bp | 29 - libion/OWNERS | 2 - libion/include/ion/ion.h | 56 - libion/ion.c | 234 - libion/ion_test.c | 289 - libion/kernel-headers/linux/ion.h | 78 - libion/kernel-headers/linux/ion_4.12.h | 50 - libion/kernel-headers/linux/ion_4.19.h | 67 - libion/kernel-headers/linux/ion_test.h | 38 - libion/original-kernel-headers/linux/ion.h | 196 - .../original-kernel-headers/linux/ion_4.12.h | 125 - .../original-kernel-headers/linux/ion_4.19.h | 170 - .../original-kernel-headers/linux/ion_test.h | 70 - libion/tests/Android.bp | 34 - libion/tests/allocate_test.cpp | 146 - libion/tests/exit_test.cpp | 227 - libion/tests/heap_query.cpp | 48 - libion/tests/invalid_values_test.cpp | 86 - libion/tests/ion_test_fixture.cpp | 40 - libion/tests/ion_test_fixture.h | 36 - libion/tests/map_test.cpp | 128 - libion/tests/modular_heap_check.cpp | 30 - libion/tests/system_heap.cpp | 44 - libmeminfo/.clang-format | 1 - libmeminfo/Android.bp | 85 - libmeminfo/OWNERS | 1 - libmeminfo/include/meminfo/meminfo.h | 82 - libmeminfo/include/meminfo/pageacct.h | 81 - libmeminfo/include/meminfo/procmeminfo.h | 133 - libmeminfo/include/meminfo/sysmeminfo.h | 101 - libmeminfo/libdmabufinfo/Android.bp | 56 - libmeminfo/libdmabufinfo/dmabufinfo.cpp | 265 - libmeminfo/libdmabufinfo/dmabufinfo_test.cpp | 489 - .../include/dmabufinfo/dmabufinfo.h | 113 - libmeminfo/libdmabufinfo/tools/Android.bp | 30 - .../libdmabufinfo/tools/dmabuf_dump.cpp | 266 - libmeminfo/libmeminfo_benchmark.cpp | 547 - libmeminfo/libmeminfo_test.cpp | 782 - libmeminfo/meminfo_private.h | 34 - libmeminfo/pageacct.cpp | 157 - libmeminfo/procmeminfo.cpp | 569 - libmeminfo/sysmeminfo.cpp | 239 - libmeminfo/testdata1/mm_stat | 1 - libmeminfo/testdata1/showmap_test.sh | 86 - libmeminfo/testdata1/smaps | 56297 ---------------- libmeminfo/testdata1/smaps_short | 122 - libmeminfo/testdata1/vmallocinfo | 1774 - libmeminfo/testdata2/mem_used_total | 1 - libmeminfo/tools/Android.bp | 90 - libmeminfo/tools/librank.cpp | 351 - libmeminfo/tools/procmem.cpp | 201 - libmeminfo/tools/procrank.cpp | 536 - libmeminfo/tools/showmap.cpp | 285 - libmeminfo/tools/wsstop.cpp | 219 - libmeminfo/vts/Android.bp | 33 - libmeminfo/vts/Android.mk | 22 - libmeminfo/vts/AndroidTest.xml | 30 - libmeminfo/vts/vts_meminfo_test.cpp | 31 - libmemtrack/.clang-format | 1 - libmemtrack/Android.bp | 39 - libmemtrack/OWNERS | 1 - libmemtrack/include/memtrack/memtrack.h | 136 - libmemtrack/memtrack.cpp | 173 - libmemtrack/memtrack_test.cpp | 97 - libmemunreachable/.clang-format | 1 - libmemunreachable/Allocator.cpp | 468 - libmemunreachable/Allocator.h | 218 - libmemunreachable/Android.bp | 120 - libmemunreachable/Binder.cpp | 80 - libmemunreachable/Binder.h | 28 - libmemunreachable/HeapWalker.cpp | 212 - libmemunreachable/HeapWalker.h | 148 - libmemunreachable/Leak.h | 60 - libmemunreachable/LeakFolding.cpp | 138 - libmemunreachable/LeakFolding.h | 100 - libmemunreachable/LeakPipe.cpp | 93 - libmemunreachable/LeakPipe.h | 194 - libmemunreachable/LinkedList.h | 63 - libmemunreachable/MemUnreachable.cpp | 564 - libmemunreachable/OWNERS | 2 - libmemunreachable/ProcessMappings.cpp | 59 - libmemunreachable/ProcessMappings.h | 47 - libmemunreachable/PtracerThread.cpp | 155 - libmemunreachable/PtracerThread.h | 55 - libmemunreachable/README.md | 92 - libmemunreachable/ScopedAlarm.h | 57 - libmemunreachable/ScopedDisableMalloc.h | 108 - libmemunreachable/ScopedPipe.h | 80 - libmemunreachable/ScopedSignalHandler.h | 95 - libmemunreachable/Semaphore.h | 60 - libmemunreachable/Tarjan.h | 138 - libmemunreachable/ThreadCapture.cpp | 367 - libmemunreachable/ThreadCapture.h | 58 - libmemunreachable/bionic.h | 35 - .../include/memunreachable/memunreachable.h | 93 - libmemunreachable/libmemunreachable.map | 13 - libmemunreachable/log.h | 57 - libmemunreachable/tests/Allocator_test.cpp | 176 - libmemunreachable/tests/AndroidTest.xml | 26 - libmemunreachable/tests/Binder_test.cpp | 168 - .../tests/DisableMalloc_test.cpp | 131 - libmemunreachable/tests/HeapWalker_test.cpp | 223 - libmemunreachable/tests/HostMallocStub.cpp | 21 - libmemunreachable/tests/LeakFolding_test.cpp | 431 - .../tests/MemUnreachable_test.cpp | 276 - .../tests/ThreadCapture_test.cpp | 351 - lmkd/Android.bp | 61 - lmkd/OWNERS | 1 - lmkd/README.md | 90 - lmkd/event.logtags | 38 - lmkd/include/liblmkd_utils.h | 62 - lmkd/include/lmkd.h | 206 - lmkd/liblmkd_utils.c | 87 - lmkd/libpsi/Android.bp | 22 - lmkd/libpsi/OWNERS | 1 - lmkd/libpsi/include/psi/psi.h | 68 - lmkd/libpsi/psi.c | 99 - lmkd/lmkd.c | 3026 - lmkd/lmkd.rc | 8 - lmkd/statslog.c | 432 - lmkd/statslog.h | 136 - lmkd/tests/Android.bp | 41 - lmkd/tests/lmkd_test.cpp | 374 - 123 files changed, 77393 deletions(-) delete mode 100644 libion/Android.bp delete mode 100644 libion/OWNERS delete mode 100644 libion/include/ion/ion.h delete mode 100644 libion/ion.c delete mode 100644 libion/ion_test.c delete mode 100644 libion/kernel-headers/linux/ion.h delete mode 100644 libion/kernel-headers/linux/ion_4.12.h delete mode 100644 libion/kernel-headers/linux/ion_4.19.h delete mode 100644 libion/kernel-headers/linux/ion_test.h delete mode 100644 libion/original-kernel-headers/linux/ion.h delete mode 100644 libion/original-kernel-headers/linux/ion_4.12.h delete mode 100644 libion/original-kernel-headers/linux/ion_4.19.h delete mode 100644 libion/original-kernel-headers/linux/ion_test.h delete mode 100644 libion/tests/Android.bp delete mode 100644 libion/tests/allocate_test.cpp delete mode 100644 libion/tests/exit_test.cpp delete mode 100644 libion/tests/heap_query.cpp delete mode 100644 libion/tests/invalid_values_test.cpp delete mode 100644 libion/tests/ion_test_fixture.cpp delete mode 100644 libion/tests/ion_test_fixture.h delete mode 100644 libion/tests/map_test.cpp delete mode 100644 libion/tests/modular_heap_check.cpp delete mode 100644 libion/tests/system_heap.cpp delete mode 120000 libmeminfo/.clang-format delete mode 100644 libmeminfo/Android.bp delete mode 100644 libmeminfo/OWNERS delete mode 100644 libmeminfo/include/meminfo/meminfo.h delete mode 100644 libmeminfo/include/meminfo/pageacct.h delete mode 100644 libmeminfo/include/meminfo/procmeminfo.h delete mode 100644 libmeminfo/include/meminfo/sysmeminfo.h delete mode 100644 libmeminfo/libdmabufinfo/Android.bp delete mode 100644 libmeminfo/libdmabufinfo/dmabufinfo.cpp delete mode 100644 libmeminfo/libdmabufinfo/dmabufinfo_test.cpp delete mode 100644 libmeminfo/libdmabufinfo/include/dmabufinfo/dmabufinfo.h delete mode 100644 libmeminfo/libdmabufinfo/tools/Android.bp delete mode 100644 libmeminfo/libdmabufinfo/tools/dmabuf_dump.cpp delete mode 100644 libmeminfo/libmeminfo_benchmark.cpp delete mode 100644 libmeminfo/libmeminfo_test.cpp delete mode 100644 libmeminfo/meminfo_private.h delete mode 100644 libmeminfo/pageacct.cpp delete mode 100644 libmeminfo/procmeminfo.cpp delete mode 100644 libmeminfo/sysmeminfo.cpp delete mode 100644 libmeminfo/testdata1/mm_stat delete mode 100755 libmeminfo/testdata1/showmap_test.sh delete mode 100644 libmeminfo/testdata1/smaps delete mode 100644 libmeminfo/testdata1/smaps_short delete mode 100644 libmeminfo/testdata1/vmallocinfo delete mode 100644 libmeminfo/testdata2/mem_used_total delete mode 100644 libmeminfo/tools/Android.bp delete mode 100644 libmeminfo/tools/librank.cpp delete mode 100644 libmeminfo/tools/procmem.cpp delete mode 100644 libmeminfo/tools/procrank.cpp delete mode 100644 libmeminfo/tools/showmap.cpp delete mode 100644 libmeminfo/tools/wsstop.cpp delete mode 100644 libmeminfo/vts/Android.bp delete mode 100644 libmeminfo/vts/Android.mk delete mode 100644 libmeminfo/vts/AndroidTest.xml delete mode 100644 libmeminfo/vts/vts_meminfo_test.cpp delete mode 120000 libmemtrack/.clang-format delete mode 100644 libmemtrack/Android.bp delete mode 100644 libmemtrack/OWNERS delete mode 100644 libmemtrack/include/memtrack/memtrack.h delete mode 100644 libmemtrack/memtrack.cpp delete mode 100644 libmemtrack/memtrack_test.cpp delete mode 120000 libmemunreachable/.clang-format delete mode 100644 libmemunreachable/Allocator.cpp delete mode 100644 libmemunreachable/Allocator.h delete mode 100644 libmemunreachable/Android.bp delete mode 100644 libmemunreachable/Binder.cpp delete mode 100644 libmemunreachable/Binder.h delete mode 100644 libmemunreachable/HeapWalker.cpp delete mode 100644 libmemunreachable/HeapWalker.h delete mode 100644 libmemunreachable/Leak.h delete mode 100644 libmemunreachable/LeakFolding.cpp delete mode 100644 libmemunreachable/LeakFolding.h delete mode 100644 libmemunreachable/LeakPipe.cpp delete mode 100644 libmemunreachable/LeakPipe.h delete mode 100644 libmemunreachable/LinkedList.h delete mode 100644 libmemunreachable/MemUnreachable.cpp delete mode 100644 libmemunreachable/OWNERS delete mode 100644 libmemunreachable/ProcessMappings.cpp delete mode 100644 libmemunreachable/ProcessMappings.h delete mode 100644 libmemunreachable/PtracerThread.cpp delete mode 100644 libmemunreachable/PtracerThread.h delete mode 100644 libmemunreachable/README.md delete mode 100644 libmemunreachable/ScopedAlarm.h delete mode 100644 libmemunreachable/ScopedDisableMalloc.h delete mode 100644 libmemunreachable/ScopedPipe.h delete mode 100644 libmemunreachable/ScopedSignalHandler.h delete mode 100644 libmemunreachable/Semaphore.h delete mode 100644 libmemunreachable/Tarjan.h delete mode 100644 libmemunreachable/ThreadCapture.cpp delete mode 100644 libmemunreachable/ThreadCapture.h delete mode 100644 libmemunreachable/bionic.h delete mode 100644 libmemunreachable/include/memunreachable/memunreachable.h delete mode 100644 libmemunreachable/libmemunreachable.map delete mode 100644 libmemunreachable/log.h delete mode 100644 libmemunreachable/tests/Allocator_test.cpp delete mode 100644 libmemunreachable/tests/AndroidTest.xml delete mode 100644 libmemunreachable/tests/Binder_test.cpp delete mode 100644 libmemunreachable/tests/DisableMalloc_test.cpp delete mode 100644 libmemunreachable/tests/HeapWalker_test.cpp delete mode 100644 libmemunreachable/tests/HostMallocStub.cpp delete mode 100644 libmemunreachable/tests/LeakFolding_test.cpp delete mode 100644 libmemunreachable/tests/MemUnreachable_test.cpp delete mode 100644 libmemunreachable/tests/ThreadCapture_test.cpp delete mode 100644 lmkd/Android.bp delete mode 100644 lmkd/OWNERS delete mode 100644 lmkd/README.md delete mode 100644 lmkd/event.logtags delete mode 100644 lmkd/include/liblmkd_utils.h delete mode 100644 lmkd/include/lmkd.h delete mode 100644 lmkd/liblmkd_utils.c delete mode 100644 lmkd/libpsi/Android.bp delete mode 100644 lmkd/libpsi/OWNERS delete mode 100644 lmkd/libpsi/include/psi/psi.h delete mode 100644 lmkd/libpsi/psi.c delete mode 100644 lmkd/lmkd.c delete mode 100644 lmkd/lmkd.rc delete mode 100644 lmkd/statslog.c delete mode 100644 lmkd/statslog.h delete mode 100644 lmkd/tests/Android.bp delete mode 100644 lmkd/tests/lmkd_test.cpp diff --git a/libion/Android.bp b/libion/Android.bp deleted file mode 100644 index 2f73d92ca..000000000 --- a/libion/Android.bp +++ /dev/null @@ -1,29 +0,0 @@ -cc_library { - name: "libion", - vendor_available: true, - vndk: { - enabled: true, - support_system_process: true, - }, - srcs: ["ion.c"], - shared_libs: ["liblog"], - local_include_dirs: [ - "include", - "kernel-headers", - ], - export_include_dirs: [ - "include", - "kernel-headers", - ], - cflags: ["-Werror"], -} - -cc_binary { - name: "iontest", - srcs: ["ion_test.c"], - static_libs: ["libion"], - shared_libs: ["liblog"], - cflags: ["-Werror"], -} - -subdirs = ["tests"] diff --git a/libion/OWNERS b/libion/OWNERS deleted file mode 100644 index 143ad2d0d..000000000 --- a/libion/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -sspatil@google.com -hridya@google.com diff --git a/libion/include/ion/ion.h b/libion/include/ion/ion.h deleted file mode 100644 index 1480bd965..000000000 --- a/libion/include/ion/ion.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ion.c - * - * Memory Allocator functions for ion - * - * Copyright 2011 Google, Inc - * - * 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 __SYS_CORE_ION_H -#define __SYS_CORE_ION_H - -#include -#include - -__BEGIN_DECLS - -struct ion_handle; - -int ion_open(); -int ion_close(int fd); -int ion_alloc(int fd, size_t len, size_t align, unsigned int heap_mask, - unsigned int flags, ion_user_handle_t *handle); -int ion_alloc_fd(int fd, size_t len, size_t align, unsigned int heap_mask, - unsigned int flags, int *handle_fd); -int ion_sync_fd(int fd, int handle_fd); -int ion_free(int fd, ion_user_handle_t handle); -int ion_map(int fd, ion_user_handle_t handle, size_t length, int prot, - int flags, off_t offset, unsigned char **ptr, int *map_fd); -int ion_share(int fd, ion_user_handle_t handle, int *share_fd); -int ion_import(int fd, int share_fd, ion_user_handle_t *handle); - -/** - * Add 4.12+ kernel ION interfaces here for forward compatibility - * This should be needed till the pre-4.12+ ION interfaces are backported. - */ -int ion_query_heap_cnt(int fd, int* cnt); -int ion_query_get_heaps(int fd, int cnt, void* buffers); - -int ion_is_legacy(int fd); -int ion_is_using_modular_heaps(int fd); - -__END_DECLS - -#endif /* __SYS_CORE_ION_H */ diff --git a/libion/ion.c b/libion/ion.c deleted file mode 100644 index 07b4caf33..000000000 --- a/libion/ion.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * ion.c - * - * Memory Allocator functions for ion - * - * Copyright 2011 Google, Inc - * - * 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 "ion" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -#define ION_ABI_VERSION_MODULAR_HEAPS 2 - -enum ion_version { ION_VERSION_UNKNOWN, ION_VERSION_MODERN, ION_VERSION_LEGACY }; - -static atomic_int g_ion_version = ATOMIC_VAR_INIT(ION_VERSION_UNKNOWN); - -int ion_is_legacy(int fd) { - int version = atomic_load_explicit(&g_ion_version, memory_order_acquire); - if (version == ION_VERSION_UNKNOWN) { - /** - * Check for FREE IOCTL here; it is available only in the old - * kernels, not the new ones. - */ - int err = ion_free(fd, (ion_user_handle_t)NULL); - version = (err == -ENOTTY) ? ION_VERSION_MODERN : ION_VERSION_LEGACY; - atomic_store_explicit(&g_ion_version, version, memory_order_release); - } - return version == ION_VERSION_LEGACY; -} - -int ion_open() { - int fd = open("/dev/ion", O_RDONLY | O_CLOEXEC); - if (fd < 0) ALOGE("open /dev/ion failed: %s", strerror(errno)); - - return fd; -} - -int ion_close(int fd) { - int ret = close(fd); - if (ret < 0) return -errno; - return ret; -} - -static int ion_ioctl(int fd, int req, void* arg) { - int ret = ioctl(fd, req, arg); - if (ret < 0) { - ALOGE("ioctl %x failed with code %d: %s", req, ret, strerror(errno)); - return -errno; - } - return ret; -} - -int ion_is_using_modular_heaps(int fd) { - int ion_abi_version = 0; - int ret = 0; - - ret = ion_ioctl(fd, ION_IOC_ABI_VERSION, &ion_abi_version); - return (ret == 0 && ion_abi_version >= ION_ABI_VERSION_MODULAR_HEAPS); -} - -int ion_alloc(int fd, size_t len, size_t align, unsigned int heap_mask, unsigned int flags, - ion_user_handle_t* handle) { - int ret = 0; - - if ((handle == NULL) || (!ion_is_legacy(fd))) return -EINVAL; - - struct ion_allocation_data data = { - .len = len, .align = align, .heap_id_mask = heap_mask, .flags = flags, - }; - - ret = ion_ioctl(fd, ION_IOC_ALLOC, &data); - if (ret < 0) return ret; - - *handle = data.handle; - - return ret; -} - -int ion_free(int fd, ion_user_handle_t handle) { - struct ion_handle_data data = { - .handle = handle, - }; - return ion_ioctl(fd, ION_IOC_FREE, &data); -} - -int ion_map(int fd, ion_user_handle_t handle, size_t length, int prot, int flags, off_t offset, - unsigned char** ptr, int* map_fd) { - if (!ion_is_legacy(fd)) return -EINVAL; - int ret; - unsigned char* tmp_ptr; - struct ion_fd_data data = { - .handle = handle, - }; - - if (map_fd == NULL) return -EINVAL; - if (ptr == NULL) return -EINVAL; - - ret = ion_ioctl(fd, ION_IOC_MAP, &data); - if (ret < 0) return ret; - if (data.fd < 0) { - ALOGE("map ioctl returned negative fd"); - return -EINVAL; - } - tmp_ptr = mmap(NULL, length, prot, flags, data.fd, offset); - if (tmp_ptr == MAP_FAILED) { - ALOGE("mmap failed: %s", strerror(errno)); - return -errno; - } - *map_fd = data.fd; - *ptr = tmp_ptr; - return ret; -} - -int ion_share(int fd, ion_user_handle_t handle, int* share_fd) { - int ret; - struct ion_fd_data data = { - .handle = handle, - }; - - if (!ion_is_legacy(fd)) return -EINVAL; - if (share_fd == NULL) return -EINVAL; - - ret = ion_ioctl(fd, ION_IOC_SHARE, &data); - if (ret < 0) return ret; - if (data.fd < 0) { - ALOGE("share ioctl returned negative fd"); - return -EINVAL; - } - *share_fd = data.fd; - return ret; -} - -int ion_alloc_fd(int fd, size_t len, size_t align, unsigned int heap_mask, unsigned int flags, - int* handle_fd) { - ion_user_handle_t handle; - int ret; - - if (!handle_fd) return -EINVAL; - - if (!ion_is_legacy(fd)) { - struct ion_new_allocation_data data = { - .len = len, - .heap_id_mask = heap_mask, - .flags = flags, - }; - - ret = ion_ioctl(fd, ION_IOC_NEW_ALLOC, &data); - if (ret < 0) return ret; - *handle_fd = data.fd; - } else { - ret = ion_alloc(fd, len, align, heap_mask, flags, &handle); - if (ret < 0) return ret; - ret = ion_share(fd, handle, handle_fd); - ion_free(fd, handle); - } - return ret; -} - -int ion_import(int fd, int share_fd, ion_user_handle_t* handle) { - int ret; - struct ion_fd_data data = { - .fd = share_fd, - }; - - if (!ion_is_legacy(fd)) return -EINVAL; - - if (handle == NULL) return -EINVAL; - - ret = ion_ioctl(fd, ION_IOC_IMPORT, &data); - if (ret < 0) return ret; - *handle = data.handle; - return ret; -} - -int ion_sync_fd(int fd, int handle_fd) { - struct ion_fd_data data = { - .fd = handle_fd, - }; - - if (!ion_is_legacy(fd)) return -EINVAL; - - return ion_ioctl(fd, ION_IOC_SYNC, &data); -} - -int ion_query_heap_cnt(int fd, int* cnt) { - int ret; - struct ion_heap_query query; - - if (!cnt) return -EINVAL; - memset(&query, 0, sizeof(query)); - - ret = ion_ioctl(fd, ION_IOC_HEAP_QUERY, &query); - if (ret < 0) return ret; - - *cnt = query.cnt; - return ret; -} - -int ion_query_get_heaps(int fd, int cnt, void* buffers) { - int ret; - struct ion_heap_query query = { - .cnt = cnt, .heaps = (uintptr_t)buffers, - }; - - ret = ion_ioctl(fd, ION_IOC_HEAP_QUERY, &query); - return ret; -} diff --git a/libion/ion_test.c b/libion/ion_test.c deleted file mode 100644 index f3874aefb..000000000 --- a/libion/ion_test.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright 2013 Google, Inc - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -size_t len = 1024*1024, align = 0; -int prot = PROT_READ | PROT_WRITE; -int map_flags = MAP_SHARED; -int alloc_flags = 0; -int heap_mask = 1; -int test = -1; -size_t stride; - -int _ion_alloc_test(int *fd, ion_user_handle_t *handle) -{ - int ret; - - *fd = ion_open(); - if (*fd < 0) - return *fd; - - ret = ion_alloc(*fd, len, align, heap_mask, alloc_flags, handle); - - if (ret) - printf("%s failed: %s\n", __func__, strerror(ret)); - return ret; -} - -void ion_alloc_test() -{ - int fd, ret; - ion_user_handle_t handle; - - if(_ion_alloc_test(&fd, &handle)) - return; - - ret = ion_free(fd, handle); - if (ret) { - printf("%s failed: %s %d\n", __func__, strerror(ret), handle); - return; - } - ion_close(fd); - printf("ion alloc test: passed\n"); -} - -void ion_map_test() -{ - int fd, map_fd, ret; - size_t i; - ion_user_handle_t handle; - unsigned char *ptr; - - if(_ion_alloc_test(&fd, &handle)) - return; - - ret = ion_map(fd, handle, len, prot, map_flags, 0, &ptr, &map_fd); - if (ret) - return; - - for (i = 0; i < len; i++) { - ptr[i] = (unsigned char)i; - } - for (i = 0; i < len; i++) - if (ptr[i] != (unsigned char)i) - printf("%s failed wrote %zu read %d from mapped " - "memory\n", __func__, i, ptr[i]); - /* clean up properly */ - ret = ion_free(fd, handle); - ion_close(fd); - munmap(ptr, len); - close(map_fd); - - _ion_alloc_test(&fd, &handle); - close(fd); - -#if 0 - munmap(ptr, len); - close(map_fd); - ion_close(fd); - - _ion_alloc_test(len, align, flags, &fd, &handle); - close(map_fd); - ret = ion_map(fd, handle, len, prot, flags, 0, &ptr, &map_fd); - /* don't clean up */ -#endif -} - -void ion_share_test() - -{ - ion_user_handle_t handle; - int sd[2]; - int num_fd = 1; - struct iovec count_vec = { - .iov_base = &num_fd, - .iov_len = sizeof num_fd, - }; - char buf[CMSG_SPACE(sizeof(int))]; - socketpair(AF_UNIX, SOCK_STREAM, 0, sd); - if (fork()) { - struct msghdr msg = { - .msg_control = buf, - .msg_controllen = sizeof buf, - .msg_iov = &count_vec, - .msg_iovlen = 1, - }; - - struct cmsghdr *cmsg; - int fd, share_fd, ret; - char *ptr; - /* parent */ - if(_ion_alloc_test(&fd, &handle)) - return; - ret = ion_share(fd, handle, &share_fd); - if (ret) - printf("share failed %s\n", strerror(errno)); - ptr = mmap(NULL, len, prot, map_flags, share_fd, 0); - if (ptr == MAP_FAILED) { - return; - } - strcpy(ptr, "master"); - cmsg = CMSG_FIRSTHDR(&msg); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - cmsg->cmsg_len = CMSG_LEN(sizeof(int)); - *(int *)CMSG_DATA(cmsg) = share_fd; - /* send the fd */ - printf("master? [%10s] should be [master]\n", ptr); - printf("master sending msg 1\n"); - sendmsg(sd[0], &msg, 0); - if (recvmsg(sd[0], &msg, 0) < 0) - perror("master recv msg 2"); - printf("master? [%10s] should be [child]\n", ptr); - - /* send ping */ - sendmsg(sd[0], &msg, 0); - printf("master->master? [%10s]\n", ptr); - if (recvmsg(sd[0], &msg, 0) < 0) - perror("master recv 1"); - close(fd); - _exit(0); - } else { - struct cmsghdr *cmsg; - char* ptr; - int fd, recv_fd; - char* child_buf[100]; - /* child */ - struct iovec count_vec = { - .iov_base = child_buf, - .iov_len = sizeof child_buf, - }; - - struct msghdr child_msg = { - .msg_control = buf, - .msg_controllen = sizeof buf, - .msg_iov = &count_vec, - .msg_iovlen = 1, - }; - - if (recvmsg(sd[1], &child_msg, 0) < 0) - perror("child recv msg 1"); - cmsg = CMSG_FIRSTHDR(&child_msg); - if (cmsg == NULL) { - printf("no cmsg rcvd in child"); - return; - } - recv_fd = *(int*)CMSG_DATA(cmsg); - if (recv_fd < 0) { - printf("could not get recv_fd from socket"); - return; - } - printf("child %d\n", recv_fd); - fd = ion_open(); - ptr = mmap(NULL, len, prot, map_flags, recv_fd, 0); - if (ptr == MAP_FAILED) { - return; - } - printf("child? [%10s] should be [master]\n", ptr); - strcpy(ptr, "child"); - printf("child sending msg 2\n"); - sendmsg(sd[1], &child_msg, 0); - close(fd); - } -} - -int main(int argc, char* argv[]) { - int c; - enum tests { - ALLOC_TEST = 0, MAP_TEST, SHARE_TEST, - }; - - while (1) { - static struct option opts[] = { - {"alloc", no_argument, 0, 'a'}, - {"alloc_flags", required_argument, 0, 'f'}, - {"heap_mask", required_argument, 0, 'h'}, - {"map", no_argument, 0, 'm'}, - {"share", no_argument, 0, 's'}, - {"len", required_argument, 0, 'l'}, - {"align", required_argument, 0, 'g'}, - {"map_flags", required_argument, 0, 'z'}, - {"prot", required_argument, 0, 'p'}, - }; - int i = 0; - c = getopt_long(argc, argv, "af:h:l:mr:st", opts, &i); - if (c == -1) - break; - - switch (c) { - case 'l': - len = atol(optarg); - break; - case 'g': - align = atol(optarg); - break; - case 'z': - map_flags = 0; - map_flags |= strstr(optarg, "PROT_EXEC") ? PROT_EXEC : 0; - map_flags |= strstr(optarg, "PROT_READ") ? PROT_READ: 0; - map_flags |= strstr(optarg, "PROT_WRITE") ? PROT_WRITE: 0; - map_flags |= strstr(optarg, "PROT_NONE") ? PROT_NONE: 0; - break; - case 'p': - prot = 0; - prot |= strstr(optarg, "MAP_PRIVATE") ? MAP_PRIVATE : 0; - prot |= strstr(optarg, "MAP_SHARED") ? MAP_SHARED : 0; - break; - case 'f': - alloc_flags = atol(optarg); - break; - case 'h': - heap_mask = atol(optarg); - break; - case 'a': - test = ALLOC_TEST; - break; - case 'm': - test = MAP_TEST; - break; - case 's': - test = SHARE_TEST; - break; - } - } - printf("test %d, len %zu, align %zu, map_flags %d, prot %d, heap_mask %d," - " alloc_flags %d\n", test, len, align, map_flags, prot, - heap_mask, alloc_flags); - switch (test) { - case ALLOC_TEST: - ion_alloc_test(); - break; - case MAP_TEST: - ion_map_test(); - break; - case SHARE_TEST: - ion_share_test(); - break; - default: - printf("must specify a test (alloc, map, share)\n"); - } - return 0; -} diff --git a/libion/kernel-headers/linux/ion.h b/libion/kernel-headers/linux/ion.h deleted file mode 100644 index 3c2808036..000000000 --- a/libion/kernel-headers/linux/ion.h +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** - **************************************************************************** - *** - *** This header was automatically generated from a Linux kernel header - *** of the same name, to make information necessary for userspace to - *** call into the kernel available to libc. It contains only constants, - *** structures, and macros generated from the original header, and thus, - *** contains no copyrightable information. - *** - *** To edit the content of this header, modify the corresponding - *** source file (e.g. under external/kernel-headers/original/) then - *** run bionic/libc/kernel/tools/update_all.py - *** - *** Any manual change here will be lost the next time this script will - *** be run. You've been warned! - *** - **************************************************************************** - ****************************************************************************/ -#ifndef _UAPI_LINUX_ION_H -#define _UAPI_LINUX_ION_H -#include -#include -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ -typedef int ion_user_handle_t; -enum ion_heap_type { - ION_HEAP_TYPE_SYSTEM, - ION_HEAP_TYPE_SYSTEM_CONTIG, -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ - ION_HEAP_TYPE_CARVEOUT, - ION_HEAP_TYPE_CHUNK, - ION_HEAP_TYPE_DMA, - ION_HEAP_TYPE_CUSTOM, -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ - ION_NUM_HEAPS = 16, -}; -#define ION_HEAP_SYSTEM_MASK (1 << ION_HEAP_TYPE_SYSTEM) -#define ION_HEAP_SYSTEM_CONTIG_MASK (1 << ION_HEAP_TYPE_SYSTEM_CONTIG) -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ -#define ION_HEAP_CARVEOUT_MASK (1 << ION_HEAP_TYPE_CARVEOUT) -#define ION_HEAP_TYPE_DMA_MASK (1 << ION_HEAP_TYPE_DMA) -#define ION_NUM_HEAP_IDS (sizeof(unsigned int) * 8) -#define ION_FLAG_CACHED 1 -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ -#define ION_FLAG_CACHED_NEEDS_SYNC 2 -struct ion_allocation_data { - size_t len; - size_t align; -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ - unsigned int heap_id_mask; - unsigned int flags; - ion_user_handle_t handle; -}; -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ -struct ion_fd_data { - ion_user_handle_t handle; - int fd; -}; -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ -struct ion_handle_data { - ion_user_handle_t handle; -}; -struct ion_custom_data { -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ - unsigned int cmd; - unsigned long arg; -}; -#define ION_IOC_MAGIC 'I' -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ -#define ION_IOC_ALLOC _IOWR(ION_IOC_MAGIC, 0, struct ion_allocation_data) -#define ION_IOC_FREE _IOWR(ION_IOC_MAGIC, 1, struct ion_handle_data) -#define ION_IOC_MAP _IOWR(ION_IOC_MAGIC, 2, struct ion_fd_data) -#define ION_IOC_SHARE _IOWR(ION_IOC_MAGIC, 4, struct ion_fd_data) -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ -#define ION_IOC_IMPORT _IOWR(ION_IOC_MAGIC, 5, struct ion_fd_data) -#define ION_IOC_SYNC _IOWR(ION_IOC_MAGIC, 7, struct ion_fd_data) -#define ION_IOC_CUSTOM _IOWR(ION_IOC_MAGIC, 6, struct ion_custom_data) -#endif -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ diff --git a/libion/kernel-headers/linux/ion_4.12.h b/libion/kernel-headers/linux/ion_4.12.h deleted file mode 100644 index 1af828491..000000000 --- a/libion/kernel-headers/linux/ion_4.12.h +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** - **************************************************************************** - *** - *** This header was automatically generated from a Linux kernel header - *** of the same name, to make information necessary for userspace to - *** call into the kernel available to libc. It contains only constants, - *** structures, and macros generated from the original header, and thus, - *** contains no copyrightable information. - *** - *** To edit the content of this header, modify the corresponding - *** source file (e.g. under external/kernel-headers/original/) then - *** run bionic/libc/kernel/tools/update_all.py - *** - *** Any manual change here will be lost the next time this script will - *** be run. You've been warned! - *** - **************************************************************************** - ****************************************************************************/ -#ifndef _UAPI_LINUX_ION_NEW_H -#define _UAPI_LINUX_ION_NEW_H -#include -#include -#define ION_NUM_HEAP_IDS (sizeof(unsigned int) * 8) -struct ion_new_allocation_data { - __u64 len; - __u32 heap_id_mask; - __u32 flags; - __u32 fd; - __u32 unused; -}; -#define MAX_HEAP_NAME 32 -struct ion_heap_data { - char name[MAX_HEAP_NAME]; - __u32 type; - __u32 heap_id; - __u32 reserved0; - __u32 reserved1; - __u32 reserved2; -}; -struct ion_heap_query { - __u32 cnt; - __u32 reserved0; - __u64 heaps; - __u32 reserved1; - __u32 reserved2; -}; -#define ION_IOC_MAGIC 'I' -#define ION_IOC_NEW_ALLOC _IOWR(ION_IOC_MAGIC, 0, struct ion_new_allocation_data) -#define ION_IOC_HEAP_QUERY _IOWR(ION_IOC_MAGIC, 8, struct ion_heap_query) -#endif diff --git a/libion/kernel-headers/linux/ion_4.19.h b/libion/kernel-headers/linux/ion_4.19.h deleted file mode 100644 index f5b59f1d7..000000000 --- a/libion/kernel-headers/linux/ion_4.19.h +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************************** - **************************************************************************** - *** - *** This header was automatically generated from a Linux kernel header - *** of the same name, to make information necessary for userspace to - *** call into the kernel available to libc. It contains only constants, - *** structures, and macros generated from the original header, and thus, - *** contains no copyrightable information. - *** - *** To edit the content of this header, modify the corresponding - *** source file (e.g. under external/kernel-headers/original/) then - *** run bionic/libc/kernel/tools/update_all.py - *** - *** Any manual change here will be lost the next time this script will - *** be run. You've been warned! - *** - **************************************************************************** - ****************************************************************************/ -#ifndef _UAPI_LINUX_ION_NEW_H -#define _UAPI_LINUX_ION_NEW_H -#include -#include -#define ION_NUM_HEAP_IDS (sizeof(unsigned int) * 8) -enum ion_heap_type_ext { - ION_HEAP_TYPE_CUSTOM_EXT = 16, - ION_HEAP_TYPE_MAX = 31, -}; -enum ion_heap_id { - ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM), - ION_HEAP_SYSTEM_CONTIG = (ION_HEAP_SYSTEM << 1), - ION_HEAP_CARVEOUT_START = (ION_HEAP_SYSTEM_CONTIG << 1), - ION_HEAP_CARVEOUT_END = (ION_HEAP_CARVEOUT_START << 4), - ION_HEAP_CHUNK = (ION_HEAP_CARVEOUT_END << 1), - ION_HEAP_DMA_START = (ION_HEAP_CHUNK << 1), - ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7), - ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1), - ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 15), -}; -#define ION_NUM_MAX_HEAPS (32) -struct ion_new_allocation_data { - __u64 len; - __u32 heap_id_mask; - __u32 flags; - __u32 fd; - __u32 unused; -}; -#define MAX_HEAP_NAME 32 -struct ion_heap_data { - char name[MAX_HEAP_NAME]; - __u32 type; - __u32 heap_id; - __u32 reserved0; - __u32 reserved1; - __u32 reserved2; -}; -struct ion_heap_query { - __u32 cnt; - __u32 reserved0; - __u64 heaps; - __u32 reserved1; - __u32 reserved2; -}; -#define ION_IOC_MAGIC 'I' -#define ION_IOC_NEW_ALLOC _IOWR(ION_IOC_MAGIC, 0, struct ion_new_allocation_data) -#define ION_IOC_HEAP_QUERY _IOWR(ION_IOC_MAGIC, 8, struct ion_heap_query) -#define ION_IOC_ABI_VERSION _IOR(ION_IOC_MAGIC, 9, __u32) -#endif diff --git a/libion/kernel-headers/linux/ion_test.h b/libion/kernel-headers/linux/ion_test.h deleted file mode 100644 index 6f3e2a7a2..000000000 --- a/libion/kernel-headers/linux/ion_test.h +++ /dev/null @@ -1,38 +0,0 @@ -/**************************************************************************** - **************************************************************************** - *** - *** This header was automatically generated from a Linux kernel header - *** of the same name, to make information necessary for userspace to - *** call into the kernel available to libc. It contains only constants, - *** structures, and macros generated from the original header, and thus, - *** contains no copyrightable information. - *** - *** To edit the content of this header, modify the corresponding - *** source file (e.g. under external/kernel-headers/original/) then - *** run bionic/libc/kernel/tools/update_all.py - *** - *** Any manual change here will be lost the next time this script will - *** be run. You've been warned! - *** - **************************************************************************** - ****************************************************************************/ -#ifndef _UAPI_LINUX_ION_TEST_H -#define _UAPI_LINUX_ION_TEST_H -#include -#include -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ -struct ion_test_rw_data { - __u64 ptr; - __u64 offset; - __u64 size; -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ - int write; - int __padding; -}; -#define ION_IOC_MAGIC 'I' -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ -#define ION_IOC_TEST_SET_FD _IO(ION_IOC_MAGIC, 0xf0) -#define ION_IOC_TEST_DMA_MAPPING _IOW(ION_IOC_MAGIC, 0xf1, struct ion_test_rw_data) -#define ION_IOC_TEST_KERNEL_MAPPING _IOW(ION_IOC_MAGIC, 0xf2, struct ion_test_rw_data) -#endif -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ diff --git a/libion/original-kernel-headers/linux/ion.h b/libion/original-kernel-headers/linux/ion.h deleted file mode 100644 index f09e7c154..000000000 --- a/libion/original-kernel-headers/linux/ion.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - * drivers/staging/android/uapi/ion.h - * - * Copyright (C) 2011 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _UAPI_LINUX_ION_H -#define _UAPI_LINUX_ION_H - -#include -#include - -typedef int ion_user_handle_t; - -/** - * enum ion_heap_types - list of all possible types of heaps - * @ION_HEAP_TYPE_SYSTEM: memory allocated via vmalloc - * @ION_HEAP_TYPE_SYSTEM_CONTIG: memory allocated via kmalloc - * @ION_HEAP_TYPE_CARVEOUT: memory allocated from a prereserved - * carveout heap, allocations are physically - * contiguous - * @ION_HEAP_TYPE_DMA: memory allocated via DMA API - * @ION_NUM_HEAPS: helper for iterating over heaps, a bit mask - * is used to identify the heaps, so only 32 - * total heap types are supported - */ -enum ion_heap_type { - ION_HEAP_TYPE_SYSTEM, - ION_HEAP_TYPE_SYSTEM_CONTIG, - ION_HEAP_TYPE_CARVEOUT, - ION_HEAP_TYPE_CHUNK, - ION_HEAP_TYPE_DMA, - ION_HEAP_TYPE_CUSTOM, /* must be last so device specific heaps always - are at the end of this enum */ - ION_NUM_HEAPS = 16, -}; - -#define ION_HEAP_SYSTEM_MASK (1 << ION_HEAP_TYPE_SYSTEM) -#define ION_HEAP_SYSTEM_CONTIG_MASK (1 << ION_HEAP_TYPE_SYSTEM_CONTIG) -#define ION_HEAP_CARVEOUT_MASK (1 << ION_HEAP_TYPE_CARVEOUT) -#define ION_HEAP_TYPE_DMA_MASK (1 << ION_HEAP_TYPE_DMA) - -#define ION_NUM_HEAP_IDS sizeof(unsigned int) * 8 - -/** - * allocation flags - the lower 16 bits are used by core ion, the upper 16 - * bits are reserved for use by the heaps themselves. - */ -#define ION_FLAG_CACHED 1 /* mappings of this buffer should be - cached, ion will do cache - maintenance when the buffer is - mapped for dma */ -#define ION_FLAG_CACHED_NEEDS_SYNC 2 /* mappings of this buffer will created - at mmap time, if this is set - caches must be managed manually */ - -/** - * DOC: Ion Userspace API - * - * create a client by opening /dev/ion - * most operations handled via following ioctls - * - */ - -/** - * struct ion_allocation_data - metadata passed from userspace for allocations - * @len: size of the allocation - * @align: required alignment of the allocation - * @heap_id_mask: mask of heap ids to allocate from - * @flags: flags passed to heap - * @handle: pointer that will be populated with a cookie to use to - * refer to this allocation - * - * Provided by userspace as an argument to the ioctl - */ -struct ion_allocation_data { - size_t len; - size_t align; - unsigned int heap_id_mask; - unsigned int flags; - ion_user_handle_t handle; -}; - -/** - * struct ion_fd_data - metadata passed to/from userspace for a handle/fd pair - * @handle: a handle - * @fd: a file descriptor representing that handle - * - * For ION_IOC_SHARE or ION_IOC_MAP userspace populates the handle field with - * the handle returned from ion alloc, and the kernel returns the file - * descriptor to share or map in the fd field. For ION_IOC_IMPORT, userspace - * provides the file descriptor and the kernel returns the handle. - */ -struct ion_fd_data { - ion_user_handle_t handle; - int fd; -}; - -/** - * struct ion_handle_data - a handle passed to/from the kernel - * @handle: a handle - */ -struct ion_handle_data { - ion_user_handle_t handle; -}; - -/** - * struct ion_custom_data - metadata passed to/from userspace for a custom ioctl - * @cmd: the custom ioctl function to call - * @arg: additional data to pass to the custom ioctl, typically a user - * pointer to a predefined structure - * - * This works just like the regular cmd and arg fields of an ioctl. - */ -struct ion_custom_data { - unsigned int cmd; - unsigned long arg; -}; - -#define ION_IOC_MAGIC 'I' - -/** - * DOC: ION_IOC_ALLOC - allocate memory - * - * Takes an ion_allocation_data struct and returns it with the handle field - * populated with the opaque handle for the allocation. - */ -#define ION_IOC_ALLOC _IOWR(ION_IOC_MAGIC, 0, \ - struct ion_allocation_data) - -/** - * DOC: ION_IOC_FREE - free memory - * - * Takes an ion_handle_data struct and frees the handle. - */ -#define ION_IOC_FREE _IOWR(ION_IOC_MAGIC, 1, struct ion_handle_data) - -/** - * DOC: ION_IOC_MAP - get a file descriptor to mmap - * - * Takes an ion_fd_data struct with the handle field populated with a valid - * opaque handle. Returns the struct with the fd field set to a file - * descriptor open in the current address space. This file descriptor - * can then be used as an argument to mmap. - */ -#define ION_IOC_MAP _IOWR(ION_IOC_MAGIC, 2, struct ion_fd_data) - -/** - * DOC: ION_IOC_SHARE - creates a file descriptor to use to share an allocation - * - * Takes an ion_fd_data struct with the handle field populated with a valid - * opaque handle. Returns the struct with the fd field set to a file - * descriptor open in the current address space. This file descriptor - * can then be passed to another process. The corresponding opaque handle can - * be retrieved via ION_IOC_IMPORT. - */ -#define ION_IOC_SHARE _IOWR(ION_IOC_MAGIC, 4, struct ion_fd_data) - -/** - * DOC: ION_IOC_IMPORT - imports a shared file descriptor - * - * Takes an ion_fd_data struct with the fd field populated with a valid file - * descriptor obtained from ION_IOC_SHARE and returns the struct with the handle - * filed set to the corresponding opaque handle. - */ -#define ION_IOC_IMPORT _IOWR(ION_IOC_MAGIC, 5, struct ion_fd_data) - -/** - * DOC: ION_IOC_SYNC - syncs a shared file descriptors to memory - * - * Deprecated in favor of using the dma_buf api's correctly (syncing - * will happend automatically when the buffer is mapped to a device). - * If necessary should be used after touching a cached buffer from the cpu, - * this will make the buffer in memory coherent. - */ -#define ION_IOC_SYNC _IOWR(ION_IOC_MAGIC, 7, struct ion_fd_data) - -/** - * DOC: ION_IOC_CUSTOM - call architecture specific ion ioctl - * - * Takes the argument of the architecture specific ioctl to call and - * passes appropriate userdata for that ioctl - */ -#define ION_IOC_CUSTOM _IOWR(ION_IOC_MAGIC, 6, struct ion_custom_data) - -#endif /* _UAPI_LINUX_ION_H */ diff --git a/libion/original-kernel-headers/linux/ion_4.12.h b/libion/original-kernel-headers/linux/ion_4.12.h deleted file mode 100644 index 6ae79d4e8..000000000 --- a/libion/original-kernel-headers/linux/ion_4.12.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Adapted from drivers/staging/android/uapi/ion.h - * - * Copyright (C) 2011 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _UAPI_LINUX_ION_NEW_H -#define _UAPI_LINUX_ION_NEW_H - -#include -#include - -#define ION_NUM_HEAP_IDS (sizeof(unsigned int) * 8) - -/** - * DOC: Ion Userspace API - * - * create a client by opening /dev/ion - * most operations handled via following ioctls - * - */ - -/** - * struct ion_new_allocation_data - metadata passed from userspace for allocations - * @len: size of the allocation - * @heap_id_mask: mask of heap ids to allocate from - * @flags: flags passed to heap - * @handle: pointer that will be populated with a cookie to use to - * refer to this allocation - * - * Provided by userspace as an argument to the ioctl - added _new to denote - * this belongs to the new ION interface. - */ -struct ion_new_allocation_data { - __u64 len; - __u32 heap_id_mask; - __u32 flags; - __u32 fd; - __u32 unused; -}; - -#define MAX_HEAP_NAME 32 - -/** - * struct ion_heap_data - data about a heap - * @name - first 32 characters of the heap name - * @type - heap type - * @heap_id - heap id for the heap - */ -struct ion_heap_data { - char name[MAX_HEAP_NAME]; - __u32 type; - __u32 heap_id; - __u32 reserved0; - __u32 reserved1; - __u32 reserved2; -}; - -/** - * struct ion_heap_query - collection of data about all heaps - * @cnt - total number of heaps to be copied - * @heaps - buffer to copy heap data - */ -struct ion_heap_query { - __u32 cnt; /* Total number of heaps to be copied */ - __u32 reserved0; /* align to 64bits */ - __u64 heaps; /* buffer to be populated */ - __u32 reserved1; - __u32 reserved2; -}; - -#define ION_IOC_MAGIC 'I' - -/** - * DOC: ION_IOC_NEW_ALLOC - allocate memory - * - * Takes an ion_allocation_data struct and returns it with the handle field - * populated with the opaque handle for the allocation. - * TODO: This IOCTL will clash by design; however, only one of - * ION_IOC_ALLOC or ION_IOC_NEW_ALLOC paths will be exercised, - * so this should not conflict. - */ -#define ION_IOC_NEW_ALLOC _IOWR(ION_IOC_MAGIC, 0, struct ion_new_allocation_data) - -/** - * DOC: ION_IOC_FREE - free memory - * - * Takes an ion_handle_data struct and frees the handle. - * - * #define ION_IOC_FREE _IOWR(ION_IOC_MAGIC, 1, struct ion_handle_data) - * This will come from the older kernels, so don't redefine here - */ - -/** - * DOC: ION_IOC_SHARE - creates a file descriptor to use to share an allocation - * - * Takes an ion_fd_data struct with the handle field populated with a valid - * opaque handle. Returns the struct with the fd field set to a file - * descriptor open in the current address space. This file descriptor - * can then be passed to another process. The corresponding opaque handle can - * be retrieved via ION_IOC_IMPORT. - * - * #define ION_IOC_SHARE _IOWR(ION_IOC_MAGIC, 4, struct ion_fd_data) - * This will come from the older kernels, so don't redefine here - */ - -/** - * DOC: ION_IOC_HEAP_QUERY - information about available heaps - * - * Takes an ion_heap_query structure and populates information about - * available Ion heaps. - */ -#define ION_IOC_HEAP_QUERY _IOWR(ION_IOC_MAGIC, 8, struct ion_heap_query) - -#endif /* _UAPI_LINUX_ION_NEW_H */ diff --git a/libion/original-kernel-headers/linux/ion_4.19.h b/libion/original-kernel-headers/linux/ion_4.19.h deleted file mode 100644 index 75fef39ba..000000000 --- a/libion/original-kernel-headers/linux/ion_4.19.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Adapted from drivers/staging/android/uapi/ion.h - * - * Copyright (C) 2019 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _UAPI_LINUX_ION_NEW_H -#define _UAPI_LINUX_ION_NEW_H - -#include -#include - -#define ION_NUM_HEAP_IDS (sizeof(unsigned int) * 8) - -enum ion_heap_type_ext { - ION_HEAP_TYPE_CUSTOM_EXT = 16, - ION_HEAP_TYPE_MAX = 31, -}; - -/** - * ion_heap_id - list of standard heap ids that Android can use - * - * @ION_HEAP_SYSTEM Id for the ION_HEAP_TYPE_SYSTEM - * @ION_HEAP_SYSTEM_CONTIG Id for the ION_HEAP_TYPE_SYSTEM_CONTIG - * @ION_HEAP_CHUNK Id for the ION_HEAP_TYPE_CHUNK - * @ION_HEAP_CARVEOUT_START Start of reserved id range for heaps of type - * ION_HEAP_TYPE_CARVEOUT - * @ION_HEAP_CARVEOUT_END End of reserved id range for heaps of type - * ION_HEAP_TYPE_CARVEOUT - * @ION_HEAP_DMA_START Start of reserved id range for heaps of type - * ION_HEAP_TYPE_DMA - * @ION_HEAP_DMA_END End of reserved id range for heaps of type - * ION_HEAP_TYPE_DMA - * @ION_HEAP_CUSTOM_START Start of reserved id range for heaps of custom - * type - * @ION_HEAP_CUSTOM_END End of reserved id range for heaps of custom - * type - */ -enum ion_heap_id { - ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM), - ION_HEAP_SYSTEM_CONTIG = (ION_HEAP_SYSTEM << 1), - ION_HEAP_CARVEOUT_START = (ION_HEAP_SYSTEM_CONTIG << 1), - ION_HEAP_CARVEOUT_END = (ION_HEAP_CARVEOUT_START << 4), - ION_HEAP_CHUNK = (ION_HEAP_CARVEOUT_END << 1), - ION_HEAP_DMA_START = (ION_HEAP_CHUNK << 1), - ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7), - ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1), - ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 15), -}; - -#define ION_NUM_MAX_HEAPS (32) - -/** - * DOC: Ion Userspace API - * - * create a client by opening /dev/ion - * most operations handled via following ioctls - * - */ - -/** - * struct ion_new_allocation_data - metadata passed from userspace for allocations - * @len: size of the allocation - * @heap_id_mask: mask of heap ids to allocate from - * @flags: flags passed to heap - * @handle: pointer that will be populated with a cookie to use to - * refer to this allocation - * - * Provided by userspace as an argument to the ioctl - added _new to denote - * this belongs to the new ION interface. - */ -struct ion_new_allocation_data { - __u64 len; - __u32 heap_id_mask; - __u32 flags; - __u32 fd; - __u32 unused; -}; - -#define MAX_HEAP_NAME 32 - -/** - * struct ion_heap_data - data about a heap - * @name - first 32 characters of the heap name - * @type - heap type - * @heap_id - heap id for the heap - */ -struct ion_heap_data { - char name[MAX_HEAP_NAME]; - __u32 type; - __u32 heap_id; - __u32 reserved0; - __u32 reserved1; - __u32 reserved2; -}; - -/** - * struct ion_heap_query - collection of data about all heaps - * @cnt - total number of heaps to be copied - * @heaps - buffer to copy heap data - */ -struct ion_heap_query { - __u32 cnt; /* Total number of heaps to be copied */ - __u32 reserved0; /* align to 64bits */ - __u64 heaps; /* buffer to be populated */ - __u32 reserved1; - __u32 reserved2; -}; - -#define ION_IOC_MAGIC 'I' - -/** - * DOC: ION_IOC_NEW_ALLOC - allocate memory - * - * Takes an ion_allocation_data struct and returns it with the handle field - * populated with the opaque handle for the allocation. - * TODO: This IOCTL will clash by design; however, only one of - * ION_IOC_ALLOC or ION_IOC_NEW_ALLOC paths will be exercised, - * so this should not conflict. - */ -#define ION_IOC_NEW_ALLOC _IOWR(ION_IOC_MAGIC, 0, struct ion_new_allocation_data) - -/** - * DOC: ION_IOC_FREE - free memory - * - * Takes an ion_handle_data struct and frees the handle. - * - * #define ION_IOC_FREE _IOWR(ION_IOC_MAGIC, 1, struct ion_handle_data) - * This will come from the older kernels, so don't redefine here - */ - -/** - * DOC: ION_IOC_SHARE - creates a file descriptor to use to share an allocation - * - * Takes an ion_fd_data struct with the handle field populated with a valid - * opaque handle. Returns the struct with the fd field set to a file - * descriptor open in the current address space. This file descriptor - * can then be passed to another process. The corresponding opaque handle can - * be retrieved via ION_IOC_IMPORT. - * - * #define ION_IOC_SHARE _IOWR(ION_IOC_MAGIC, 4, struct ion_fd_data) - * This will come from the older kernels, so don't redefine here - */ - -/** - * DOC: ION_IOC_HEAP_QUERY - information about available heaps - * - * Takes an ion_heap_query structure and populates information about - * available Ion heaps. - */ -#define ION_IOC_HEAP_QUERY _IOWR(ION_IOC_MAGIC, 8, struct ion_heap_query) - -/** - * DOC: ION_IOC_HEAP_ABI_VERSION - return ABI version - * - * Returns ABI version for this driver - */ -#define ION_IOC_ABI_VERSION _IOR(ION_IOC_MAGIC, 9, __u32) - -#endif /* _UAPI_LINUX_ION_NEW_H */ diff --git a/libion/original-kernel-headers/linux/ion_test.h b/libion/original-kernel-headers/linux/ion_test.h deleted file mode 100644 index ffef06f63..000000000 --- a/libion/original-kernel-headers/linux/ion_test.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * drivers/staging/android/uapi/ion.h - * - * Copyright (C) 2011 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _UAPI_LINUX_ION_TEST_H -#define _UAPI_LINUX_ION_TEST_H - -#include -#include - -/** - * struct ion_test_rw_data - metadata passed to the kernel to read handle - * @ptr: a pointer to an area at least as large as size - * @offset: offset into the ion buffer to start reading - * @size: size to read or write - * @write: 1 to write, 0 to read - */ -struct ion_test_rw_data { - __u64 ptr; - __u64 offset; - __u64 size; - int write; - int __padding; -}; - -#define ION_IOC_MAGIC 'I' - -/** - * DOC: ION_IOC_TEST_SET_DMA_BUF - attach a dma buf to the test driver - * - * Attaches a dma buf fd to the test driver. Passing a second fd or -1 will - * release the first fd. - */ -#define ION_IOC_TEST_SET_FD \ - _IO(ION_IOC_MAGIC, 0xf0) - -/** - * DOC: ION_IOC_TEST_DMA_MAPPING - read or write memory from a handle as DMA - * - * Reads or writes the memory from a handle using an uncached mapping. Can be - * used by unit tests to emulate a DMA engine as close as possible. Only - * expected to be used for debugging and testing, may not always be available. - */ -#define ION_IOC_TEST_DMA_MAPPING \ - _IOW(ION_IOC_MAGIC, 0xf1, struct ion_test_rw_data) - -/** - * DOC: ION_IOC_TEST_KERNEL_MAPPING - read or write memory from a handle - * - * Reads or writes the memory from a handle using a kernel mapping. Can be - * used by unit tests to test heap map_kernel functions. Only expected to be - * used for debugging and testing, may not always be available. - */ -#define ION_IOC_TEST_KERNEL_MAPPING \ - _IOW(ION_IOC_MAGIC, 0xf2, struct ion_test_rw_data) - - -#endif /* _UAPI_LINUX_ION_H */ diff --git a/libion/tests/Android.bp b/libion/tests/Android.bp deleted file mode 100644 index 989e0294c..000000000 --- a/libion/tests/Android.bp +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright (C) 2013 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: "ion-unit-tests", - cflags: [ - "-g", - "-Wno-missing-field-initializers", - ], - shared_libs: ["libion"], - srcs: [ - "allocate_test.cpp", - "exit_test.cpp", - "heap_query.cpp", - "system_heap.cpp", - "invalid_values_test.cpp", - "ion_test_fixture.cpp", - "map_test.cpp", - "modular_heap_check.cpp", - ], -} diff --git a/libion/tests/allocate_test.cpp b/libion/tests/allocate_test.cpp deleted file mode 100644 index 5ed01bbf4..000000000 --- a/libion/tests/allocate_test.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2013 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 -#include "ion_test_fixture.h" - -class Allocate : public IonTest {}; - -TEST_F(Allocate, Allocate) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - int fd; - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), 0, &fd)); - ASSERT_TRUE(fd != 0); - ASSERT_EQ(close(fd), 0); // free the buffer - } - } -} - -TEST_F(Allocate, AllocateCached) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - int fd; - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), ION_FLAG_CACHED, &fd)); - ASSERT_TRUE(fd != 0); - ASSERT_EQ(close(fd), 0); // free the buffer - } - } -} - -TEST_F(Allocate, AllocateCachedNeedsSync) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - int fd; - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), - ION_FLAG_CACHED_NEEDS_SYNC, &fd)); - ASSERT_TRUE(fd != 0); - ASSERT_EQ(close(fd), 0); // free the buffer - } - } -} - -TEST_F(Allocate, RepeatedAllocate) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - int fd; - - for (unsigned int i = 0; i < 1024; i++) { - SCOPED_TRACE(::testing::Message() << "iteration " << i); - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), 0, &fd)); - ASSERT_TRUE(fd != 0); - ASSERT_EQ(close(fd), 0); // free the buffer - } - } - } -} - -TEST_F(Allocate, Large) { - for (const auto& heap : ion_heaps) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - int fd; - ASSERT_EQ(-ENOMEM, - ion_alloc_fd(ionfd, 3UL * 1024 * 1024 * 1024, 0, (1 << heap.heap_id), 0, &fd)); - } -} - -// Make sure all heaps always return zeroed pages -TEST_F(Allocate, Zeroed) { - auto zeroes_ptr = std::make_unique(4096); - - for (const auto& heap : ion_heaps) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - int fds[16]; - for (unsigned int i = 0; i < 16; i++) { - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, 4096, 0, (1 << heap.heap_id), 0, &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr = NULL; - ptr = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - - memset(ptr, 0xaa, 4096); - - ASSERT_EQ(0, munmap(ptr, 4096)); - fds[i] = map_fd; - } - - for (unsigned int i = 0; i < 16; i++) { - ASSERT_EQ(0, close(fds[i])); - } - - int new_ionfd = ion_open(); - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(new_ionfd, 4096, 0, (1 << heap.heap_id), 0, &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr = NULL; - ptr = mmap(NULL, 4096, PROT_READ, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - - ASSERT_EQ(0, memcmp(ptr, zeroes_ptr.get(), 4096)); - - ASSERT_EQ(0, munmap(ptr, 4096)); - ASSERT_EQ(0, close(map_fd)); - ASSERT_EQ(0, ion_close(new_ionfd)); - } -} diff --git a/libion/tests/exit_test.cpp b/libion/tests/exit_test.cpp deleted file mode 100644 index f312389cc..000000000 --- a/libion/tests/exit_test.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (C) 2013 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 "ion_test_fixture.h" - -class Exit : public IonTest {}; - -TEST_F(Exit, WithAllocFd) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - EXPECT_EXIT( - { - int handle_fd = -1; - - ASSERT_EQ(0, - ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), 0, &handle_fd)); - ASSERT_NE(-1, handle_fd); - exit(0); - }, - ::testing::ExitedWithCode(0), ""); - } - } -} - -TEST_F(Exit, WithRepeatedAllocFd) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - for (unsigned int i = 0; i < 1024; i++) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - ASSERT_EXIT( - { - int handle_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), 0, - &handle_fd)); - ASSERT_NE(-1, handle_fd); - exit(0); - }, - ::testing::ExitedWithCode(0), "") - << "failed on heap " << heap.name << ":" << heap.type << ":" << heap.heap_id - << " and size " << size << " on iteration " << i; - } - } - } -} - -TEST_F(Exit, WithMapping) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - EXPECT_EXIT( - { - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), 0, &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr; - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - exit(0); - }, - ::testing::ExitedWithCode(0), ""); - } - } -} - -TEST_F(Exit, WithPartialMapping) { - static const size_t allocationSizes[] = {64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - EXPECT_EXIT( - { - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), 0, &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr; - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - - ASSERT_EQ(0, munmap(ptr, size / 2)); - exit(0); - }, - ::testing::ExitedWithCode(0), ""); - } - } -} - -TEST_F(Exit, WithMappingCached) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - EXPECT_EXIT( - { - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), - ION_FLAG_CACHED, &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr; - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - exit(0); - }, - ::testing::ExitedWithCode(0), ""); - } - } -} - -TEST_F(Exit, WithPartialMappingCached) { - static const size_t allocationSizes[] = {64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - EXPECT_EXIT( - { - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), - ION_FLAG_CACHED, &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr; - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - - ASSERT_EQ(0, munmap(ptr, size / 2)); - exit(0); - }, - ::testing::ExitedWithCode(0), ""); - } - } -} - -TEST_F(Exit, WithMappingNeedsSync) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - EXPECT_EXIT( - { - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), - ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC, - &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr; - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - exit(0); - }, - ::testing::ExitedWithCode(0), ""); - } - } -} - -TEST_F(Exit, WithPartialMappingNeedsSync) { - static const size_t allocationSizes[] = {64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - EXPECT_EXIT( - { - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), - ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC, - &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr; - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - - ASSERT_EQ(0, munmap(ptr, size / 2)); - exit(0); - }, - ::testing::ExitedWithCode(0), ""); - } - } -} diff --git a/libion/tests/heap_query.cpp b/libion/tests/heap_query.cpp deleted file mode 100644 index fed803038..000000000 --- a/libion/tests/heap_query.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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 - -#include -#include "ion_test_fixture.h" - -class HeapQuery : public IonTest {}; - -TEST_F(HeapQuery, AtleastOneHeap) { - ASSERT_GT(ion_heaps.size(), 0); -} - -// TODO: Adjust this test to account for the range of valid carveout and DMA heap ids. -TEST_F(HeapQuery, HeapIdVerify) { - for (const auto& heap : ion_heaps) { - SCOPED_TRACE(::testing::Message() << "Invalid id for heap:" << heap.name << ":" << heap.type - << ":" << heap.heap_id); - switch (heap.type) { - case ION_HEAP_TYPE_SYSTEM: - ASSERT_TRUE((1 << heap.heap_id) & ION_HEAP_SYSTEM_MASK); - break; - case ION_HEAP_TYPE_SYSTEM_CONTIG: - ASSERT_TRUE((1 << heap.heap_id) & ION_HEAP_SYSTEM_CONTIG_MASK); - break; - case ION_HEAP_TYPE_CARVEOUT: - ASSERT_TRUE((1 << heap.heap_id) & ION_HEAP_CARVEOUT_MASK); - break; - case ION_HEAP_TYPE_DMA: - ASSERT_TRUE((1 << heap.heap_id) & ION_HEAP_TYPE_DMA_MASK); - break; - } - } -} diff --git a/libion/tests/invalid_values_test.cpp b/libion/tests/invalid_values_test.cpp deleted file mode 100644 index 48fcd7273..000000000 --- a/libion/tests/invalid_values_test.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2013 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 - -#include -#include "ion_test_fixture.h" - -class InvalidValues : public IonTest {}; - -TEST_F(InvalidValues, ion_close) { - EXPECT_EQ(-EBADF, ion_close(-1)); -} - -TEST_F(InvalidValues, ion_alloc_fd) { - int fd; - // no heaps - EXPECT_EQ(-ENODEV, ion_alloc_fd(ionfd, 4096, 0, 0, 0, &fd)); - for (const auto& heap : ion_heaps) { - // invalid ion_fd - int ret = ion_alloc_fd(0, 4096, 0, (1 << heap.heap_id), 0, &fd); - EXPECT_TRUE(ret == -EINVAL || ret == -ENOTTY); - // invalid ion_fd - EXPECT_EQ(-EBADF, ion_alloc_fd(-1, 4096, 0, (1 << heap.heap_id), 0, &fd)); - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - // zero size - EXPECT_EQ(-EINVAL, ion_alloc_fd(ionfd, 0, 0, (1 << heap.heap_id), 0, &fd)); - // too large size - EXPECT_EQ(-EINVAL, ion_alloc_fd(ionfd, -1, 0, (1 << heap.heap_id), 0, &fd)); - // bad alignment - // TODO: Current userspace and kernel code completely ignores alignment. So this - // test is going to fail. We need to completely remove alignment from the API. - // All memory by default is always page aligned. OR actually pass the alignment - // down into the kernel and make kernel respect the alignment. - // EXPECT_EQ(-EINVAL, ion_alloc_fd(ionfd, 4096, -1, (1 << heap.heap_id), 0, &fd)); - - // NULL fd - EXPECT_EQ(-EINVAL, ion_alloc_fd(ionfd, 4096, 0, (1 << heap.heap_id), 0, nullptr)); - } -} - -TEST_F(InvalidValues, ion_query_heap_cnt) { - // NULL count - EXPECT_EQ(-EINVAL, ion_query_heap_cnt(ionfd, nullptr)); - - int heap_count; - // bad fd - EXPECT_EQ(-EBADF, ion_query_heap_cnt(-1, &heap_count)); -} - -TEST_F(InvalidValues, ion_query_get_heaps) { - int heap_count; - ASSERT_EQ(0, ion_query_heap_cnt(ionfd, &heap_count)); - ASSERT_GT(heap_count, 0); - - // nullptr buffers, still returns success but without - // the ion_heap_data. - EXPECT_EQ(0, ion_query_get_heaps(ionfd, heap_count, nullptr)); - - std::unique_ptr heaps = - std::make_unique(heap_count); - // bad fd - EXPECT_EQ(-EBADF, ion_query_get_heaps(-1, heap_count, heaps.get())); - - // invalid heap data pointer - EXPECT_EQ(-EFAULT, ion_query_get_heaps(ionfd, heap_count, reinterpret_cast(0xdeadf00d))); -} diff --git a/libion/tests/ion_test_fixture.cpp b/libion/tests/ion_test_fixture.cpp deleted file mode 100644 index 935fe5cb3..000000000 --- a/libion/tests/ion_test_fixture.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013 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 "ion_test_fixture.h" - -IonTest::IonTest() : ionfd(-1), ion_heaps() {} - -void IonTest::SetUp() { - ionfd = ion_open(); - ASSERT_GE(ionfd, 0); - - int heap_count; - int ret = ion_query_heap_cnt(ionfd, &heap_count); - ASSERT_EQ(ret, 0); - ASSERT_GT(heap_count, 0); - - ion_heaps.resize(heap_count, {}); - ret = ion_query_get_heaps(ionfd, heap_count, ion_heaps.data()); - ASSERT_EQ(ret, 0); -} - -void IonTest::TearDown() { - ion_close(ionfd); -} diff --git a/libion/tests/ion_test_fixture.h b/libion/tests/ion_test_fixture.h deleted file mode 100644 index c78fe41cc..000000000 --- a/libion/tests/ion_test_fixture.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2013 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 ION_TEST_FIXTURE_H_ -#define ION_TEST_FIXTURE_H_ - -#include -#include -#include - -using ::testing::Test; - -class IonTest : public virtual Test { - public: - IonTest(); - virtual ~IonTest(){}; - virtual void SetUp(); - virtual void TearDown(); - int ionfd; - std::vector ion_heaps; -}; - -#endif /* ION_TEST_FIXTURE_H_ */ diff --git a/libion/tests/map_test.cpp b/libion/tests/map_test.cpp deleted file mode 100644 index f1b47b783..000000000 --- a/libion/tests/map_test.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2013 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 -#include "ion_test_fixture.h" - -class Map : public IonTest {}; - -TEST_F(Map, MapFd) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), 0, &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr; - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - ASSERT_EQ(0, close(map_fd)); - - memset(ptr, 0xaa, size); - - ASSERT_EQ(0, munmap(ptr, size)); - } - } -} - -TEST_F(Map, MapOffset) { - for (const auto& heap : ion_heaps) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - int map_fd = -1; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, getpagesize() * 2, 0, (1 << heap.heap_id), 0, &map_fd)); - ASSERT_GE(map_fd, 0); - - unsigned char* ptr; - ptr = (unsigned char*)mmap(NULL, getpagesize() * 2, PROT_READ | PROT_WRITE, MAP_SHARED, - map_fd, 0); - ASSERT_TRUE(ptr != NULL); - - memset(ptr, 0, getpagesize()); - memset(ptr + getpagesize(), 0xaa, getpagesize()); - - ASSERT_EQ(0, munmap(ptr, getpagesize() * 2)); - - ptr = (unsigned char*)mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, - getpagesize()); - ASSERT_TRUE(ptr != NULL); - ASSERT_EQ(ptr[0], 0xaa); - ASSERT_EQ(ptr[getpagesize() - 1], 0xaa); - ASSERT_EQ(0, munmap(ptr, getpagesize())); - ASSERT_EQ(0, close(map_fd)); - } -} - -TEST_F(Map, MapCached) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - int map_fd = -1; - unsigned int flags = ION_FLAG_CACHED; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), flags, &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr; - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - ASSERT_EQ(0, close(map_fd)); - - memset(ptr, 0xaa, size); - - ASSERT_EQ(0, munmap(ptr, size)); - } - } -} - -TEST_F(Map, MapCachedNeedsSync) { - static const size_t allocationSizes[] = {4 * 1024, 64 * 1024, 1024 * 1024, 2 * 1024 * 1024}; - for (const auto& heap : ion_heaps) { - for (size_t size : allocationSizes) { - SCOPED_TRACE(::testing::Message() - << "heap:" << heap.name << ":" << heap.type << ":" << heap.heap_id); - SCOPED_TRACE(::testing::Message() << "size " << size); - int map_fd = -1; - unsigned int flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC; - - ASSERT_EQ(0, ion_alloc_fd(ionfd, size, 0, (1 << heap.heap_id), flags, &map_fd)); - ASSERT_GE(map_fd, 0); - - void* ptr; - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); - ASSERT_TRUE(ptr != NULL); - ASSERT_EQ(0, close(map_fd)); - - memset(ptr, 0xaa, size); - - ASSERT_EQ(0, munmap(ptr, size)); - } - } -} diff --git a/libion/tests/modular_heap_check.cpp b/libion/tests/modular_heap_check.cpp deleted file mode 100644 index 5505c5a65..000000000 --- a/libion/tests/modular_heap_check.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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 - -#include -#include "ion_test_fixture.h" - -class ModularHeapCheck : public IonTest {}; - -TEST_F(ModularHeapCheck, ModularHeapCheckSimple) { - if (ion_is_using_modular_heaps(ionfd)) { - std::cout << "Heaps are modular." << std::endl; - } else { - std::cout << "Heaps are built-in." << std::endl; - } -} diff --git a/libion/tests/system_heap.cpp b/libion/tests/system_heap.cpp deleted file mode 100644 index fb6388811..000000000 --- a/libion/tests/system_heap.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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 - -#include -#include - -#include -#include "ion_test_fixture.h" - -class SystemHeap : public IonTest {}; - -TEST_F(SystemHeap, Presence) { - bool system_heap_found = false; - for (const auto& heap : ion_heaps) { - if (heap.type == ION_HEAP_TYPE_SYSTEM) { - system_heap_found = true; - EXPECT_TRUE((1 << heap.heap_id) & ION_HEAP_SYSTEM_MASK); - } - } - // We now expect the system heap to exist from Android - ASSERT_TRUE(system_heap_found); -} - -TEST_F(SystemHeap, Allocate) { - int fd; - ASSERT_EQ(0, ion_alloc_fd(ionfd, getpagesize(), 0, ION_HEAP_SYSTEM_MASK, 0, &fd)); - ASSERT_TRUE(fd != 0); - ASSERT_EQ(close(fd), 0); // free the buffer -} diff --git a/libmeminfo/.clang-format b/libmeminfo/.clang-format deleted file mode 120000 index 1af4f51dd..000000000 --- a/libmeminfo/.clang-format +++ /dev/null @@ -1 +0,0 @@ -../.clang-format-4 \ No newline at end of file diff --git a/libmeminfo/Android.bp b/libmeminfo/Android.bp deleted file mode 100644 index 8dcc77b8b..000000000 --- a/libmeminfo/Android.bp +++ /dev/null @@ -1,85 +0,0 @@ -// -// 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_defaults { - name: "libmeminfo_defaults", - cflags: [ - "-Wall", - "-Werror", - ], - - shared_libs: [ - "libbase", - "liblog", - "libprocinfo", - ], - target: { - darwin: { - enabled: false, - }, - - }, -} - -cc_library { - name: "libmeminfo", - host_supported: true, - defaults: ["libmeminfo_defaults"], - export_include_dirs: ["include"], - export_shared_lib_headers: ["libbase"], - srcs: [ - "pageacct.cpp", - "procmeminfo.cpp", - "sysmeminfo.cpp", - ], -} - -cc_test { - name: "libmeminfo_test", - defaults: ["libmeminfo_defaults"], - - static_libs: [ - "libmeminfo", - "libbase", - "liblog", - ], - - srcs: [ - "libmeminfo_test.cpp" - ], - - data: [ - "testdata1/*", - "testdata2/*" - ], -} - -cc_benchmark { - name: "libmeminfo_benchmark", - srcs: [ - "libmeminfo_benchmark.cpp", - ], - static_libs : [ - "libbase", - "liblog", - "libmeminfo", - "libprocinfo", - ], - - data: [ - "testdata1/*", - ], -} diff --git a/libmeminfo/OWNERS b/libmeminfo/OWNERS deleted file mode 100644 index 26e71fe2d..000000000 --- a/libmeminfo/OWNERS +++ /dev/null @@ -1 +0,0 @@ -sspatil@google.com diff --git a/libmeminfo/include/meminfo/meminfo.h b/libmeminfo/include/meminfo/meminfo.h deleted file mode 100644 index 2fc78670a..000000000 --- a/libmeminfo/include/meminfo/meminfo.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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. - */ - -#pragma once - -#include -#include -#include - -#include -#include - -namespace android { -namespace meminfo { - -struct MemUsage { - uint64_t vss; - uint64_t rss; - uint64_t pss; - uint64_t uss; - - uint64_t swap; - uint64_t swap_pss; - - uint64_t private_clean; - uint64_t private_dirty; - uint64_t shared_clean; - uint64_t shared_dirty; - - MemUsage() - : vss(0), - rss(0), - pss(0), - uss(0), - swap(0), - swap_pss(0), - private_clean(0), - private_dirty(0), - shared_clean(0), - shared_dirty(0) {} - - ~MemUsage() = default; - - void clear() { - vss = rss = pss = uss = swap = swap_pss = 0; - private_clean = private_dirty = shared_clean = shared_dirty = 0; - } -}; - -struct Vma { - uint64_t start; - uint64_t end; - uint64_t offset; - uint16_t flags; - std::string name; - - Vma() : start(0), end(0), offset(0), flags(0), name("") {} - Vma(uint64_t s, uint64_t e, uint64_t off, uint16_t f, const char* n) - : start(s), end(e), offset(off), flags(f), name(n) {} - ~Vma() = default; - - void clear() { memset(&usage, 0, sizeof(usage)); } - - // Memory usage of this mapping. - MemUsage usage; -}; - -} // namespace meminfo -} // namespace android diff --git a/libmeminfo/include/meminfo/pageacct.h b/libmeminfo/include/meminfo/pageacct.h deleted file mode 100644 index 8483d8434..000000000 --- a/libmeminfo/include/meminfo/pageacct.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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. - */ - -#pragma once - -#include -#include - -#include -#include - -#include - -namespace android { -namespace meminfo { - -class PageAcct final { - // Class for per-page accounting by using kernel provided interfaces like - // kpagecount, kpageflags etc. - public: - static bool KernelHasPageIdle() { - return (access("/sys/kernel/mm/page_idle/bitmap", R_OK | W_OK) == 0); - } - - bool InitPageAcct(bool pageidle_enable = false); - bool PageFlags(uint64_t pfn, uint64_t* flags); - bool PageMapCount(uint64_t pfn, uint64_t* mapcount); - - int IsPageIdle(uint64_t pfn); - - // The only way to create PageAcct object - static PageAcct& Instance() { - static PageAcct instance; - return instance; - } - - ~PageAcct() = default; - - private: - PageAcct() : kpagecount_fd_(-1), kpageflags_fd_(-1), pageidle_fd_(-1) {} - int MarkPageIdle(uint64_t pfn) const; - int GetPageIdle(uint64_t pfn) const; - - // Non-copyable & Non-movable - PageAcct(const PageAcct&) = delete; - PageAcct& operator=(const PageAcct&) = delete; - PageAcct& operator=(PageAcct&&) = delete; - PageAcct(PageAcct&&) = delete; - - ::android::base::unique_fd kpagecount_fd_; - ::android::base::unique_fd kpageflags_fd_; - ::android::base::unique_fd pageidle_fd_; -}; - -// Returns if the page present bit is set in the value -// passed in. -bool page_present(uint64_t pagemap_val); - -// Returns if the page swapped bit is set in the value -// passed in. -bool page_swapped(uint64_t pagemap_val); - -// Returns the page frame number (physical page) from -// pagemap value -uint64_t page_pfn(uint64_t pagemap_val); - -} // namespace meminfo -} // namespace android diff --git a/libmeminfo/include/meminfo/procmeminfo.h b/libmeminfo/include/meminfo/procmeminfo.h deleted file mode 100644 index 8c1280ff3..000000000 --- a/libmeminfo/include/meminfo/procmeminfo.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * 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. - */ - -#pragma once - -#include - -#include -#include - -#include "meminfo.h" - -namespace android { -namespace meminfo { - -using VmaCallback = std::function; - -class ProcMemInfo final { - // Per-process memory accounting - public: - // Reset the working set accounting of the process via /proc//clear_refs - static bool ResetWorkingSet(pid_t pid); - - ProcMemInfo(pid_t pid, bool get_wss = false, uint64_t pgflags = 0, uint64_t pgflags_mask = 0); - - const std::vector& Maps(); - const MemUsage& Usage(); - const MemUsage& Wss(); - - // Same as Maps() except, only valid for reading working set using CONFIG_IDLE_PAGE_TRACKING - // support in kernel. If the kernel support doesn't exist, the function will return an empty - // vector. - const std::vector& MapsWithPageIdle(); - - // Same as Maps() except, do not read the usage stats for each map. - const std::vector& MapsWithoutUsageStats(); - - // If MapsWithoutUsageStats was called, this function will fill in - // usage stats for this single vma. - bool FillInVmaStats(Vma& vma); - - // Collect all 'vma' or 'maps' from /proc//smaps and store them in 'maps_'. Returns a - // constant reference to the vma vector after the collection is done. - // - // Each 'struct Vma' is *fully* populated by this method (unlike SmapsOrRollup). - const std::vector& Smaps(const std::string& path = ""); - - // This method reads /proc//smaps and calls the callback() for each - // vma or map that it finds. The map is converted to 'struct Vma' object which is then - // passed to the callback. - // Returns 'false' if the file is malformed. - bool ForEachVma(const VmaCallback& callback); - - // Used to parse either of /proc//{smaps, smaps_rollup} and record the process's - // Pss and Private memory usage in 'stats'. In particular, the method only populates the fields - // of the MemUsage structure that are intended to be used by Android's periodic Pss collection. - // - // The method populates the following statistics in order to be fast an efficient. - // Pss - // Rss - // Uss - // private_clean - // private_dirty - // SwapPss - // All other fields of MemUsage are zeroed. - bool SmapsOrRollup(MemUsage* stats) const; - - // Used to parse either of /proc//{smaps, smaps_rollup} and record the process's - // Pss. - // Returns 'true' on success and the value of Pss in the out parameter. - bool SmapsOrRollupPss(uint64_t* pss) const; - - const std::vector& SwapOffsets(); - - // Reads /proc//pagemap for this process for each page within - // the 'vma' and stores that in 'pagemap'. It is assumed that the 'vma' - // is obtained by calling Maps() or 'ForEachVma' for the same object. No special checks - // are made to see if 'vma' is *valid*. - // Returns false if anything goes wrong, 'true' otherwise. - bool PageMap(const Vma& vma, std::vector* pagemap); - - ~ProcMemInfo() = default; - - private: - bool ReadMaps(bool get_wss, bool use_pageidle = false, bool get_usage_stats = true); - bool ReadVmaStats(int pagemap_fd, Vma& vma, bool get_wss, bool use_pageidle); - - pid_t pid_; - bool get_wss_; - uint64_t pgflags_; - uint64_t pgflags_mask_; - - std::vector maps_; - - MemUsage usage_; - std::vector swap_offsets_; -}; - -// Makes callback for each 'vma' or 'map' found in file provided. The file is expected to be in the -// same format as /proc//smaps. Returns 'false' if the file is malformed. -bool ForEachVmaFromFile(const std::string& path, const VmaCallback& callback); - -// Returns if the kernel supports /proc//smaps_rollup. Assumes that the -// calling process has access to the /proc//smaps_rollup. -// Returns 'false' if the calling process has no permission to read the file if it exists -// of if the file doesn't exist. -bool IsSmapsRollupSupported(pid_t pid); - -// Same as ProcMemInfo::SmapsOrRollup but reads the statistics directly -// from a file. The file MUST be in the same format as /proc//smaps -// or /proc//smaps_rollup -bool SmapsOrRollupFromFile(const std::string& path, MemUsage* stats); - -// Same as ProcMemInfo::SmapsOrRollupPss but reads the statistics directly -// from a file and returns total Pss in kB. The file MUST be in the same format -// as /proc//smaps or /proc//smaps_rollup -bool SmapsOrRollupPssFromFile(const std::string& path, uint64_t* pss); - -} // namespace meminfo -} // namespace android diff --git a/libmeminfo/include/meminfo/sysmeminfo.h b/libmeminfo/include/meminfo/sysmeminfo.h deleted file mode 100644 index 4a5a18b57..000000000 --- a/libmeminfo/include/meminfo/sysmeminfo.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * 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. - */ - -#pragma once - -#include - -#include -#include -#include -#include -#include -#include - -namespace android { -namespace meminfo { - -class SysMemInfo final { - // System or Global memory accounting - public: - static constexpr const char kMemTotal[] = "MemTotal:"; - static constexpr const char kMemFree[] = "MemFree:"; - static constexpr const char kMemBuffers[] = "Buffers:"; - static constexpr const char kMemCached[] = "Cached:"; - static constexpr const char kMemShmem[] = "Shmem:"; - static constexpr const char kMemSlab[] = "Slab:"; - static constexpr const char kMemSReclaim[] = "SReclaimable:"; - static constexpr const char kMemSUnreclaim[] = "SUnreclaim:"; - static constexpr const char kMemSwapTotal[] = "SwapTotal:"; - static constexpr const char kMemSwapFree[] = "SwapFree:"; - static constexpr const char kMemMapped[] = "Mapped:"; - static constexpr const char kMemVmallocUsed[] = "VmallocUsed:"; - static constexpr const char kMemPageTables[] = "PageTables:"; - static constexpr const char kMemKernelStack[] = "KernelStack:"; - - static constexpr std::initializer_list kDefaultSysMemInfoTags = { - SysMemInfo::kMemTotal, SysMemInfo::kMemFree, SysMemInfo::kMemBuffers, - SysMemInfo::kMemCached, SysMemInfo::kMemShmem, SysMemInfo::kMemSlab, - SysMemInfo::kMemSReclaim, SysMemInfo::kMemSUnreclaim, SysMemInfo::kMemSwapTotal, - SysMemInfo::kMemSwapFree, SysMemInfo::kMemMapped, SysMemInfo::kMemVmallocUsed, - SysMemInfo::kMemPageTables, SysMemInfo::kMemKernelStack, - }; - - SysMemInfo() = default; - - // Parse /proc/meminfo and read values that are needed - bool ReadMemInfo(const char* path = "/proc/meminfo"); - bool ReadMemInfo(size_t ntags, const std::string_view* tags, uint64_t* out, - const char* path = "/proc/meminfo"); - bool ReadMemInfo(std::vector* out, const char* path = "/proc/meminfo"); - - // Parse /proc/vmallocinfo and return total physical memory mapped - // in vmalloc area by the kernel. - // Note that this deliberately ignores binder buffers. They are _always_ - // mapped in a process and are counted for in each process. - uint64_t ReadVmallocInfo(); - - // getters - uint64_t mem_total_kb() { return mem_in_kb_[kMemTotal]; } - uint64_t mem_free_kb() { return mem_in_kb_[kMemFree]; } - uint64_t mem_buffers_kb() { return mem_in_kb_[kMemBuffers]; } - uint64_t mem_cached_kb() { return mem_in_kb_[kMemCached]; } - uint64_t mem_shmem_kb() { return mem_in_kb_[kMemShmem]; } - uint64_t mem_slab_kb() { return mem_in_kb_[kMemSlab]; } - uint64_t mem_slab_reclaimable_kb() { return mem_in_kb_[kMemSReclaim]; } - uint64_t mem_slab_unreclaimable_kb() { return mem_in_kb_[kMemSUnreclaim]; } - uint64_t mem_swap_kb() { return mem_in_kb_[kMemSwapTotal]; } - uint64_t mem_swap_free_kb() { return mem_in_kb_[kMemSwapFree]; } - uint64_t mem_mapped_kb() { return mem_in_kb_[kMemMapped]; } - uint64_t mem_vmalloc_used_kb() { return mem_in_kb_[kMemVmallocUsed]; } - uint64_t mem_page_tables_kb() { return mem_in_kb_[kMemPageTables]; } - uint64_t mem_kernel_stack_kb() { return mem_in_kb_[kMemKernelStack]; } - uint64_t mem_zram_kb(const char* zram_dev = nullptr); - - private: - std::map mem_in_kb_; - bool MemZramDevice(const char* zram_dev, uint64_t* mem_zram_dev); - bool ReadMemInfo(const char* path, size_t ntags, const std::string_view* tags, - std::function store_val); -}; - -// Parse /proc/vmallocinfo and return total physical memory mapped -// in vmalloc area by the kernel. Note that this deliberately ignores binder buffers. They are -// _always_ mapped in a process and are counted for in each process. -uint64_t ReadVmallocInfo(const char* path = "/proc/vmallocinfo"); - -} // namespace meminfo -} // namespace android diff --git a/libmeminfo/libdmabufinfo/Android.bp b/libmeminfo/libdmabufinfo/Android.bp deleted file mode 100644 index 4aed45c8c..000000000 --- a/libmeminfo/libdmabufinfo/Android.bp +++ /dev/null @@ -1,56 +0,0 @@ -// -// 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_defaults { - name: "dmabufinfo_defaults", - static_libs: [ - "libbase", - "libprocinfo", - ], - shared_libs: [ - "liblog", - ], - - cflags: [ - "-Wall", - "-Werror", - "-Wextra", - ], -} - -cc_library_static { - name: "libdmabufinfo", - vendor_available: true, - defaults: ["dmabufinfo_defaults"], - export_include_dirs: ["include"], - srcs: [ - "dmabufinfo.cpp", - ], -} - -cc_test { - name: "dmabufinfo_test", - defaults: ["dmabufinfo_defaults"], - srcs: [ - "dmabufinfo_test.cpp" - ], - - static_libs: [ - "libc++fs", - "libdmabufinfo", - "libion", - "libmeminfo", - ], -} diff --git a/libmeminfo/libdmabufinfo/dmabufinfo.cpp b/libmeminfo/libdmabufinfo/dmabufinfo.cpp deleted file mode 100644 index 9fb22a192..000000000 --- a/libmeminfo/libdmabufinfo/dmabufinfo.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -namespace android { -namespace dmabufinfo { - -static bool FileIsDmaBuf(const std::string& path) { - return ::android::base::StartsWith(path, "/dmabuf"); -} - -static bool ReadDmaBufFdInfo(pid_t pid, int fd, std::string* name, std::string* exporter, - uint64_t* count) { - std::string fdinfo = ::android::base::StringPrintf("/proc/%d/fdinfo/%d", pid, fd); - auto fp = std::unique_ptr{fopen(fdinfo.c_str(), "re"), fclose}; - if (fp == nullptr) { - LOG(ERROR) << "Failed to open dmabuf info from debugfs"; - return false; - } - - char* line = nullptr; - size_t len = 0; - while (getline(&line, &len, fp.get()) > 0) { - switch (line[0]) { - case 'c': - if (strncmp(line, "count:", 6) == 0) { - char* c = line + 6; - *count = strtoull(c, nullptr, 10); - } - break; - case 'e': - if (strncmp(line, "exp_name:", 9) == 0) { - char* c = line + 9; - *exporter = ::android::base::Trim(c); - } - break; - case 'n': - if (strncmp(line, "name:", 5) == 0) { - char* c = line + 5; - *name = ::android::base::Trim(std::string(c)); - } - break; - } - } - - free(line); - return true; -} - -// TODO: std::filesystem::is_symlink fails to link on vendor code, -// forcing this workaround. -// Move back to libc++fs once it is vendor-available. See b/124012728 -static bool is_symlink(const char *filename) -{ - struct stat p_statbuf; - if (lstat(filename, &p_statbuf) < 0) { - return false; - } - if (S_ISLNK(p_statbuf.st_mode) == 1) { - return true; - } - return false; -} - -static bool ReadDmaBufFdRefs(pid_t pid, std::vector* dmabufs) { - std::string fdpath = ::android::base::StringPrintf("/proc/%d/fd", pid); - - std::unique_ptr dir(opendir(fdpath.c_str()), closedir); - if (!dir) { - LOG(ERROR) << "Failed to open " << fdpath << " directory" << std::endl; - return false; - } - struct dirent* dent; - while ((dent = readdir(dir.get()))) { - std::string path = - ::android::base::StringPrintf("%s/%s", fdpath.c_str(), dent->d_name); - - if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..") || - !is_symlink(path.c_str())) { - continue; - } - - std::string target; - if (!::android::base::Readlink(path, &target)) { - LOG(ERROR) << "Failed to find target for symlink: " << path; - return false; - } - - if (!FileIsDmaBuf(target)) { - continue; - } - - int fd; - if (!::android::base::ParseInt(dent->d_name, &fd)) { - LOG(ERROR) << "Dmabuf fd: " << path << " is invalid"; - return false; - } - - // Set defaults in case the kernel doesn't give us the information - // we need in fdinfo - std::string name = ""; - std::string exporter = ""; - uint64_t count = 0; - if (!ReadDmaBufFdInfo(pid, fd, &name, &exporter, &count)) { - LOG(ERROR) << "Failed to read fdinfo for: " << path; - return false; - } - - struct stat sb; - if (stat(path.c_str(), &sb) < 0) { - PLOG(ERROR) << "Failed to stat: " << path; - return false; - } - - uint64_t inode = sb.st_ino; - auto buf = std::find_if(dmabufs->begin(), dmabufs->end(), - [&inode](const DmaBuffer& dbuf) { return dbuf.inode() == inode; }); - if (buf != dmabufs->end()) { - if (buf->name() == "" || buf->name() == "") buf->SetName(name); - if (buf->exporter() == "" || buf->exporter() == "") buf->SetExporter(exporter); - if (buf->count() == 0) buf->SetCount(count); - buf->AddFdRef(pid); - continue; - } - - DmaBuffer& db = dmabufs->emplace_back(sb.st_ino, sb.st_blocks * 512, count, exporter, name); - db.AddFdRef(pid); - } - - return true; -} - -static bool ReadDmaBufMapRefs(pid_t pid, std::vector* dmabufs) { - std::string mapspath = ::android::base::StringPrintf("/proc/%d/maps", pid); - auto fp = std::unique_ptr{fopen(mapspath.c_str(), "re"), fclose}; - if (fp == nullptr) { - LOG(ERROR) << "Failed to open maps for pid: " << pid; - return false; - } - - char* line = nullptr; - size_t len = 0; - - // Process the map if it is dmabuf. Add map reference to existing object in 'dmabufs' - // if it was already found. If it wasn't create a new one and append it to 'dmabufs' - auto account_dmabuf = [&](uint64_t start, uint64_t end, uint16_t /* flags */, - uint64_t /* pgoff */, ino_t inode, const char* name) { - // no need to look into this mapping if it is not dmabuf - if (!FileIsDmaBuf(std::string(name))) { - return; - } - - auto buf = std::find_if(dmabufs->begin(), dmabufs->end(), - [&inode](const DmaBuffer& dbuf) { return dbuf.inode() == inode; }); - if (buf != dmabufs->end()) { - buf->AddMapRef(pid); - return; - } - - // We have a new buffer, but unknown count and name - DmaBuffer& dbuf = dmabufs->emplace_back(inode, end - start, 0, "", ""); - dbuf.AddMapRef(pid); - }; - - while (getline(&line, &len, fp.get()) > 0) { - if (!::android::procinfo::ReadMapFileContent(line, account_dmabuf)) { - LOG(ERROR) << "Failed t parse maps for pid: " << pid; - return false; - } - } - - free(line); - return true; -} - -// Public methods -bool ReadDmaBufInfo(std::vector* dmabufs, const std::string& path) { - auto fp = std::unique_ptr{fopen(path.c_str(), "re"), fclose}; - if (fp == nullptr) { - LOG(ERROR) << "Failed to open dmabuf info from debugfs"; - return false; - } - - char* line = nullptr; - size_t len = 0; - dmabufs->clear(); - while (getline(&line, &len, fp.get()) > 0) { - // The new dmabuf bufinfo format adds inode number and a name at the end - // We are looking for lines as follows: - // size flags mode count exp_name ino name - // 01048576 00000002 00000007 00000001 ion 00018758 CAMERA - // 01048576 00000002 00000007 00000001 ion 00018758 - uint64_t size, count; - char* exporter_name = nullptr; - ino_t inode; - char* name = nullptr; - int matched = sscanf(line, "%" SCNu64 "%*x %*x %" SCNu64 " %ms %lu %ms", &size, &count, - &exporter_name, &inode, &name); - if (matched < 4) { - continue; - } - dmabufs->emplace_back(inode, size, count, exporter_name, matched > 4 ? name : ""); - free(exporter_name); - free(name); - } - - free(line); - - return true; -} - -bool ReadDmaBufInfo(pid_t pid, std::vector* dmabufs) { - dmabufs->clear(); - return AppendDmaBufInfo(pid, dmabufs); -} - -bool AppendDmaBufInfo(pid_t pid, std::vector* dmabufs) { - if (!ReadDmaBufFdRefs(pid, dmabufs)) { - LOG(ERROR) << "Failed to read dmabuf fd references"; - return false; - } - - if (!ReadDmaBufMapRefs(pid, dmabufs)) { - LOG(ERROR) << "Failed to read dmabuf map references"; - return false; - } - return true; -} - -} // namespace dmabufinfo -} // namespace android diff --git a/libmeminfo/libdmabufinfo/dmabufinfo_test.cpp b/libmeminfo/libdmabufinfo/dmabufinfo_test.cpp deleted file mode 100644 index 7bba59902..000000000 --- a/libmeminfo/libdmabufinfo/dmabufinfo_test.cpp +++ /dev/null @@ -1,489 +0,0 @@ -/* 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 -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -using namespace ::android::dmabufinfo; -using namespace ::android::base; - -#define MAX_HEAP_NAME 32 -#define ION_HEAP_ANY_MASK (0x7fffffff) - -struct ion_heap_data { - char name[MAX_HEAP_NAME]; - __u32 type; - __u32 heap_id; - __u32 reserved0; - __u32 reserved1; - __u32 reserved2; -}; - -#ifndef DMA_BUF_SET_NAME -#define DMA_BUF_SET_NAME _IOW(DMA_BUF_BASE, 5, const char*) -#endif - -class fd_sharer { - public: - fd_sharer(); - ~fd_sharer() { kill(); } - - bool ok() const { return child_pid > 0; } - bool sendfd(int fd); - bool kill(); - pid_t pid() const { return child_pid; } - - private: - unique_fd parent_fd, child_fd; - pid_t child_pid; - - void run(); -}; - -fd_sharer::fd_sharer() : parent_fd{}, child_fd{}, child_pid{-1} { - bool sp_ok = android::base::Socketpair(SOCK_STREAM, &parent_fd, &child_fd); - if (!sp_ok) return; - - child_pid = fork(); - if (child_pid < 0) return; - - if (child_pid == 0) run(); -} - -bool fd_sharer::kill() { - int err = ::kill(child_pid, SIGKILL); - if (err < 0) return false; - - return ::waitpid(child_pid, nullptr, 0) == child_pid; -} - -void fd_sharer::run() { - while (true) { - int fd; - char unused = 0; - - iovec iov{}; - iov.iov_base = &unused; - iov.iov_len = sizeof(unused); - - msghdr msg{}; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - - char cmsg_buf[CMSG_SPACE(sizeof(fd))]; - msg.msg_control = cmsg_buf; - msg.msg_controllen = sizeof(cmsg_buf); - - cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - cmsg->cmsg_len = CMSG_LEN(sizeof(fd)); - - ssize_t s = TEMP_FAILURE_RETRY(recvmsg(child_fd, &msg, 0)); - if (s == -1) break; - - s = TEMP_FAILURE_RETRY(write(child_fd, &unused, sizeof(unused))); - if (s == -1) break; - } -} - -bool fd_sharer::sendfd(int fd) { - char unused = 0; - - iovec iov{}; - iov.iov_base = &unused; - iov.iov_len = sizeof(unused); - - msghdr msg{}; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - - char cmsg_buf[CMSG_SPACE(sizeof(fd))]; - msg.msg_control = cmsg_buf; - msg.msg_controllen = sizeof(cmsg_buf); - - cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - cmsg->cmsg_len = CMSG_LEN(sizeof(fd)); - - int* fd_buf = reinterpret_cast(CMSG_DATA(cmsg)); - *fd_buf = fd; - - ssize_t s = TEMP_FAILURE_RETRY(sendmsg(parent_fd, &msg, 0)); - if (s == -1) return false; - - // The target process installs the fd into its fd table during recvmsg(). - // So if we return now, there's a brief window between sendfd() finishing - // and libmemoryinfo actually seeing that the buffer has been shared. This - // window is just large enough to break tests. - // - // To work around this, wait for the target process to respond with a dummy - // byte, with a timeout of 1 s. - pollfd p{}; - p.fd = parent_fd; - p.events = POLL_IN; - int ready = poll(&p, 1, 1000); - if (ready != 1) return false; - - s = TEMP_FAILURE_RETRY(read(parent_fd, &unused, sizeof(unused))); - if (s == -1) return false; - - return true; -} - -#define EXPECT_ONE_BUF_EQ(_bufptr, _name, _fdrefs, _maprefs, _expname, _count, _size) \ - do { \ - EXPECT_EQ(_bufptr->name(), _name); \ - EXPECT_EQ(_bufptr->fdrefs().size(), _fdrefs); \ - EXPECT_EQ(_bufptr->maprefs().size(), _maprefs); \ - EXPECT_EQ(_bufptr->exporter(), _expname); \ - EXPECT_EQ(_bufptr->count(), _count); \ - EXPECT_EQ(_bufptr->size(), _size); \ - } while (0) - -#define EXPECT_PID_IN_FDREFS(_bufptr, _pid, _expect) \ - do { \ - const std::unordered_map& _fdrefs = _bufptr->fdrefs(); \ - auto _ref = _fdrefs.find(_pid); \ - EXPECT_EQ((_ref != _fdrefs.end()), _expect); \ - } while (0) - -#define EXPECT_PID_IN_MAPREFS(_bufptr, _pid, _expect) \ - do { \ - const std::unordered_map& _maprefs = _bufptr->maprefs(); \ - auto _ref = _maprefs.find(_pid); \ - EXPECT_EQ((_ref != _maprefs.end()), _expect); \ - } while (0) - -TEST(DmaBufInfoParser, TestReadDmaBufInfo) { - std::string bufinfo = R"bufinfo(00045056 00000002 00000007 00000002 ion 00022069 - Attached Devices: -Total 0 devices attached -01048576 00000002 00000007 00000001 ion 00019834 CAMERA - Attached Devices: - soc:qcom,cam_smmu:msm_cam_smmu_icp -Total 1 devices attached)bufinfo"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(bufinfo, tf.fd)); - std::string path = std::string(tf.path); - - std::vector dmabufs; - EXPECT_TRUE(ReadDmaBufInfo(&dmabufs, path)); - - EXPECT_EQ(dmabufs.size(), 2UL); - - EXPECT_EQ(dmabufs[0].size(), 45056UL); - EXPECT_EQ(dmabufs[0].inode(), 22069UL); - EXPECT_EQ(dmabufs[0].count(), 2UL); - EXPECT_EQ(dmabufs[0].exporter(), "ion"); - EXPECT_TRUE(dmabufs[0].name().empty()); - EXPECT_EQ(dmabufs[0].total_refs(), 0ULL); - EXPECT_TRUE(dmabufs[0].fdrefs().empty()); - EXPECT_TRUE(dmabufs[0].maprefs().empty()); - - EXPECT_EQ(dmabufs[1].size(), 1048576UL); - EXPECT_EQ(dmabufs[1].inode(), 19834UL); - EXPECT_EQ(dmabufs[1].count(), 1UL); - EXPECT_EQ(dmabufs[1].exporter(), "ion"); - EXPECT_FALSE(dmabufs[1].name().empty()); - EXPECT_EQ(dmabufs[1].name(), "CAMERA"); - EXPECT_EQ(dmabufs[1].total_refs(), 0ULL); - EXPECT_TRUE(dmabufs[1].fdrefs().empty()); - EXPECT_TRUE(dmabufs[1].maprefs().empty()); -} - -class DmaBufTester : public ::testing::Test { - public: - DmaBufTester() : ion_fd(ion_open()), ion_heap_mask(get_ion_heap_mask()) {} - - ~DmaBufTester() { - if (ion_fd >= 0) { - ion_close(ion_fd); - } - } - - bool is_valid() { return (ion_fd >= 0 && ion_heap_mask > 0); } - - unique_fd allocate(uint64_t size, const std::string& name) { - int fd; - int err = ion_alloc_fd(ion_fd, size, 0, ion_heap_mask, 0, &fd); - if (err < 0) { - printf("Failed ion_alloc_fd, return value: %d\n", err); - return unique_fd{}; - } - - if (!name.empty()) { - if (ioctl(fd, DMA_BUF_SET_NAME, name.c_str()) == -1) { - printf("Failed ioctl(DMA_BUF_SET_NAME): %s\n", strerror(errno)); - close(fd); - return unique_fd{}; - } - } - - return unique_fd{fd}; - } - - void readAndCheckDmaBuffer(std::vector* dmabufs, pid_t pid, const std::string name, - size_t fdrefs_size, size_t maprefs_size, const std::string exporter, - size_t refcount, uint64_t buf_size, bool expectFdrefs, - bool expectMapRefs) { - EXPECT_TRUE(ReadDmaBufInfo(pid, dmabufs)); - EXPECT_EQ(dmabufs->size(), 1UL); - EXPECT_ONE_BUF_EQ(dmabufs->begin(), name, fdrefs_size, maprefs_size, exporter, refcount, - buf_size); - // Make sure the buffer has the right pid too. - EXPECT_PID_IN_FDREFS(dmabufs->begin(), pid, expectFdrefs); - EXPECT_PID_IN_MAPREFS(dmabufs->begin(), pid, expectMapRefs); - } - - bool checkPidRef(DmaBuffer& dmabuf, pid_t pid, int expectFdrefs) { - int fdrefs = dmabuf.fdrefs().find(pid)->second; - return fdrefs == expectFdrefs; - } - - private: - int get_ion_heap_mask() { - if (ion_fd < 0) { - return 0; - } - - if (ion_is_legacy(ion_fd)) { - // Since ION is still in staging, we've seen that the heap mask ids are also - // changed across kernels for some reason. So, here we basically ask for a buffer - // from _any_ heap. - return ION_HEAP_ANY_MASK; - } - - int cnt; - int err = ion_query_heap_cnt(ion_fd, &cnt); - if (err < 0) { - return err; - } - - std::vector heaps; - heaps.resize(cnt); - err = ion_query_get_heaps(ion_fd, cnt, &heaps[0]); - if (err < 0) { - return err; - } - - unsigned int ret = 0; - for (auto& it : heaps) { - if (!strcmp(it.name, "ion_system_heap")) { - ret |= (1 << it.heap_id); - } - } - - return ret; - } - - int ion_fd; - const int ion_heap_mask; -}; - -TEST_F(DmaBufTester, TestFdRef) { - // Test if a dma buffer is found while the corresponding file descriptor - // is open - ASSERT_TRUE(is_valid()); - pid_t pid = getpid(); - std::vector dmabufs; - { - // Allocate one buffer and make sure the library can see it - unique_fd buf = allocate(4096, "dmabuftester-4k"); - ASSERT_GT(buf, 0) << "Allocated buffer is invalid"; - ASSERT_TRUE(ReadDmaBufInfo(pid, &dmabufs)); - - EXPECT_EQ(dmabufs.size(), 1UL); - EXPECT_ONE_BUF_EQ(dmabufs.begin(), "dmabuftester-4k", 1UL, 0UL, "ion", 1UL, 4096ULL); - - // Make sure the buffer has the right pid too. - EXPECT_PID_IN_FDREFS(dmabufs.begin(), pid, true); - } - - // Now make sure the buffer has disappeared - ASSERT_TRUE(ReadDmaBufInfo(pid, &dmabufs)); - EXPECT_TRUE(dmabufs.empty()); -} - -TEST_F(DmaBufTester, TestMapRef) { - // Test to make sure we can find a buffer if the fd is closed but the buffer - // is mapped - ASSERT_TRUE(is_valid()); - pid_t pid = getpid(); - std::vector dmabufs; - { - // Allocate one buffer and make sure the library can see it - unique_fd buf = allocate(4096, "dmabuftester-4k"); - ASSERT_GT(buf, 0) << "Allocated buffer is invalid"; - auto ptr = mmap(0, 4096, PROT_READ, MAP_SHARED, buf, 0); - ASSERT_NE(ptr, MAP_FAILED); - ASSERT_TRUE(ReadDmaBufInfo(pid, &dmabufs)); - - EXPECT_EQ(dmabufs.size(), 1UL); - EXPECT_ONE_BUF_EQ(dmabufs.begin(), "dmabuftester-4k", 1UL, 1UL, "ion", 2UL, 4096ULL); - - // Make sure the buffer has the right pid too. - EXPECT_PID_IN_FDREFS(dmabufs.begin(), pid, true); - EXPECT_PID_IN_MAPREFS(dmabufs.begin(), pid, true); - - // close the file descriptor and re-read the stats - buf.reset(-1); - ASSERT_TRUE(ReadDmaBufInfo(pid, &dmabufs)); - - EXPECT_EQ(dmabufs.size(), 1UL); - EXPECT_ONE_BUF_EQ(dmabufs.begin(), "", 0UL, 1UL, "", 0UL, 4096ULL); - - EXPECT_PID_IN_FDREFS(dmabufs.begin(), pid, false); - EXPECT_PID_IN_MAPREFS(dmabufs.begin(), pid, true); - - // unmap the bufer and lose all references - munmap(ptr, 4096); - } - - // Now make sure the buffer has disappeared - ASSERT_TRUE(ReadDmaBufInfo(pid, &dmabufs)); - EXPECT_TRUE(dmabufs.empty()); -} - -TEST_F(DmaBufTester, TestSharedfd) { - // Each time a shared buffer is received over a socket, the remote process - // will take an extra reference on it. - - ASSERT_TRUE(is_valid()); - - pid_t pid = getpid(); - std::vector dmabufs; - { - fd_sharer sharer{}; - ASSERT_TRUE(sharer.ok()); - // Allocate one buffer and make sure the library can see it - unique_fd buf = allocate(4096, "dmabuftester-4k"); - ASSERT_GT(buf, 0) << "Allocated buffer is invalid"; - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 1UL, 4096ULL, true, - false); - - ASSERT_TRUE(sharer.sendfd(buf)); - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 2UL, 4096ULL, true, - false); - EXPECT_TRUE(checkPidRef(dmabufs[0], pid, 1)); - readAndCheckDmaBuffer(&dmabufs, sharer.pid(), "dmabuftester-4k", 1UL, 0UL, "ion", 2UL, - 4096ULL, true, false); - EXPECT_TRUE(checkPidRef(dmabufs[0], sharer.pid(), 1)); - - ASSERT_TRUE(sharer.sendfd(buf)); - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 3UL, 4096ULL, true, - false); - EXPECT_TRUE(checkPidRef(dmabufs[0], pid, 1)); - readAndCheckDmaBuffer(&dmabufs, sharer.pid(), "dmabuftester-4k", 1UL, 0UL, "ion", 3UL, - 4096ULL, true, false); - EXPECT_TRUE(checkPidRef(dmabufs[0], sharer.pid(), 2)); - - ASSERT_TRUE(sharer.kill()); - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 1UL, 4096ULL, true, - false); - } - - // Now make sure the buffer has disappeared - ASSERT_TRUE(ReadDmaBufInfo(pid, &dmabufs)); - EXPECT_TRUE(dmabufs.empty()); -} - -TEST_F(DmaBufTester, DupFdTest) { - // dup()ing an fd will make this process take an extra reference on the - // shared buffer. - - ASSERT_TRUE(is_valid()); - - pid_t pid = getpid(); - std::vector dmabufs; - { - // Allocate one buffer and make sure the library can see it - unique_fd buf = allocate(4096, "dmabuftester-4k"); - ASSERT_GT(buf, 0) << "Allocated buffer is invalid"; - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 1UL, 4096ULL, true, - false); - - unique_fd buf2{dup(buf)}; - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 2UL, 4096ULL, true, - false); - EXPECT_TRUE(checkPidRef(dmabufs[0], pid, 2)); - - close(buf2.release()); - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 1UL, 4096ULL, true, - false); - EXPECT_TRUE(checkPidRef(dmabufs[0], pid, 1)); - } - - // Now make sure the buffer has disappeared - ASSERT_TRUE(ReadDmaBufInfo(pid, &dmabufs)); - EXPECT_TRUE(dmabufs.empty()); -} - -TEST_F(DmaBufTester, ForkTest) { - // fork()ing a child will cause the child to automatically take a reference - // on any existing shared buffers. - ASSERT_TRUE(is_valid()); - - pid_t pid = getpid(); - std::vector dmabufs; - { - // Allocate one buffer and make sure the library can see it - unique_fd buf = allocate(4096, "dmabuftester-4k"); - ASSERT_GT(buf, 0) << "Allocated buffer is invalid"; - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 1UL, 4096ULL, true, - false); - fd_sharer sharer{}; - ASSERT_TRUE(sharer.ok()); - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 2UL, 4096ULL, true, - false); - readAndCheckDmaBuffer(&dmabufs, sharer.pid(), "dmabuftester-4k", 1UL, 0UL, "ion", 2UL, - 4096ULL, true, false); - ASSERT_TRUE(sharer.kill()); - readAndCheckDmaBuffer(&dmabufs, pid, "dmabuftester-4k", 1UL, 0UL, "ion", 1UL, 4096ULL, true, - false); - } - - // Now make sure the buffer has disappeared - ASSERT_TRUE(ReadDmaBufInfo(pid, &dmabufs)); - EXPECT_TRUE(dmabufs.empty()); -} - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - ::android::base::InitLogging(argv, android::base::StderrLogger); - return RUN_ALL_TESTS(); -} diff --git a/libmeminfo/libdmabufinfo/include/dmabufinfo/dmabufinfo.h b/libmeminfo/libdmabufinfo/include/dmabufinfo/dmabufinfo.h deleted file mode 100644 index a6e7f6907..000000000 --- a/libmeminfo/libdmabufinfo/include/dmabufinfo/dmabufinfo.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * 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 -#include - -#include -#include -#include -#include - -namespace android { -namespace dmabufinfo { - -struct DmaBuffer { - public: - DmaBuffer(ino_t inode, uint64_t size, uint64_t count, const std::string& exporter, - const std::string& name) - : inode_(inode), size_(size), count_(count), exporter_(exporter), name_(name) { - total_refs_ = 0; - } - DmaBuffer() = default; - ~DmaBuffer() = default; - - // Adds one file descriptor reference for the given pid - void AddFdRef(pid_t pid) { - AddRefToPidMap(pid, &fdrefs_); - total_refs_++; - } - - // Adds one map reference for the given pid - void AddMapRef(pid_t pid) { - AddRefToPidMap(pid, &maprefs_); - total_refs_++; - } - - // Getters for each property - uint64_t size() const { return size_; } - const std::unordered_map& fdrefs() const { return fdrefs_; } - const std::unordered_map& maprefs() const { return maprefs_; } - ino_t inode() const { return inode_; } - uint64_t total_refs() const { return total_refs_; } - uint64_t count() const { return count_; }; - const std::set& pids() const { return pids_; } - const std::string& name() const { return name_; } - const std::string& exporter() const { return exporter_; } - void SetName(const std::string& name) { name_ = name; } - void SetExporter(const std::string& exporter) { exporter_ = exporter; } - void SetCount(uint64_t count) { count_ = count; } - uint64_t Pss() const { return size_ / pids_.size(); } - - bool operator==(const DmaBuffer& rhs) { - return (inode_ == rhs.inode()) && (size_ == rhs.size()) && (name_ == rhs.name()) && - (exporter_ == rhs.exporter()); - } - - private: - ino_t inode_; - uint64_t size_; - uint64_t count_; - uint64_t total_refs_; - std::set pids_; - std::string exporter_; - std::string name_; - std::unordered_map fdrefs_; - std::unordered_map maprefs_; - void AddRefToPidMap(pid_t pid, std::unordered_map* map) { - // The first time we find a ref, we set the ref count to 1 - // otherwise, increment the existing ref count - auto [it, inserted] = map->insert(std::make_pair(pid, 1)); - if (!inserted) - it->second++; - pids_.insert(pid); - } -}; - -// Read and return current dma buf objects from -// DEBUGFS/dma_buf/bufinfo. The references to each dma buffer are not -// populated here and will return an empty vector. -// Returns false if something went wrong with the function, true otherwise. -bool ReadDmaBufInfo(std::vector* dmabufs, - const std::string& path = "/sys/kernel/debug/dma_buf/bufinfo"); - - -// Read and return dmabuf objects for a given process without the help -// of DEBUGFS -// Returns false if something went wrong with the function, true otherwise. -bool ReadDmaBufInfo(pid_t pid, std::vector* dmabufs); - -// Append new dmabuf objects from a given process to an existing vector. -// When the vector contains an existing element with a matching inode, -// the reference counts will be updated. -// Does not depend on DEBUGFS. -// Returns false if something went wrong with the function, true otherwise. -bool AppendDmaBufInfo(pid_t pid, std::vector* dmabufs); - -} // namespace dmabufinfo -} // namespace android diff --git a/libmeminfo/libdmabufinfo/tools/Android.bp b/libmeminfo/libdmabufinfo/tools/Android.bp deleted file mode 100644 index 224b68ec7..000000000 --- a/libmeminfo/libdmabufinfo/tools/Android.bp +++ /dev/null @@ -1,30 +0,0 @@ -// 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: "dmabuf_dump", - cflags: [ - "-Wall", - "-Werror", - ], - - srcs: ["dmabuf_dump.cpp"], - shared_libs: [ - "libbase", - ], - static_libs: [ - "libdmabufinfo", - ], - product_specific: true, -} \ No newline at end of file diff --git a/libmeminfo/libdmabufinfo/tools/dmabuf_dump.cpp b/libmeminfo/libdmabufinfo/tools/dmabuf_dump.cpp deleted file mode 100644 index 48901b1da..000000000 --- a/libmeminfo/libdmabufinfo/tools/dmabuf_dump.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -using DmaBuffer = ::android::dmabufinfo::DmaBuffer; - -[[noreturn]] static void usage(int exit_status) { - fprintf(stderr, - "Usage: %s [-ah] [PID] \n" - "-a\t show all dma buffers (ion) in big table, [buffer x process] grid \n" - "-h\t show this help\n" - " \t If PID is supplied, the dmabuf information for that process is shown.\n", - getprogname()); - - exit(exit_status); -} - -static std::string GetProcessComm(const pid_t pid) { - std::string pid_path = android::base::StringPrintf("/proc/%d/comm", pid); - std::ifstream in{pid_path}; - if (!in) return std::string("N/A"); - std::string line; - std::getline(in, line); - if (!in) return std::string("N/A"); - return line; -} - -static void PrintDmaBufTable(const std::vector& bufs) { - if (bufs.empty()) { - printf("dmabuf info not found ¯\\_(ツ)_/¯\n"); - return; - } - - // Find all unique pids in the input vector, create a set - std::set pid_set; - for (auto& buf : bufs) { - pid_set.insert(buf.pids().begin(), buf.pids().end()); - } - - // Format the header string spaced and separated with '|' - printf(" Dmabuf Inode | Size | Ref Counts |"); - for (auto pid : pid_set) { - printf("%16s:%-5d |", GetProcessComm(pid).c_str(), pid); - } - printf("\n"); - - // holds per-process dmabuf size in kB - std::map per_pid_size = {}; - uint64_t dmabuf_total_size = 0; - - // Iterate through all dmabufs and collect per-process sizes, refs - for (auto& buf : bufs) { - printf("%16ju |%13" PRIu64 " kB |%16" PRIu64 " |", static_cast(buf.inode()), - buf.size() / 1024, buf.total_refs()); - // Iterate through each process to find out per-process references for each buffer, - // gather total size used by each process etc. - for (pid_t pid : pid_set) { - int pid_refs = 0; - if (buf.fdrefs().count(pid) == 1) { - // Get the total number of ref counts the process is holding - // on this buffer. We don't differentiate between mmap or fd. - pid_refs += buf.fdrefs().at(pid); - if (buf.maprefs().count(pid) == 1) { - pid_refs += buf.maprefs().at(pid); - } - } - - if (pid_refs) { - // Add up the per-pid total size. Note that if a buffer is mapped - // in 2 different processes, the size will be shown as mapped or opened - // in both processes. This is intended for visibility. - // - // If one wants to get the total *unique* dma buffers, they can simply - // sum the size of all dma bufs shown by the tool - per_pid_size[pid] += buf.size() / 1024; - printf("%17d refs |", pid_refs); - } else { - printf("%22s |", "--"); - } - } - dmabuf_total_size += buf.size() / 1024; - printf("\n"); - } - - printf("------------------------------------\n"); - printf("%-16s %13" PRIu64 " kB |%16s |", "TOTALS", dmabuf_total_size, "n/a"); - for (auto pid : pid_set) { - printf("%19" PRIu64 " kB |", per_pid_size[pid]); - } - printf("\n"); - - return; -} - -static void PrintDmaBufPerProcess(const std::vector& bufs) { - if (bufs.empty()) { - printf("dmabuf info not found ¯\\_(ツ)_/¯\n"); - return; - } - - // Create a reverse map from pid to dmabufs - std::unordered_map> pid_to_inodes = {}; - uint64_t total_size = 0; // Total size of dmabufs in the system - uint64_t kernel_rss = 0; // Total size of dmabufs NOT mapped or opened by a process - for (auto& buf : bufs) { - for (auto pid : buf.pids()) { - pid_to_inodes[pid].insert(buf.inode()); - } - total_size += buf.size(); - if (buf.fdrefs().empty() && buf.maprefs().empty()) { - kernel_rss += buf.size(); - } - } - // Create an inode to dmabuf map. We know inodes are unique.. - std::unordered_map inode_to_dmabuf; - for (auto buf : bufs) { - inode_to_dmabuf[buf.inode()] = buf; - } - - uint64_t total_rss = 0, total_pss = 0; - for (auto& [pid, inodes] : pid_to_inodes) { - uint64_t pss = 0; - uint64_t rss = 0; - - printf("%16s:%-5d\n", GetProcessComm(pid).c_str(), pid); - printf("%22s %16s %16s %16s %16s\n", "Name", "Rss", "Pss", "nr_procs", "Inode"); - for (auto& inode : inodes) { - DmaBuffer& buf = inode_to_dmabuf[inode]; - printf("%22s %13" PRIu64 " kB %13" PRIu64 " kB %16zu %16" PRIuMAX "\n", - buf.name().empty() ? "" : buf.name().c_str(), buf.size() / 1024, - buf.Pss() / 1024, buf.pids().size(), static_cast(buf.inode())); - rss += buf.size(); - pss += buf.Pss(); - } - printf("%22s %13" PRIu64 " kB %13" PRIu64 " kB %16s\n", "PROCESS TOTAL", rss / 1024, - pss / 1024, ""); - printf("----------------------\n"); - total_rss += rss; - total_pss += pss; - } - printf("dmabuf total: %" PRIu64 " kB kernel_rss: %" PRIu64 " kB userspace_rss: %" PRIu64 - " kB userspace_pss: %" PRIu64 " kB\n ", - total_size / 1024, kernel_rss / 1024, total_rss / 1024, total_pss / 1024); -} - -static bool ReadDmaBufs(std::vector* bufs) { - bufs->clear(); - - if (!ReadDmaBufInfo(bufs)) { - fprintf(stderr, "debugfs entry for dmabuf not available, skipping\n"); - return false; - } - - std::unique_ptr dir(opendir("/proc"), closedir); - if (!dir) { - fprintf(stderr, "Failed to open /proc directory\n"); - bufs->clear(); - return false; - } - - struct dirent* dent; - while ((dent = readdir(dir.get()))) { - if (dent->d_type != DT_DIR) continue; - - int pid = atoi(dent->d_name); - if (pid == 0) { - continue; - } - - if (!AppendDmaBufInfo(pid, bufs)) { - fprintf(stderr, "Unable to read dmabuf info for pid %d\n", pid); - bufs->clear(); - return false; - } - } - - return true; -} - -int main(int argc, char* argv[]) { - struct option longopts[] = {{"all", no_argument, nullptr, 'a'}, - {"help", no_argument, nullptr, 'h'}, - {0, 0, nullptr, 0}}; - - int opt; - bool show_table = false; - while ((opt = getopt_long(argc, argv, "ah", longopts, nullptr)) != -1) { - switch (opt) { - case 'a': - show_table = true; - break; - case 'h': - usage(EXIT_SUCCESS); - default: - usage(EXIT_FAILURE); - } - } - - pid_t pid = -1; - if (optind < argc) { - if (show_table) { - fprintf(stderr, "Invalid arguments: -a does not need arguments\n"); - usage(EXIT_FAILURE); - } - if (optind != (argc - 1)) { - fprintf(stderr, "Invalid arguments - only one [PID] argument is allowed\n"); - usage(EXIT_FAILURE); - } - pid = atoi(argv[optind]); - if (pid == 0) { - fprintf(stderr, "Invalid process id %s\n", argv[optind]); - usage(EXIT_FAILURE); - } - } - - std::vector bufs; - if (pid != -1) { - if (!ReadDmaBufInfo(pid, &bufs)) { - fprintf(stderr, "Unable to read dmabuf info for %d\n", pid); - exit(EXIT_FAILURE); - } - } else { - if (!ReadDmaBufs(&bufs)) exit(EXIT_FAILURE); - } - - // Show the old dmabuf table, inode x process - if (show_table) { - PrintDmaBufTable(bufs); - return 0; - } - - PrintDmaBufPerProcess(bufs); - - return 0; -} diff --git a/libmeminfo/libmeminfo_benchmark.cpp b/libmeminfo/libmeminfo_benchmark.cpp deleted file mode 100644 index 7450c6c80..000000000 --- a/libmeminfo/libmeminfo_benchmark.cpp +++ /dev/null @@ -1,547 +0,0 @@ -/* - * 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 -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include - -using ::android::meminfo::MemUsage; -using ::android::meminfo::ProcMemInfo; -using ::android::meminfo::SmapsOrRollupFromFile; -using ::android::meminfo::SysMemInfo; - -enum { - MEMINFO_TOTAL, - MEMINFO_FREE, - MEMINFO_BUFFERS, - MEMINFO_CACHED, - MEMINFO_SHMEM, - MEMINFO_SLAB, - MEMINFO_SLAB_RECLAIMABLE, - MEMINFO_SLAB_UNRECLAIMABLE, - MEMINFO_SWAP_TOTAL, - MEMINFO_SWAP_FREE, - MEMINFO_ZRAM_TOTAL, - MEMINFO_MAPPED, - MEMINFO_VMALLOC_USED, - MEMINFO_PAGE_TABLES, - MEMINFO_KERNEL_STACK, - MEMINFO_COUNT -}; - -static void get_mem_info(uint64_t mem[], const char* file) { - char buffer[4096]; - unsigned int numFound = 0; - - int fd = open(file, O_RDONLY); - - if (fd < 0) { - printf("Unable to open %s: %s\n", file, strerror(errno)); - return; - } - - const int len = read(fd, buffer, sizeof(buffer) - 1); - close(fd); - - if (len < 0) { - printf("Empty %s\n", file); - return; - } - buffer[len] = 0; - - static const char* const tags[] = { - "MemTotal:", "MemFree:", "Buffers:", "Cached:", "Shmem:", "Slab:", - "SReclaimable:", "SUnreclaim:", "SwapTotal:", "SwapFree:", "ZRam:", "Mapped:", - "VmallocUsed:", "PageTables:", "KernelStack:", NULL}; - - static const int tagsLen[] = {9, 8, 8, 7, 6, 5, 13, 11, 10, 9, 5, 7, 12, 11, 12, 0}; - - memset(mem, 0, sizeof(uint64_t) * 15); - char* p = buffer; - while (*p && (numFound < (sizeof(tagsLen) / sizeof(tagsLen[0])))) { - int i = 0; - while (tags[i]) { - // std::cout << "tag =" << tags[i] << " p = " << std::string(p, tagsLen[i]) << - // std::endl; - if (strncmp(p, tags[i], tagsLen[i]) == 0) { - p += tagsLen[i]; - while (*p == ' ') p++; - char* num = p; - while (*p >= '0' && *p <= '9') p++; - if (*p != 0) { - *p = 0; - p++; - } - mem[i] = atoll(num); - numFound++; - break; - } - i++; - } - while (*p && *p != '\n') { - p++; - } - if (*p) p++; - } -} - -static void BM_ReadMemInfo_old(benchmark::State& state) { - std::string meminfo = R"meminfo(MemTotal: 3019740 kB -MemFree: 1809728 kB -MemAvailable: 2546560 kB -Buffers: 54736 kB -Cached: 776052 kB -SwapCached: 0 kB -Active: 445856 kB -Inactive: 459092 kB -Active(anon): 78492 kB -Inactive(anon): 2240 kB -Active(file): 367364 kB -Inactive(file): 456852 kB -Unevictable: 3096 kB -Mlocked: 3096 kB -SwapTotal: 0 kB -SwapFree: 0 kB -Dirty: 32 kB -Writeback: 0 kB -AnonPages: 74988 kB -Mapped: 62624 kB -Shmem: 4020 kB -Slab: 86464 kB -SReclaimable: 44432 kB -SUnreclaim: 42032 kB -KernelStack: 4880 kB -PageTables: 2900 kB -NFS_Unstable: 0 kB -Bounce: 0 kB -WritebackTmp: 0 kB -CommitLimit: 1509868 kB -Committed_AS: 80296 kB -VmallocTotal: 263061440 kB -VmallocUsed: 0 kB -VmallocChunk: 0 kB -AnonHugePages: 6144 kB -ShmemHugePages: 0 kB -ShmemPmdMapped: 0 kB -CmaTotal: 131072 kB -CmaFree: 130380 kB -HugePages_Total: 0 -HugePages_Free: 0 -HugePages_Rsvd: 0 -HugePages_Surp: 0 -Hugepagesize: 2048 kB)meminfo"; - - TemporaryFile tf; - ::android::base::WriteStringToFd(meminfo, tf.fd); - - uint64_t mem[MEMINFO_COUNT]; - for (auto _ : state) { - get_mem_info(mem, tf.path); - } -} -BENCHMARK(BM_ReadMemInfo_old); - -static void BM_ReadMemInfo_new(benchmark::State& state) { - std::string meminfo = R"meminfo(MemTotal: 3019740 kB -MemFree: 1809728 kB -MemAvailable: 2546560 kB -Buffers: 54736 kB -Cached: 776052 kB -SwapCached: 0 kB -Active: 445856 kB -Inactive: 459092 kB -Active(anon): 78492 kB -Inactive(anon): 2240 kB -Active(file): 367364 kB -Inactive(file): 456852 kB -Unevictable: 3096 kB -Mlocked: 3096 kB -SwapTotal: 0 kB -SwapFree: 0 kB -Dirty: 32 kB -Writeback: 0 kB -AnonPages: 74988 kB -Mapped: 62624 kB -Shmem: 4020 kB -Slab: 86464 kB -SReclaimable: 44432 kB -SUnreclaim: 42032 kB -KernelStack: 4880 kB -PageTables: 2900 kB -NFS_Unstable: 0 kB -Bounce: 0 kB -WritebackTmp: 0 kB -CommitLimit: 1509868 kB -Committed_AS: 80296 kB -VmallocTotal: 263061440 kB -VmallocUsed: 0 kB -VmallocChunk: 0 kB -AnonHugePages: 6144 kB -ShmemHugePages: 0 kB -ShmemPmdMapped: 0 kB -CmaTotal: 131072 kB -CmaFree: 130380 kB -HugePages_Total: 0 -HugePages_Free: 0 -HugePages_Rsvd: 0 -HugePages_Surp: 0 -Hugepagesize: 2048 kB)meminfo"; - - TemporaryFile tf; - android::base::WriteStringToFd(meminfo, tf.fd); - - std::string file = std::string(tf.path); - std::vector mem; - const std::vector tags = { - SysMemInfo::kMemTotal, SysMemInfo::kMemFree, SysMemInfo::kMemBuffers, - SysMemInfo::kMemCached, SysMemInfo::kMemShmem, SysMemInfo::kMemSlab, - SysMemInfo::kMemSReclaim, SysMemInfo::kMemSUnreclaim, SysMemInfo::kMemSwapTotal, - SysMemInfo::kMemSwapFree, SysMemInfo::kMemMapped, SysMemInfo::kMemVmallocUsed, - SysMemInfo::kMemPageTables, SysMemInfo::kMemKernelStack, - }; - - SysMemInfo smi; - for (auto _ : state) { - mem.resize(tags.size()); - smi.ReadMemInfo(tags.size(), tags.data(), mem.data(), file.c_str()); - } -} -BENCHMARK(BM_ReadMemInfo_new); - -static uint64_t get_zram_mem_used(const std::string& zram_dir) { - FILE* f = fopen((zram_dir + "mm_stat").c_str(), "r"); - if (f) { - uint64_t mem_used_total = 0; - - int matched = fscanf(f, "%*d %*d %" SCNu64 " %*d %*d %*d %*d", &mem_used_total); - if (matched != 1) - fprintf(stderr, "warning: failed to parse %s\n", (zram_dir + "mm_stat").c_str()); - - fclose(f); - return mem_used_total; - } - - f = fopen((zram_dir + "mem_used_total").c_str(), "r"); - if (f) { - uint64_t mem_used_total = 0; - - int matched = fscanf(f, "%" SCNu64, &mem_used_total); - if (matched != 1) - fprintf(stderr, "warning: failed to parse %s\n", (zram_dir + "mem_used_total").c_str()); - - fclose(f); - return mem_used_total; - } - - return 0; -} - -static void BM_ZramTotal_old(benchmark::State& state) { - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string zram_mmstat_dir = exec_dir + "/testdata1/"; - for (auto _ : state) { - uint64_t zram_total __attribute__((unused)) = get_zram_mem_used(zram_mmstat_dir) / 1024; - } -} -BENCHMARK(BM_ZramTotal_old); - -static void BM_ZramTotal_new(benchmark::State& state) { - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string zram_mmstat_dir = exec_dir + "/testdata1/"; - SysMemInfo smi; - for (auto _ : state) { - uint64_t zram_total __attribute__((unused)) = smi.mem_zram_kb(zram_mmstat_dir.c_str()); - } -} -BENCHMARK(BM_ZramTotal_new); - -static void BM_MemInfoWithZram_old(benchmark::State& state) { - std::string meminfo = R"meminfo(MemTotal: 3019740 kB -MemFree: 1809728 kB -MemAvailable: 2546560 kB -Buffers: 54736 kB -Cached: 776052 kB -SwapCached: 0 kB -Active: 445856 kB -Inactive: 459092 kB -Active(anon): 78492 kB -Inactive(anon): 2240 kB -Active(file): 367364 kB -Inactive(file): 456852 kB -Unevictable: 3096 kB -Mlocked: 3096 kB -SwapTotal: 0 kB -SwapFree: 0 kB -Dirty: 32 kB -Writeback: 0 kB -AnonPages: 74988 kB -Mapped: 62624 kB -Shmem: 4020 kB -Slab: 86464 kB -SReclaimable: 44432 kB -SUnreclaim: 42032 kB -KernelStack: 4880 kB -PageTables: 2900 kB -NFS_Unstable: 0 kB -Bounce: 0 kB -WritebackTmp: 0 kB -CommitLimit: 1509868 kB -Committed_AS: 80296 kB -VmallocTotal: 263061440 kB -VmallocUsed: 0 kB -VmallocChunk: 0 kB -AnonHugePages: 6144 kB -ShmemHugePages: 0 kB -ShmemPmdMapped: 0 kB -CmaTotal: 131072 kB -CmaFree: 130380 kB -HugePages_Total: 0 -HugePages_Free: 0 -HugePages_Rsvd: 0 -HugePages_Surp: 0 -Hugepagesize: 2048 kB)meminfo"; - - TemporaryFile tf; - ::android::base::WriteStringToFd(meminfo, tf.fd); - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string zram_mmstat_dir = exec_dir + "/testdata1/"; - uint64_t mem[MEMINFO_COUNT]; - for (auto _ : state) { - get_mem_info(mem, tf.path); - mem[MEMINFO_ZRAM_TOTAL] = get_zram_mem_used("/sys/block/zram0/") / 1024; - CHECK_EQ(mem[MEMINFO_KERNEL_STACK], 4880u); - } -} -BENCHMARK(BM_MemInfoWithZram_old); - -static void BM_MemInfoWithZram_new(benchmark::State& state) { - std::string meminfo = R"meminfo(MemTotal: 3019740 kB -MemFree: 1809728 kB -MemAvailable: 2546560 kB -Buffers: 54736 kB -Cached: 776052 kB -SwapCached: 0 kB -Active: 445856 kB -Inactive: 459092 kB -Active(anon): 78492 kB -Inactive(anon): 2240 kB -Active(file): 367364 kB -Inactive(file): 456852 kB -Unevictable: 3096 kB -Mlocked: 3096 kB -SwapTotal: 0 kB -SwapFree: 0 kB -Dirty: 32 kB -Writeback: 0 kB -AnonPages: 74988 kB -Mapped: 62624 kB -Shmem: 4020 kB -Slab: 86464 kB -SReclaimable: 44432 kB -SUnreclaim: 42032 kB -KernelStack: 4880 kB -PageTables: 2900 kB -NFS_Unstable: 0 kB -Bounce: 0 kB -WritebackTmp: 0 kB -CommitLimit: 1509868 kB -Committed_AS: 80296 kB -VmallocTotal: 263061440 kB -VmallocUsed: 0 kB -VmallocChunk: 0 kB -AnonHugePages: 6144 kB -ShmemHugePages: 0 kB -ShmemPmdMapped: 0 kB -CmaTotal: 131072 kB -CmaFree: 130380 kB -HugePages_Total: 0 -HugePages_Free: 0 -HugePages_Rsvd: 0 -HugePages_Surp: 0 -Hugepagesize: 2048 kB)meminfo"; - - TemporaryFile tf; - android::base::WriteStringToFd(meminfo, tf.fd); - - std::string file = std::string(tf.path); - std::vector mem; - std::vector tags(SysMemInfo::kDefaultSysMemInfoTags.begin(), - SysMemInfo::kDefaultSysMemInfoTags.end()); - auto it = tags.begin(); - tags.insert(it + MEMINFO_ZRAM_TOTAL, "Zram:"); - SysMemInfo smi; - - for (auto _ : state) { - mem.resize(tags.size()); - smi.ReadMemInfo(tags.size(), tags.data(), mem.data(), file.c_str()); - CHECK_EQ(mem[MEMINFO_KERNEL_STACK], 4880u); - } -} -BENCHMARK(BM_MemInfoWithZram_new); - -// Current implementation is in frameworks/base/core/jni/android_os_Debug.cpp. -// That implementation is still buggy and it skips over vmalloc allocated memory by kernel modules. -// This is the *fixed* version of the same implementation intended for benchmarking against the new -// one. -static uint64_t get_allocated_vmalloc_memory(const std::string& vm_file) { - char line[1024]; - - uint64_t vmalloc_allocated_size = 0; - auto fp = std::unique_ptr{fopen(vm_file.c_str(), "re"), fclose}; - if (fp == nullptr) { - return 0; - } - - while (true) { - if (fgets(line, 1024, fp.get()) == NULL) { - break; - } - - // check to see if there are pages mapped in vmalloc area - if (!strstr(line, "pages=")) { - continue; - } - - long nr_pages; - if (sscanf(line, "%*x-%*x %*ld %*s pages=%ld", &nr_pages) == 1) { - vmalloc_allocated_size += (nr_pages * getpagesize()); - } else if (sscanf(line, "%*x-%*x %*ld %*s %*s pages=%ld", &nr_pages) == 1) { - // The second case is for kernel modules. If allocation comes from the module, - // kernel puts an extra string containing the module name before "pages=" in - // the line. - // See: https://elixir.bootlin.com/linux/latest/source/kernel/kallsyms.c#L373 - vmalloc_allocated_size += (nr_pages * getpagesize()); - } - } - return vmalloc_allocated_size; -} - -static void BM_VmallocInfo_old_fixed(benchmark::State& state) { - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string vmallocinfo = - ::android::base::StringPrintf("%s/testdata1/vmallocinfo", exec_dir.c_str()); - for (auto _ : state) { - CHECK_EQ(get_allocated_vmalloc_memory(vmallocinfo), 29884416); - } -} -BENCHMARK(BM_VmallocInfo_old_fixed); - -static void BM_VmallocInfo_new(benchmark::State& state) { - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string vmallocinfo = - ::android::base::StringPrintf("%s/testdata1/vmallocinfo", exec_dir.c_str()); - for (auto _ : state) { - CHECK_EQ(::android::meminfo::ReadVmallocInfo(vmallocinfo.c_str()), 29884416); - } -} -BENCHMARK(BM_VmallocInfo_new); - -// This implementation is picked up as-is from frameworks/base/core/jni/android_os_Debug.cpp -// and only slightly modified to use std:unique_ptr. -static bool get_smaps_rollup(const std::string path, MemUsage* rollup) { - char lineBuffer[1024]; - auto fp = std::unique_ptr{fopen(path.c_str(), "re"), fclose}; - if (fp != nullptr) { - char* line; - while (true) { - if (fgets(lineBuffer, sizeof(lineBuffer), fp.get()) == NULL) { - break; - } - line = lineBuffer; - - switch (line[0]) { - case 'P': - if (strncmp(line, "Pss:", 4) == 0) { - char* c = line + 4; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; - } - rollup->pss += atoi(c); - } else if (strncmp(line, "Private_Clean:", 14) == 0 || - strncmp(line, "Private_Dirty:", 14) == 0) { - char* c = line + 14; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; - } - rollup->uss += atoi(c); - } - break; - case 'R': - if (strncmp(line, "Rss:", 4) == 0) { - char* c = line + 4; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; - } - rollup->rss += atoi(c); - } - break; - case 'S': - if (strncmp(line, "SwapPss:", 8) == 0) { - char* c = line + 8; - long lSwapPss; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; - } - lSwapPss = atoi(c); - rollup->swap_pss += lSwapPss; - } - break; - } - } - } else { - return false; - } - - return true; -} - -static void BM_SmapsRollup_old(benchmark::State& state) { - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string path = ::android::base::StringPrintf("%s/testdata1/smaps", exec_dir.c_str()); - for (auto _ : state) { - MemUsage stats; - CHECK_EQ(get_smaps_rollup(path, &stats), true); - CHECK_EQ(stats.pss, 108384); - } -} -BENCHMARK(BM_SmapsRollup_old); - -static void BM_SmapsRollup_new(benchmark::State& state) { - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string path = ::android::base::StringPrintf("%s/testdata1/smaps", exec_dir.c_str()); - for (auto _ : state) { - MemUsage stats; - CHECK_EQ(SmapsOrRollupFromFile(path, &stats), true); - CHECK_EQ(stats.pss, 108384); - } -} -BENCHMARK(BM_SmapsRollup_new); - -BENCHMARK_MAIN(); diff --git a/libmeminfo/libmeminfo_test.cpp b/libmeminfo/libmeminfo_test.cpp deleted file mode 100644 index 6ee3482fd..000000000 --- a/libmeminfo/libmeminfo_test.cpp +++ /dev/null @@ -1,782 +0,0 @@ -/* - * 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 - -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -using namespace std; -using namespace android::meminfo; - -pid_t pid = -1; - -TEST(ProcMemInfo, TestWorkingTestReset) { - // Expect reset to succeed - EXPECT_TRUE(ProcMemInfo::ResetWorkingSet(pid)); -} - -TEST(ProcMemInfo, UsageEmpty) { - // If we created the object for getting working set, - // the usage must be empty - ProcMemInfo proc_mem(pid, true); - const MemUsage& usage = proc_mem.Usage(); - EXPECT_EQ(usage.rss, 0); - EXPECT_EQ(usage.vss, 0); - EXPECT_EQ(usage.pss, 0); - EXPECT_EQ(usage.uss, 0); - EXPECT_EQ(usage.swap, 0); -} - -TEST(ProcMemInfo, MapsNotEmpty) { - // Make sure the process maps are never empty - ProcMemInfo proc_mem(pid); - const std::vector& maps = proc_mem.Maps(); - EXPECT_FALSE(maps.empty()); -} - -TEST(ProcMemInfo, MapsUsageNotEmpty) { - ProcMemInfo proc_mem(pid); - const std::vector& maps = proc_mem.Maps(); - EXPECT_FALSE(maps.empty()); - uint64_t total_pss = 0; - uint64_t total_rss = 0; - uint64_t total_uss = 0; - for (auto& map : maps) { - ASSERT_NE(0, map.usage.vss); - total_rss += map.usage.rss; - total_pss += map.usage.pss; - total_uss += map.usage.uss; - } - - // Crude check that stats are actually being read. - EXPECT_NE(0, total_rss) << "RSS zero for all maps, that is not possible."; - EXPECT_NE(0, total_pss) << "PSS zero for all maps, that is not possible."; - EXPECT_NE(0, total_uss) << "USS zero for all maps, that is not possible."; -} - -TEST(ProcMemInfo, MapsUsageEmpty) { - ProcMemInfo proc_mem(pid); - const std::vector& maps = proc_mem.MapsWithoutUsageStats(); - EXPECT_FALSE(maps.empty()); - // Verify that all usage stats are zero in every map. - for (auto& map : maps) { - ASSERT_EQ(0, map.usage.vss); - ASSERT_EQ(0, map.usage.rss); - ASSERT_EQ(0, map.usage.pss); - ASSERT_EQ(0, map.usage.uss); - ASSERT_EQ(0, map.usage.swap); - ASSERT_EQ(0, map.usage.swap_pss); - ASSERT_EQ(0, map.usage.private_clean); - ASSERT_EQ(0, map.usage.private_dirty); - ASSERT_EQ(0, map.usage.shared_clean); - ASSERT_EQ(0, map.usage.shared_dirty); - } -} - -TEST(ProcMemInfo, MapsUsageFillInLater) { - ProcMemInfo proc_mem(pid); - const std::vector& maps = proc_mem.MapsWithoutUsageStats(); - EXPECT_FALSE(maps.empty()); - for (auto& map : maps) { - Vma update_map(map); - ASSERT_EQ(map.start, update_map.start); - ASSERT_EQ(map.end, update_map.end); - ASSERT_EQ(map.offset, update_map.offset); - ASSERT_EQ(map.flags, update_map.flags); - ASSERT_EQ(map.name, update_map.name); - ASSERT_EQ(0, update_map.usage.vss); - ASSERT_EQ(0, update_map.usage.rss); - ASSERT_EQ(0, update_map.usage.pss); - ASSERT_EQ(0, update_map.usage.uss); - ASSERT_EQ(0, update_map.usage.swap); - ASSERT_EQ(0, update_map.usage.swap_pss); - ASSERT_EQ(0, update_map.usage.private_clean); - ASSERT_EQ(0, update_map.usage.private_dirty); - ASSERT_EQ(0, update_map.usage.shared_clean); - ASSERT_EQ(0, update_map.usage.shared_dirty); - ASSERT_TRUE(proc_mem.FillInVmaStats(update_map)); - // Check that at least one usage stat was updated. - ASSERT_NE(0, update_map.usage.vss); - } -} - -TEST(ProcMemInfo, PageMapPresent) { - static constexpr size_t kNumPages = 20; - size_t pagesize = getpagesize(); - void* ptr = mmap(nullptr, pagesize * (kNumPages + 2), PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - ASSERT_NE(MAP_FAILED, ptr); - - // Unmap the first page and the last page so that we guarantee this - // map is in a map by itself. - ASSERT_EQ(0, munmap(ptr, pagesize)); - uintptr_t addr = reinterpret_cast(ptr) + pagesize; - ASSERT_EQ(0, munmap(reinterpret_cast(addr + kNumPages * pagesize), pagesize)); - - ProcMemInfo proc_mem(getpid()); - const std::vector& maps = proc_mem.MapsWithoutUsageStats(); - ASSERT_FALSE(maps.empty()); - - // Find the vma associated with our previously created map. - const Vma* test_vma = nullptr; - for (const Vma& vma : maps) { - if (vma.start == addr) { - test_vma = &vma; - break; - } - } - ASSERT_TRUE(test_vma != nullptr) << "Cannot find test map."; - - // Verify that none of the pages are listed as present. - std::vector pagemap; - ASSERT_TRUE(proc_mem.PageMap(*test_vma, &pagemap)); - ASSERT_EQ(kNumPages, pagemap.size()); - for (size_t i = 0; i < pagemap.size(); i++) { - EXPECT_FALSE(android::meminfo::page_present(pagemap[i])) - << "Page " << i << " is present and it should not be."; - } - - // Make some of the pages present and verify that we see them - // as present. - uint8_t* data = reinterpret_cast(addr); - data[0] = 1; - data[pagesize * 5] = 1; - data[pagesize * 11] = 1; - - ASSERT_TRUE(proc_mem.PageMap(*test_vma, &pagemap)); - ASSERT_EQ(kNumPages, pagemap.size()); - for (size_t i = 0; i < pagemap.size(); i++) { - if (i == 0 || i == 5 || i == 11) { - EXPECT_TRUE(android::meminfo::page_present(pagemap[i])) - << "Page " << i << " is not present and it should be."; - } else { - EXPECT_FALSE(android::meminfo::page_present(pagemap[i])) - << "Page " << i << " is present and it should not be."; - } - } - - ASSERT_EQ(0, munmap(reinterpret_cast(addr), kNumPages * pagesize)); -} - -TEST(ProcMemInfo, WssEmpty) { - // If we created the object for getting usage, - // the working set must be empty - ProcMemInfo proc_mem(pid, false); - const MemUsage& wss = proc_mem.Wss(); - EXPECT_EQ(wss.rss, 0); - EXPECT_EQ(wss.vss, 0); - EXPECT_EQ(wss.pss, 0); - EXPECT_EQ(wss.uss, 0); - EXPECT_EQ(wss.swap, 0); -} - -TEST(ProcMemInfo, SwapOffsetsEmpty) { - // If we created the object for getting working set, - // the swap offsets must be empty - ProcMemInfo proc_mem(pid, true); - const std::vector& swap_offsets = proc_mem.SwapOffsets(); - EXPECT_EQ(swap_offsets.size(), 0); -} - -TEST(ProcMemInfo, IsSmapsSupportedTest) { - // Get any pid and check if /proc//smaps_rollup exists using the API. - // The API must return the appropriate value regardless of the after it succeeds - // once. - std::string path = ::android::base::StringPrintf("/proc/%d/smaps_rollup", pid); - bool supported = IsSmapsRollupSupported(pid); - EXPECT_EQ(!access(path.c_str(), F_OK | R_OK), supported); - // Second call must return what the first one returned regardless of the pid parameter. - // So, deliberately pass invalid pid. - EXPECT_EQ(supported, IsSmapsRollupSupported(-1)); -} - -TEST(ProcMemInfo, SmapsOrRollupTest) { - // Make sure we can parse 'smaps_rollup' correctly - std::string rollup = - R"rollup(12c00000-7fe859e000 ---p 00000000 00:00 0 [rollup] -Rss: 331908 kB -Pss: 202052 kB -Shared_Clean: 158492 kB -Shared_Dirty: 18928 kB -Private_Clean: 90472 kB -Private_Dirty: 64016 kB -Referenced: 318700 kB -Anonymous: 81984 kB -AnonHugePages: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 5344 kB -SwapPss: 442 kB -Locked: 1523537 kB)rollup"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(rollup, tf.fd)); - - MemUsage stats; - ASSERT_EQ(SmapsOrRollupFromFile(tf.path, &stats), true); - EXPECT_EQ(stats.rss, 331908); - EXPECT_EQ(stats.pss, 202052); - EXPECT_EQ(stats.uss, 154488); - EXPECT_EQ(stats.private_clean, 90472); - EXPECT_EQ(stats.private_dirty, 64016); - EXPECT_EQ(stats.swap_pss, 442); -} - -TEST(ProcMemInfo, SmapsOrRollupSmapsTest) { - // Make sure /proc//smaps is parsed correctly - std::string smaps = - R"smaps(12c00000-13440000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 8448 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2652 kB -Pss: 2652 kB -Shared_Clean: 840 kB -Shared_Dirty: 40 kB -Private_Clean: 84 kB -Private_Dirty: 2652 kB -Referenced: 2652 kB -Anonymous: 2652 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 102 kB -SwapPss: 70 kB -Locked: 2652 kB -VmFlags: rd wr mr mw me ac -)smaps"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(smaps, tf.fd)); - - MemUsage stats; - ASSERT_EQ(SmapsOrRollupFromFile(tf.path, &stats), true); - EXPECT_EQ(stats.rss, 2652); - EXPECT_EQ(stats.pss, 2652); - EXPECT_EQ(stats.uss, 2736); - EXPECT_EQ(stats.private_clean, 84); - EXPECT_EQ(stats.private_dirty, 2652); - EXPECT_EQ(stats.swap_pss, 70); -} - -TEST(ProcMemInfo, SmapsOrRollupPssRollupTest) { - // Make sure /proc//smaps is parsed correctly - // to get the PSS - std::string smaps = - R"smaps(12c00000-13440000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 8448 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2652 kB -Pss: 2652 kB -Shared_Clean: 840 kB -Shared_Dirty: 40 kB -Private_Clean: 84 kB -Private_Dirty: 2652 kB -Referenced: 2652 kB -Anonymous: 2652 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 102 kB -SwapPss: 70 kB -Locked: 2652 kB -VmFlags: rd wr mr mw me ac -)smaps"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(smaps, tf.fd)); - - uint64_t pss; - ASSERT_EQ(SmapsOrRollupPssFromFile(tf.path, &pss), true); - EXPECT_EQ(pss, 2652); -} - -TEST(ProcMemInfo, SmapsOrRollupPssSmapsTest) { - // Correctly parse smaps file to gather pss - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string path = ::android::base::StringPrintf("%s/testdata1/smaps_short", exec_dir.c_str()); - - uint64_t pss; - ASSERT_EQ(SmapsOrRollupPssFromFile(path, &pss), true); - EXPECT_EQ(pss, 19119); -} - -TEST(ProcMemInfo, ForEachVmaFromFileTest) { - // Parse smaps file correctly to make callbacks for each virtual memory area (vma) - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string path = ::android::base::StringPrintf("%s/testdata1/smaps_short", exec_dir.c_str()); - ProcMemInfo proc_mem(pid); - - std::vector vmas; - auto collect_vmas = [&](const Vma& v) { vmas.push_back(v); }; - ASSERT_TRUE(ForEachVmaFromFile(path, collect_vmas)); - - // We should get a total of 6 vmas - ASSERT_EQ(vmas.size(), 6); - - // Expect values to be equal to what we have in testdata1/smaps_short - // Check for sizes first - ASSERT_EQ(vmas[0].usage.vss, 32768); - EXPECT_EQ(vmas[1].usage.vss, 11204); - EXPECT_EQ(vmas[2].usage.vss, 16896); - EXPECT_EQ(vmas[3].usage.vss, 260); - EXPECT_EQ(vmas[4].usage.vss, 6060); - EXPECT_EQ(vmas[5].usage.vss, 4); - - // Check for names - EXPECT_EQ(vmas[0].name, "[anon:dalvik-zygote-jit-code-cache]"); - EXPECT_EQ(vmas[1].name, "/system/framework/x86_64/boot-framework.art"); - EXPECT_TRUE(vmas[2].name == "[anon:libc_malloc]" || - android::base::StartsWith(vmas[2].name, "[anon:scudo:")) - << "Unknown map name " << vmas[2].name; - EXPECT_EQ(vmas[3].name, "/system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex"); - EXPECT_EQ(vmas[4].name, "/system/lib64/libhwui.so"); - EXPECT_EQ(vmas[5].name, "[vsyscall]"); - - EXPECT_EQ(vmas[0].usage.rss, 2048); - EXPECT_EQ(vmas[1].usage.rss, 11188); - EXPECT_EQ(vmas[2].usage.rss, 15272); - EXPECT_EQ(vmas[3].usage.rss, 260); - EXPECT_EQ(vmas[4].usage.rss, 4132); - EXPECT_EQ(vmas[5].usage.rss, 0); - - EXPECT_EQ(vmas[0].usage.pss, 113); - EXPECT_EQ(vmas[1].usage.pss, 2200); - EXPECT_EQ(vmas[2].usage.pss, 15272); - EXPECT_EQ(vmas[3].usage.pss, 260); - EXPECT_EQ(vmas[4].usage.pss, 1274); - EXPECT_EQ(vmas[5].usage.pss, 0); - - EXPECT_EQ(vmas[0].usage.uss, 0); - EXPECT_EQ(vmas[1].usage.uss, 1660); - EXPECT_EQ(vmas[2].usage.uss, 15272); - EXPECT_EQ(vmas[3].usage.uss, 260); - EXPECT_EQ(vmas[4].usage.uss, 0); - EXPECT_EQ(vmas[5].usage.uss, 0); - - EXPECT_EQ(vmas[0].usage.private_clean, 0); - EXPECT_EQ(vmas[1].usage.private_clean, 0); - EXPECT_EQ(vmas[2].usage.private_clean, 0); - EXPECT_EQ(vmas[3].usage.private_clean, 260); - EXPECT_EQ(vmas[4].usage.private_clean, 0); - EXPECT_EQ(vmas[5].usage.private_clean, 0); - - EXPECT_EQ(vmas[0].usage.private_dirty, 0); - EXPECT_EQ(vmas[1].usage.private_dirty, 1660); - EXPECT_EQ(vmas[2].usage.private_dirty, 15272); - EXPECT_EQ(vmas[3].usage.private_dirty, 0); - EXPECT_EQ(vmas[4].usage.private_dirty, 0); - EXPECT_EQ(vmas[5].usage.private_dirty, 0); - - EXPECT_EQ(vmas[0].usage.shared_clean, 0); - EXPECT_EQ(vmas[1].usage.shared_clean, 80); - EXPECT_EQ(vmas[2].usage.shared_clean, 0); - EXPECT_EQ(vmas[3].usage.shared_clean, 0); - EXPECT_EQ(vmas[4].usage.shared_clean, 4132); - EXPECT_EQ(vmas[5].usage.shared_clean, 0); - - EXPECT_EQ(vmas[0].usage.shared_dirty, 2048); - EXPECT_EQ(vmas[1].usage.shared_dirty, 9448); - EXPECT_EQ(vmas[2].usage.shared_dirty, 0); - EXPECT_EQ(vmas[3].usage.shared_dirty, 0); - EXPECT_EQ(vmas[4].usage.shared_dirty, 0); - EXPECT_EQ(vmas[5].usage.shared_dirty, 0); - - EXPECT_EQ(vmas[0].usage.swap, 0); - EXPECT_EQ(vmas[1].usage.swap, 0); - EXPECT_EQ(vmas[2].usage.swap, 0); - EXPECT_EQ(vmas[3].usage.swap, 0); - EXPECT_EQ(vmas[4].usage.swap, 0); - EXPECT_EQ(vmas[5].usage.swap, 0); - - EXPECT_EQ(vmas[0].usage.swap_pss, 0); - EXPECT_EQ(vmas[1].usage.swap_pss, 0); - EXPECT_EQ(vmas[2].usage.swap_pss, 0); - EXPECT_EQ(vmas[3].usage.swap_pss, 0); - EXPECT_EQ(vmas[4].usage.swap_pss, 0); - EXPECT_EQ(vmas[5].usage.swap_pss, 0); -} - -TEST(ProcMemInfo, SmapsReturnTest) { - // Make sure Smaps() is never empty for any process - ProcMemInfo proc_mem(pid); - auto vmas = proc_mem.Smaps(); - EXPECT_FALSE(vmas.empty()); -} - -TEST(ProcMemInfo, SmapsTest) { - std::string exec_dir = ::android::base::GetExecutableDirectory(); - std::string path = ::android::base::StringPrintf("%s/testdata1/smaps_short", exec_dir.c_str()); - ProcMemInfo proc_mem(pid); - auto vmas = proc_mem.Smaps(path); - - ASSERT_FALSE(vmas.empty()); - // We should get a total of 6 vmas - ASSERT_EQ(vmas.size(), 6); - - // Expect values to be equal to what we have in testdata1/smaps_short - // Check for sizes first - ASSERT_EQ(vmas[0].usage.vss, 32768); - EXPECT_EQ(vmas[1].usage.vss, 11204); - EXPECT_EQ(vmas[2].usage.vss, 16896); - EXPECT_EQ(vmas[3].usage.vss, 260); - EXPECT_EQ(vmas[4].usage.vss, 6060); - EXPECT_EQ(vmas[5].usage.vss, 4); - - // Check for names - EXPECT_EQ(vmas[0].name, "[anon:dalvik-zygote-jit-code-cache]"); - EXPECT_EQ(vmas[1].name, "/system/framework/x86_64/boot-framework.art"); - EXPECT_TRUE(vmas[2].name == "[anon:libc_malloc]" || - android::base::StartsWith(vmas[2].name, "[anon:scudo:")) - << "Unknown map name " << vmas[2].name; - EXPECT_EQ(vmas[3].name, "/system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex"); - EXPECT_EQ(vmas[4].name, "/system/lib64/libhwui.so"); - EXPECT_EQ(vmas[5].name, "[vsyscall]"); - - EXPECT_EQ(vmas[0].usage.rss, 2048); - EXPECT_EQ(vmas[1].usage.rss, 11188); - EXPECT_EQ(vmas[2].usage.rss, 15272); - EXPECT_EQ(vmas[3].usage.rss, 260); - EXPECT_EQ(vmas[4].usage.rss, 4132); - EXPECT_EQ(vmas[5].usage.rss, 0); - - EXPECT_EQ(vmas[0].usage.pss, 113); - EXPECT_EQ(vmas[1].usage.pss, 2200); - EXPECT_EQ(vmas[2].usage.pss, 15272); - EXPECT_EQ(vmas[3].usage.pss, 260); - EXPECT_EQ(vmas[4].usage.pss, 1274); - EXPECT_EQ(vmas[5].usage.pss, 0); - - EXPECT_EQ(vmas[0].usage.uss, 0); - EXPECT_EQ(vmas[1].usage.uss, 1660); - EXPECT_EQ(vmas[2].usage.uss, 15272); - EXPECT_EQ(vmas[3].usage.uss, 260); - EXPECT_EQ(vmas[4].usage.uss, 0); - EXPECT_EQ(vmas[5].usage.uss, 0); - - EXPECT_EQ(vmas[0].usage.private_clean, 0); - EXPECT_EQ(vmas[1].usage.private_clean, 0); - EXPECT_EQ(vmas[2].usage.private_clean, 0); - EXPECT_EQ(vmas[3].usage.private_clean, 260); - EXPECT_EQ(vmas[4].usage.private_clean, 0); - EXPECT_EQ(vmas[5].usage.private_clean, 0); - - EXPECT_EQ(vmas[0].usage.private_dirty, 0); - EXPECT_EQ(vmas[1].usage.private_dirty, 1660); - EXPECT_EQ(vmas[2].usage.private_dirty, 15272); - EXPECT_EQ(vmas[3].usage.private_dirty, 0); - EXPECT_EQ(vmas[4].usage.private_dirty, 0); - EXPECT_EQ(vmas[5].usage.private_dirty, 0); - - EXPECT_EQ(vmas[0].usage.shared_clean, 0); - EXPECT_EQ(vmas[1].usage.shared_clean, 80); - EXPECT_EQ(vmas[2].usage.shared_clean, 0); - EXPECT_EQ(vmas[3].usage.shared_clean, 0); - EXPECT_EQ(vmas[4].usage.shared_clean, 4132); - EXPECT_EQ(vmas[5].usage.shared_clean, 0); - - EXPECT_EQ(vmas[0].usage.shared_dirty, 2048); - EXPECT_EQ(vmas[1].usage.shared_dirty, 9448); - EXPECT_EQ(vmas[2].usage.shared_dirty, 0); - EXPECT_EQ(vmas[3].usage.shared_dirty, 0); - EXPECT_EQ(vmas[4].usage.shared_dirty, 0); - EXPECT_EQ(vmas[5].usage.shared_dirty, 0); - - EXPECT_EQ(vmas[0].usage.swap, 0); - EXPECT_EQ(vmas[1].usage.swap, 0); - EXPECT_EQ(vmas[2].usage.swap, 0); - EXPECT_EQ(vmas[3].usage.swap, 0); - EXPECT_EQ(vmas[4].usage.swap, 0); - EXPECT_EQ(vmas[5].usage.swap, 0); - - EXPECT_EQ(vmas[0].usage.swap_pss, 0); - EXPECT_EQ(vmas[1].usage.swap_pss, 0); - EXPECT_EQ(vmas[2].usage.swap_pss, 0); - EXPECT_EQ(vmas[3].usage.swap_pss, 0); - EXPECT_EQ(vmas[4].usage.swap_pss, 0); - EXPECT_EQ(vmas[5].usage.swap_pss, 0); -} - -TEST(SysMemInfo, TestSysMemInfoFile) { - std::string meminfo = R"meminfo(MemTotal: 3019740 kB -MemFree: 1809728 kB -MemAvailable: 2546560 kB -Buffers: 54736 kB -Cached: 776052 kB -SwapCached: 0 kB -Active: 445856 kB -Inactive: 459092 kB -Active(anon): 78492 kB -Inactive(anon): 2240 kB -Active(file): 367364 kB -Inactive(file): 456852 kB -Unevictable: 3096 kB -Mlocked: 3096 kB -SwapTotal: 32768 kB -SwapFree: 4096 kB -Dirty: 32 kB -Writeback: 0 kB -AnonPages: 74988 kB -Mapped: 62624 kB -Shmem: 4020 kB -Slab: 86464 kB -SReclaimable: 44432 kB -SUnreclaim: 42032 kB -KernelStack: 4880 kB -PageTables: 2900 kB -NFS_Unstable: 0 kB -Bounce: 0 kB -WritebackTmp: 0 kB -CommitLimit: 1509868 kB -Committed_AS: 80296 kB -VmallocTotal: 263061440 kB -VmallocUsed: 65536 kB -VmallocChunk: 0 kB -AnonHugePages: 6144 kB -ShmemHugePages: 0 kB -ShmemPmdMapped: 0 kB -CmaTotal: 131072 kB -CmaFree: 130380 kB -HugePages_Total: 0 -HugePages_Free: 0 -HugePages_Rsvd: 0 -HugePages_Surp: 0 -Hugepagesize: 2048 kB)meminfo"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(meminfo, tf.fd)); - - SysMemInfo mi; - ASSERT_TRUE(mi.ReadMemInfo(tf.path)); - EXPECT_EQ(mi.mem_total_kb(), 3019740); - EXPECT_EQ(mi.mem_free_kb(), 1809728); - EXPECT_EQ(mi.mem_buffers_kb(), 54736); - EXPECT_EQ(mi.mem_cached_kb(), 776052); - EXPECT_EQ(mi.mem_shmem_kb(), 4020); - EXPECT_EQ(mi.mem_slab_kb(), 86464); - EXPECT_EQ(mi.mem_slab_reclaimable_kb(), 44432); - EXPECT_EQ(mi.mem_slab_unreclaimable_kb(), 42032); - EXPECT_EQ(mi.mem_swap_kb(), 32768); - EXPECT_EQ(mi.mem_swap_free_kb(), 4096); - EXPECT_EQ(mi.mem_mapped_kb(), 62624); - EXPECT_EQ(mi.mem_vmalloc_used_kb(), 65536); - EXPECT_EQ(mi.mem_page_tables_kb(), 2900); - EXPECT_EQ(mi.mem_kernel_stack_kb(), 4880); -} - -TEST(SysMemInfo, TestEmptyFile) { - TemporaryFile tf; - std::string empty_string = ""; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(empty_string, tf.fd)); - - SysMemInfo mi; - EXPECT_TRUE(mi.ReadMemInfo(tf.path)); - EXPECT_EQ(mi.mem_total_kb(), 0); -} - -TEST(SysMemInfo, TestZramTotal) { - std::string exec_dir = ::android::base::GetExecutableDirectory(); - - SysMemInfo mi; - std::string zram_mmstat_dir = exec_dir + "/testdata1/"; - EXPECT_EQ(mi.mem_zram_kb(zram_mmstat_dir.c_str()), 30504); - - std::string zram_memused_dir = exec_dir + "/testdata2/"; - EXPECT_EQ(mi.mem_zram_kb(zram_memused_dir.c_str()), 30504); -} - -enum { - MEMINFO_TOTAL, - MEMINFO_FREE, - MEMINFO_BUFFERS, - MEMINFO_CACHED, - MEMINFO_SHMEM, - MEMINFO_SLAB, - MEMINFO_SLAB_RECLAIMABLE, - MEMINFO_SLAB_UNRECLAIMABLE, - MEMINFO_SWAP_TOTAL, - MEMINFO_SWAP_FREE, - MEMINFO_ZRAM_TOTAL, - MEMINFO_MAPPED, - MEMINFO_VMALLOC_USED, - MEMINFO_PAGE_TABLES, - MEMINFO_KERNEL_STACK, - MEMINFO_COUNT -}; - -TEST(SysMemInfo, TestZramWithTags) { - std::string meminfo = R"meminfo(MemTotal: 3019740 kB -MemFree: 1809728 kB -MemAvailable: 2546560 kB -Buffers: 54736 kB -Cached: 776052 kB -SwapCached: 0 kB -Active: 445856 kB -Inactive: 459092 kB -Active(anon): 78492 kB -Inactive(anon): 2240 kB -Active(file): 367364 kB -Inactive(file): 456852 kB -Unevictable: 3096 kB -Mlocked: 3096 kB -SwapTotal: 32768 kB -SwapFree: 4096 kB -Dirty: 32 kB -Writeback: 0 kB -AnonPages: 74988 kB -Mapped: 62624 kB -Shmem: 4020 kB -Slab: 86464 kB -SReclaimable: 44432 kB -SUnreclaim: 42032 kB -KernelStack: 4880 kB -PageTables: 2900 kB -NFS_Unstable: 0 kB -Bounce: 0 kB -WritebackTmp: 0 kB -CommitLimit: 1509868 kB -Committed_AS: 80296 kB -VmallocTotal: 263061440 kB -VmallocUsed: 65536 kB -VmallocChunk: 0 kB -AnonHugePages: 6144 kB -ShmemHugePages: 0 kB -ShmemPmdMapped: 0 kB -CmaTotal: 131072 kB -CmaFree: 130380 kB -HugePages_Total: 0 -HugePages_Free: 0 -HugePages_Rsvd: 0 -HugePages_Surp: 0 -Hugepagesize: 2048 kB)meminfo"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(meminfo, tf.fd)); - std::string file = std::string(tf.path); - std::vector mem; - std::vector tags(SysMemInfo::kDefaultSysMemInfoTags.begin(), - SysMemInfo::kDefaultSysMemInfoTags.end()); - auto it = tags.begin(); - tags.insert(it + MEMINFO_ZRAM_TOTAL, "Zram:"); - SysMemInfo mi; - - // Read system memory info - mem.resize(tags.size()); - EXPECT_TRUE(mi.ReadMemInfo(tags.size(), tags.data(), mem.data(), file.c_str())); - EXPECT_EQ(mem[MEMINFO_TOTAL], 3019740); - EXPECT_EQ(mem[MEMINFO_FREE], 1809728); - EXPECT_EQ(mem[MEMINFO_BUFFERS], 54736); - EXPECT_EQ(mem[MEMINFO_CACHED], 776052); - EXPECT_EQ(mem[MEMINFO_SHMEM], 4020); - EXPECT_EQ(mem[MEMINFO_SLAB], 86464); - EXPECT_EQ(mem[MEMINFO_SLAB_RECLAIMABLE], 44432); - EXPECT_EQ(mem[MEMINFO_SLAB_UNRECLAIMABLE], 42032); - EXPECT_EQ(mem[MEMINFO_SWAP_TOTAL], 32768); - EXPECT_EQ(mem[MEMINFO_SWAP_FREE], 4096); - EXPECT_EQ(mem[MEMINFO_MAPPED], 62624); - EXPECT_EQ(mem[MEMINFO_VMALLOC_USED], 65536); - EXPECT_EQ(mem[MEMINFO_PAGE_TABLES], 2900); - EXPECT_EQ(mem[MEMINFO_KERNEL_STACK], 4880); -} - -TEST(SysMemInfo, TestVmallocInfoNoMemory) { - std::string vmallocinfo = - R"vmallocinfo(0x0000000000000000-0x0000000000000000 69632 of_iomap+0x78/0xb0 phys=17a00000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=b220000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17c90000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17ca0000 ioremap)vmallocinfo"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd)); - std::string file = std::string(tf.path); - - EXPECT_EQ(ReadVmallocInfo(file.c_str()), 0); -} - -TEST(SysMemInfo, TestVmallocInfoKernel) { - std::string vmallocinfo = - R"vmallocinfo(0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc)vmallocinfo"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd)); - std::string file = std::string(tf.path); - - EXPECT_EQ(ReadVmallocInfo(file.c_str()), getpagesize()); -} - -TEST(SysMemInfo, TestVmallocInfoModule) { - std::string vmallocinfo = - R"vmallocinfo(0x0000000000000000-0x0000000000000000 28672 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=6 vmalloc)vmallocinfo"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd)); - std::string file = std::string(tf.path); - - EXPECT_EQ(ReadVmallocInfo(file.c_str()), 6 * getpagesize()); -} - -TEST(SysMemInfo, TestVmallocInfoAll) { - std::string vmallocinfo = - R"vmallocinfo(0x0000000000000000-0x0000000000000000 69632 of_iomap+0x78/0xb0 phys=17a00000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=b220000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17c90000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17ca0000 ioremap -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 28672 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=6 vmalloc)vmallocinfo"; - - TemporaryFile tf; - ASSERT_TRUE(tf.fd != -1); - ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd)); - std::string file = std::string(tf.path); - - EXPECT_EQ(ReadVmallocInfo(file.c_str()), 7 * getpagesize()); -} - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - ::android::base::InitLogging(argv, android::base::StderrLogger); - pid = getpid(); - return RUN_ALL_TESTS(); -} diff --git a/libmeminfo/meminfo_private.h b/libmeminfo/meminfo_private.h deleted file mode 100644 index df5699c18..000000000 --- a/libmeminfo/meminfo_private.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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. - */ - -#pragma once - -#include -#include - -#include -#include -#include -#include - -// Macros to do per-page flag manipulation -#define _BITS(x, offset, bits) (((x) >> (offset)) & ((1LL << (bits)) - 1)) -#define PAGE_PRESENT(x) (_BITS(x, 63, 1)) -#define PAGE_SWAPPED(x) (_BITS(x, 62, 1)) -#define PAGE_SHIFT(x) (_BITS(x, 55, 6)) -#define PAGE_PFN(x) (_BITS(x, 0, 55)) -#define PAGE_SWAP_OFFSET(x) (_BITS(x, 5, 50)) -#define PAGE_SWAP_TYPE(x) (_BITS(x, 0, 5)) diff --git a/libmeminfo/pageacct.cpp b/libmeminfo/pageacct.cpp deleted file mode 100644 index cb17af8ab..000000000 --- a/libmeminfo/pageacct.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - * 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 -#include - -#include "meminfo_private.h" - -using unique_fd = ::android::base::unique_fd; - -namespace android { -namespace meminfo { - -static inline off64_t pfn_to_idle_bitmap_offset(uint64_t pfn) { - return static_cast((pfn >> 6) << 3); -} - -uint64_t pagesize(void) { - static uint64_t pagesize = sysconf(_SC_PAGE_SIZE); - return pagesize; -} - -bool PageAcct::InitPageAcct(bool pageidle_enable) { - if (pageidle_enable && !PageAcct::KernelHasPageIdle()) { - LOG(ERROR) << "Idle page tracking is not supported by the kernel"; - return false; - } - - if (kpagecount_fd_ < 0) { - unique_fd count_fd(TEMP_FAILURE_RETRY(open("/proc/kpagecount", O_RDONLY | O_CLOEXEC))); - if (count_fd < 0) { - PLOG(ERROR) << "Failed to open /proc/kpagecount"; - return false; - } - kpagecount_fd_ = std::move(count_fd); - } - - if (kpageflags_fd_ < 0) { - unique_fd flags_fd(TEMP_FAILURE_RETRY(open("/proc/kpageflags", O_RDONLY | O_CLOEXEC))); - if (flags_fd < 0) { - PLOG(ERROR) << "Failed to open /proc/kpageflags"; - return false; - } - kpageflags_fd_ = std::move(flags_fd); - } - - if (pageidle_enable && pageidle_fd_ < 0) { - unique_fd idle_fd( - TEMP_FAILURE_RETRY(open("/sys/kernel/mm/page_idle/bitmap", O_RDWR | O_CLOEXEC))); - if (idle_fd < 0) { - PLOG(ERROR) << "Failed to open page idle bitmap"; - return false; - } - pageidle_fd_ = std::move(idle_fd); - } - - return true; -} - -bool PageAcct::PageFlags(uint64_t pfn, uint64_t* flags) { - if (!flags) return false; - - if (kpageflags_fd_ < 0) { - if (!InitPageAcct()) return false; - } - - if (pread64(kpageflags_fd_, flags, sizeof(uint64_t), pfn * sizeof(uint64_t)) != - sizeof(uint64_t)) { - PLOG(ERROR) << "Failed to read page flags for page " << pfn; - return false; - } - return true; -} - -bool PageAcct::PageMapCount(uint64_t pfn, uint64_t* mapcount) { - if (!mapcount) return false; - - if (kpagecount_fd_ < 0) { - if (!InitPageAcct()) return false; - } - - if (pread64(kpagecount_fd_, mapcount, sizeof(uint64_t), pfn * sizeof(uint64_t)) != - sizeof(uint64_t)) { - PLOG(ERROR) << "Failed to read map count for page " << pfn; - return false; - } - return true; -} - -int PageAcct::IsPageIdle(uint64_t pfn) { - if (pageidle_fd_ < 0) { - if (!InitPageAcct(true)) return -EOPNOTSUPP; - } - - int idle_status = MarkPageIdle(pfn); - if (idle_status) return idle_status; - - return GetPageIdle(pfn); -} - -int PageAcct::MarkPageIdle(uint64_t pfn) const { - off64_t offset = pfn_to_idle_bitmap_offset(pfn); - // set the bit corresponding to page frame - uint64_t idle_bits = 1ULL << (pfn % 64); - - if (pwrite64(pageidle_fd_, &idle_bits, sizeof(uint64_t), offset) < 0) { - PLOG(ERROR) << "Failed to write page idle bitmap for page " << pfn; - return -errno; - } - - return 0; -} - -int PageAcct::GetPageIdle(uint64_t pfn) const { - off64_t offset = pfn_to_idle_bitmap_offset(pfn); - uint64_t idle_bits; - - if (pread64(pageidle_fd_, &idle_bits, sizeof(uint64_t), offset) != sizeof(uint64_t)) { - PLOG(ERROR) << "Failed to read page idle bitmap for page " << pfn; - return -errno; - } - - return !!(idle_bits & (1ULL << (pfn % 64))); -} - -// Public methods -bool page_present(uint64_t pagemap_val) { - return PAGE_PRESENT(pagemap_val); -} - -bool page_swapped(uint64_t pagemap_val) { - return PAGE_SWAPPED(pagemap_val); -} - -uint64_t page_pfn(uint64_t pagemap_val) { - return PAGE_PFN(pagemap_val); -} - -} // namespace meminfo -} // namespace android diff --git a/libmeminfo/procmeminfo.cpp b/libmeminfo/procmeminfo.cpp deleted file mode 100644 index 9e9a70551..000000000 --- a/libmeminfo/procmeminfo.cpp +++ /dev/null @@ -1,569 +0,0 @@ -/* - * 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 -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "meminfo_private.h" - -namespace android { -namespace meminfo { - -static void add_mem_usage(MemUsage* to, const MemUsage& from) { - to->vss += from.vss; - to->rss += from.rss; - to->pss += from.pss; - to->uss += from.uss; - - to->swap += from.swap; - - to->private_clean += from.private_clean; - to->private_dirty += from.private_dirty; - - to->shared_clean += from.shared_clean; - to->shared_dirty += from.shared_dirty; -} - -// Returns true if the line was valid smaps stats line false otherwise. -static bool parse_smaps_field(const char* line, MemUsage* stats) { - char field[64]; - int len; - if (sscanf(line, "%63s %n", field, &len) == 1 && *field && field[strlen(field) - 1] == ':') { - const char* c = line + len; - switch (field[0]) { - case 'P': - if (strncmp(field, "Pss:", 4) == 0) { - stats->pss = strtoull(c, nullptr, 10); - } else if (strncmp(field, "Private_Clean:", 14) == 0) { - uint64_t prcl = strtoull(c, nullptr, 10); - stats->private_clean = prcl; - stats->uss += prcl; - } else if (strncmp(field, "Private_Dirty:", 14) == 0) { - uint64_t prdi = strtoull(c, nullptr, 10); - stats->private_dirty = prdi; - stats->uss += prdi; - } - break; - case 'S': - if (strncmp(field, "Size:", 5) == 0) { - stats->vss = strtoull(c, nullptr, 10); - } else if (strncmp(field, "Shared_Clean:", 13) == 0) { - stats->shared_clean = strtoull(c, nullptr, 10); - } else if (strncmp(field, "Shared_Dirty:", 13) == 0) { - stats->shared_dirty = strtoull(c, nullptr, 10); - } else if (strncmp(field, "Swap:", 5) == 0) { - stats->swap = strtoull(c, nullptr, 10); - } else if (strncmp(field, "SwapPss:", 8) == 0) { - stats->swap_pss = strtoull(c, nullptr, 10); - } - break; - case 'R': - if (strncmp(field, "Rss:", 4) == 0) { - stats->rss = strtoull(c, nullptr, 10); - } - break; - } - return true; - } - - return false; -} - -bool ProcMemInfo::ResetWorkingSet(pid_t pid) { - std::string clear_refs_path = ::android::base::StringPrintf("/proc/%d/clear_refs", pid); - if (!::android::base::WriteStringToFile("1\n", clear_refs_path)) { - PLOG(ERROR) << "Failed to write to " << clear_refs_path; - return false; - } - - return true; -} - -ProcMemInfo::ProcMemInfo(pid_t pid, bool get_wss, uint64_t pgflags, uint64_t pgflags_mask) - : pid_(pid), get_wss_(get_wss), pgflags_(pgflags), pgflags_mask_(pgflags_mask) {} - -const std::vector& ProcMemInfo::Maps() { - if (maps_.empty() && !ReadMaps(get_wss_)) { - LOG(ERROR) << "Failed to read maps for Process " << pid_; - } - - return maps_; -} - -const std::vector& ProcMemInfo::MapsWithPageIdle() { - if (maps_.empty() && !ReadMaps(get_wss_, true)) { - LOG(ERROR) << "Failed to read maps with page idle for Process " << pid_; - } - - return maps_; -} - -const std::vector& ProcMemInfo::MapsWithoutUsageStats() { - if (maps_.empty() && !ReadMaps(get_wss_, false, false)) { - LOG(ERROR) << "Failed to read maps for Process " << pid_; - } - - return maps_; -} - -const std::vector& ProcMemInfo::Smaps(const std::string& path) { - if (!maps_.empty()) { - return maps_; - } - - auto collect_vmas = [&](const Vma& vma) { maps_.emplace_back(vma); }; - if (path.empty() && !ForEachVma(collect_vmas)) { - LOG(ERROR) << "Failed to read smaps for Process " << pid_; - maps_.clear(); - } - - if (!path.empty() && !ForEachVmaFromFile(path, collect_vmas)) { - LOG(ERROR) << "Failed to read smaps from file " << path; - maps_.clear(); - } - - return maps_; -} - -const MemUsage& ProcMemInfo::Usage() { - if (get_wss_) { - LOG(WARNING) << "Trying to read process memory usage for " << pid_ - << " using invalid object"; - return usage_; - } - - if (maps_.empty() && !ReadMaps(get_wss_)) { - LOG(ERROR) << "Failed to get memory usage for Process " << pid_; - } - - return usage_; -} - -const MemUsage& ProcMemInfo::Wss() { - if (!get_wss_) { - LOG(WARNING) << "Trying to read process working set for " << pid_ - << " using invalid object"; - return usage_; - } - - if (maps_.empty() && !ReadMaps(get_wss_)) { - LOG(ERROR) << "Failed to get working set for Process " << pid_; - } - - return usage_; -} - -bool ProcMemInfo::ForEachVma(const VmaCallback& callback) { - std::string path = ::android::base::StringPrintf("/proc/%d/smaps", pid_); - return ForEachVmaFromFile(path, callback); -} - -bool ProcMemInfo::SmapsOrRollup(MemUsage* stats) const { - std::string path = ::android::base::StringPrintf( - "/proc/%d/%s", pid_, IsSmapsRollupSupported(pid_) ? "smaps_rollup" : "smaps"); - return SmapsOrRollupFromFile(path, stats); -} - -bool ProcMemInfo::SmapsOrRollupPss(uint64_t* pss) const { - std::string path = ::android::base::StringPrintf( - "/proc/%d/%s", pid_, IsSmapsRollupSupported(pid_) ? "smaps_rollup" : "smaps"); - return SmapsOrRollupPssFromFile(path, pss); -} - -const std::vector& ProcMemInfo::SwapOffsets() { - if (get_wss_) { - LOG(WARNING) << "Trying to read process swap offsets for " << pid_ - << " using invalid object"; - return swap_offsets_; - } - - if (maps_.empty() && !ReadMaps(get_wss_)) { - LOG(ERROR) << "Failed to get swap offsets for Process " << pid_; - } - - return swap_offsets_; -} - -bool ProcMemInfo::PageMap(const Vma& vma, std::vector* pagemap) { - pagemap->clear(); - std::string pagemap_file = ::android::base::StringPrintf("/proc/%d/pagemap", pid_); - ::android::base::unique_fd pagemap_fd( - TEMP_FAILURE_RETRY(open(pagemap_file.c_str(), O_RDONLY | O_CLOEXEC))); - if (pagemap_fd == -1) { - PLOG(ERROR) << "Failed to open " << pagemap_file; - return false; - } - - uint64_t nr_pages = (vma.end - vma.start) / getpagesize(); - pagemap->resize(nr_pages); - - size_t bytes_to_read = sizeof(uint64_t) * nr_pages; - off64_t start_addr = (vma.start / getpagesize()) * sizeof(uint64_t); - ssize_t bytes_read = pread64(pagemap_fd, pagemap->data(), bytes_to_read, start_addr); - if (bytes_read == -1) { - PLOG(ERROR) << "Failed to read page frames from page map for pid: " << pid_; - return false; - } else if (static_cast(bytes_read) != bytes_to_read) { - LOG(ERROR) << "Failed to read page frames from page map for pid: " << pid_ - << ": read bytes " << bytes_read << " expected bytes " << bytes_to_read; - return false; - } - - return true; -} - -static int GetPagemapFd(pid_t pid) { - std::string pagemap_file = ::android::base::StringPrintf("/proc/%d/pagemap", pid); - int fd = TEMP_FAILURE_RETRY(open(pagemap_file.c_str(), O_RDONLY | O_CLOEXEC)); - if (fd == -1) { - PLOG(ERROR) << "Failed to open " << pagemap_file; - } - return fd; -} - -bool ProcMemInfo::ReadMaps(bool get_wss, bool use_pageidle, bool get_usage_stats) { - // Each object reads /proc//maps only once. This is done to make sure programs that are - // running for the lifetime of the system can recycle the objects and don't have to - // unnecessarily retain and update this object in memory (which can get significantly large). - // E.g. A program that only needs to reset the working set will never all ->Maps(), ->Usage(). - // E.g. A program that is monitoring smaps_rollup, may never call ->maps(), Usage(), so it - // doesn't make sense for us to parse and retain unnecessary memory accounting stats by default. - if (!maps_.empty()) return true; - - // parse and read /proc//maps - std::string maps_file = ::android::base::StringPrintf("/proc/%d/maps", pid_); - if (!::android::procinfo::ReadMapFile( - maps_file, [&](uint64_t start, uint64_t end, uint16_t flags, uint64_t pgoff, ino_t, - const char* name) { - maps_.emplace_back(Vma(start, end, pgoff, flags, name)); - })) { - LOG(ERROR) << "Failed to parse " << maps_file; - maps_.clear(); - return false; - } - - if (!get_usage_stats) { - return true; - } - - ::android::base::unique_fd pagemap_fd(GetPagemapFd(pid_)); - if (pagemap_fd == -1) { - return false; - } - - for (auto& vma : maps_) { - if (!ReadVmaStats(pagemap_fd.get(), vma, get_wss, use_pageidle)) { - LOG(ERROR) << "Failed to read page map for vma " << vma.name << "[" << vma.start << "-" - << vma.end << "]"; - maps_.clear(); - return false; - } - add_mem_usage(&usage_, vma.usage); - } - - return true; -} - -bool ProcMemInfo::FillInVmaStats(Vma& vma) { - ::android::base::unique_fd pagemap_fd(GetPagemapFd(pid_)); - if (pagemap_fd == -1) { - return false; - } - - if (!ReadVmaStats(pagemap_fd.get(), vma, get_wss_, false)) { - LOG(ERROR) << "Failed to read page map for vma " << vma.name << "[" << vma.start << "-" - << vma.end << "]"; - return false; - } - return true; -} - -bool ProcMemInfo::ReadVmaStats(int pagemap_fd, Vma& vma, bool get_wss, bool use_pageidle) { - PageAcct& pinfo = PageAcct::Instance(); - if (get_wss && use_pageidle && !pinfo.InitPageAcct(true)) { - LOG(ERROR) << "Failed to init idle page accounting"; - return false; - } - - uint64_t pagesz = getpagesize(); - size_t num_pages = (vma.end - vma.start) / pagesz; - size_t first_page = vma.start / pagesz; - - std::vector page_cache; - size_t cur_page_cache_index = 0; - size_t num_in_page_cache = 0; - size_t num_leftover_pages = num_pages; - for (size_t cur_page = first_page; cur_page < first_page + num_pages; ++cur_page) { - if (!get_wss) { - vma.usage.vss += pagesz; - } - - // Cache page map data. - if (cur_page_cache_index == num_in_page_cache) { - static constexpr size_t kMaxPages = 2048; - num_leftover_pages -= num_in_page_cache; - if (num_leftover_pages > kMaxPages) { - num_in_page_cache = kMaxPages; - } else { - num_in_page_cache = num_leftover_pages; - } - page_cache.resize(num_in_page_cache); - size_t total_bytes = page_cache.size() * sizeof(uint64_t); - ssize_t bytes = pread64(pagemap_fd, page_cache.data(), total_bytes, - cur_page * sizeof(uint64_t)); - if (bytes != total_bytes) { - if (bytes == -1) { - PLOG(ERROR) << "Failed to read page data at offset 0x" << std::hex - << cur_page * sizeof(uint64_t); - } else { - LOG(ERROR) << "Failed to read page data at offset 0x" << std::hex - << cur_page * sizeof(uint64_t) << std::dec << " read bytes " << bytes - << " expected bytes " << total_bytes; - } - return false; - } - cur_page_cache_index = 0; - } - - uint64_t page_info = page_cache[cur_page_cache_index++]; - if (!PAGE_PRESENT(page_info) && !PAGE_SWAPPED(page_info)) continue; - - if (PAGE_SWAPPED(page_info)) { - vma.usage.swap += pagesz; - swap_offsets_.emplace_back(PAGE_SWAP_OFFSET(page_info)); - continue; - } - - uint64_t page_frame = PAGE_PFN(page_info); - uint64_t cur_page_flags; - if (!pinfo.PageFlags(page_frame, &cur_page_flags)) { - LOG(ERROR) << "Failed to get page flags for " << page_frame << " in process " << pid_; - swap_offsets_.clear(); - return false; - } - - // skip unwanted pages from the count - if ((cur_page_flags & pgflags_mask_) != pgflags_) continue; - - uint64_t cur_page_counts; - if (!pinfo.PageMapCount(page_frame, &cur_page_counts)) { - LOG(ERROR) << "Failed to get page count for " << page_frame << " in process " << pid_; - swap_offsets_.clear(); - return false; - } - - // Page was unmapped between the presence check at the beginning of the loop and here. - if (cur_page_counts == 0) { - continue; - } - - bool is_dirty = !!(cur_page_flags & (1 << KPF_DIRTY)); - bool is_private = (cur_page_counts == 1); - // Working set - if (get_wss) { - bool is_referenced = use_pageidle ? (pinfo.IsPageIdle(page_frame) == 1) - : !!(cur_page_flags & (1 << KPF_REFERENCED)); - if (!is_referenced) { - continue; - } - // This effectively makes vss = rss for the working set is requested. - // The libpagemap implementation returns vss > rss for - // working set, which doesn't make sense. - vma.usage.vss += pagesz; - } - - vma.usage.rss += pagesz; - vma.usage.uss += is_private ? pagesz : 0; - vma.usage.pss += pagesz / cur_page_counts; - if (is_private) { - vma.usage.private_dirty += is_dirty ? pagesz : 0; - vma.usage.private_clean += is_dirty ? 0 : pagesz; - } else { - vma.usage.shared_dirty += is_dirty ? pagesz : 0; - vma.usage.shared_clean += is_dirty ? 0 : pagesz; - } - } - return true; -} - -// Public APIs -bool ForEachVmaFromFile(const std::string& path, const VmaCallback& callback) { - auto fp = std::unique_ptr{fopen(path.c_str(), "re"), fclose}; - if (fp == nullptr) { - return false; - } - - char* line = nullptr; - bool parsing_vma = false; - ssize_t line_len; - size_t line_alloc = 0; - Vma vma; - while ((line_len = getline(&line, &line_alloc, fp.get())) > 0) { - // Make sure the line buffer terminates like a C string for ReadMapFile - line[line_len] = '\0'; - - if (parsing_vma) { - if (parse_smaps_field(line, &vma.usage)) { - // This was a stats field - continue; - } - - // Done collecting stats, make the call back - callback(vma); - parsing_vma = false; - } - - vma.clear(); - // If it has, we are looking for the vma stats - // 00400000-00409000 r-xp 00000000 fc:00 426998 /usr/lib/gvfs/gvfsd-http - if (!::android::procinfo::ReadMapFileContent( - line, [&](uint64_t start, uint64_t end, uint16_t flags, uint64_t pgoff, ino_t, - const char* name) { - vma.start = start; - vma.end = end; - vma.flags = flags; - vma.offset = pgoff; - vma.name = name; - })) { - LOG(ERROR) << "Failed to parse " << path; - return false; - } - parsing_vma = true; - } - - // free getline() managed buffer - free(line); - - if (parsing_vma) { - callback(vma); - } - - return true; -} - -enum smaps_rollup_support { UNTRIED, SUPPORTED, UNSUPPORTED }; - -static std::atomic g_rollup_support = UNTRIED; - -bool IsSmapsRollupSupported(pid_t pid) { - // Similar to OpenSmapsOrRollup checks from android_os_Debug.cpp, except - // the method only checks if rollup is supported and returns the status - // right away. - enum smaps_rollup_support rollup_support = g_rollup_support.load(std::memory_order_relaxed); - if (rollup_support != UNTRIED) { - return rollup_support == SUPPORTED; - } - std::string rollup_file = ::android::base::StringPrintf("/proc/%d/smaps_rollup", pid); - if (access(rollup_file.c_str(), F_OK | R_OK)) { - // No check for errno = ENOENT necessary here. The caller MUST fallback to - // using /proc//smaps instead anyway. - g_rollup_support.store(UNSUPPORTED, std::memory_order_relaxed); - return false; - } - - g_rollup_support.store(SUPPORTED, std::memory_order_relaxed); - LOG(INFO) << "Using smaps_rollup for pss collection"; - return true; -} - -bool SmapsOrRollupFromFile(const std::string& path, MemUsage* stats) { - auto fp = std::unique_ptr{fopen(path.c_str(), "re"), fclose}; - if (fp == nullptr) { - return false; - } - - char* line = nullptr; - size_t line_alloc = 0; - stats->clear(); - while (getline(&line, &line_alloc, fp.get()) > 0) { - switch (line[0]) { - case 'P': - if (strncmp(line, "Pss:", 4) == 0) { - char* c = line + 4; - stats->pss += strtoull(c, nullptr, 10); - } else if (strncmp(line, "Private_Clean:", 14) == 0) { - char* c = line + 14; - uint64_t prcl = strtoull(c, nullptr, 10); - stats->private_clean += prcl; - stats->uss += prcl; - } else if (strncmp(line, "Private_Dirty:", 14) == 0) { - char* c = line + 14; - uint64_t prdi = strtoull(c, nullptr, 10); - stats->private_dirty += prdi; - stats->uss += prdi; - } - break; - case 'R': - if (strncmp(line, "Rss:", 4) == 0) { - char* c = line + 4; - stats->rss += strtoull(c, nullptr, 10); - } - break; - case 'S': - if (strncmp(line, "SwapPss:", 8) == 0) { - char* c = line + 8; - stats->swap_pss += strtoull(c, nullptr, 10); - } - break; - } - } - - // free getline() managed buffer - free(line); - return true; -} - -bool SmapsOrRollupPssFromFile(const std::string& path, uint64_t* pss) { - auto fp = std::unique_ptr{fopen(path.c_str(), "re"), fclose}; - if (fp == nullptr) { - return false; - } - *pss = 0; - char* line = nullptr; - size_t line_alloc = 0; - while (getline(&line, &line_alloc, fp.get()) > 0) { - uint64_t v; - if (sscanf(line, "Pss: %" SCNu64 " kB", &v) == 1) { - *pss += v; - } - } - - // free getline() managed buffer - free(line); - return true; -} - -} // namespace meminfo -} // namespace android diff --git a/libmeminfo/sysmeminfo.cpp b/libmeminfo/sysmeminfo.cpp deleted file mode 100644 index ef68ac4aa..000000000 --- a/libmeminfo/sysmeminfo.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/* - * 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 -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "meminfo_private.h" - -namespace android { -namespace meminfo { - -bool SysMemInfo::ReadMemInfo(const char* path) { - return ReadMemInfo(path, SysMemInfo::kDefaultSysMemInfoTags.size(), - &*SysMemInfo::kDefaultSysMemInfoTags.begin(), - [&](std::string_view tag, uint64_t val) { - // Safe to store the string_view in the map - // because the tags from - // kDefaultSysMemInfoTags are all - // statically-allocated. - mem_in_kb_[tag] = val; - }); -} - -bool SysMemInfo::ReadMemInfo(std::vector* out, const char* path) { - out->clear(); - out->resize(SysMemInfo::kDefaultSysMemInfoTags.size()); - return ReadMemInfo(SysMemInfo::kDefaultSysMemInfoTags.size(), - &*SysMemInfo::kDefaultSysMemInfoTags.begin(), out->data(), path); -} - -bool SysMemInfo::ReadMemInfo(size_t ntags, const std::string_view* tags, uint64_t* out, - const char* path) { - return ReadMemInfo(path, ntags, tags, [&]([[maybe_unused]] std::string_view tag, uint64_t val) { - auto it = std::find(tags, tags + ntags, tag); - if (it == tags + ntags) { - LOG(ERROR) << "Tried to store invalid tag: " << tag; - return; - } - auto index = std::distance(tags, it); - // store the values in the same order as the tags - out[index] = val; - }); -} - -uint64_t SysMemInfo::ReadVmallocInfo() { - return ::android::meminfo::ReadVmallocInfo(); -} - -bool SysMemInfo::ReadMemInfo(const char* path, size_t ntags, const std::string_view* tags, - std::function store_val) { - char buffer[4096]; - int fd = open(path, O_RDONLY | O_CLOEXEC); - if (fd < 0) { - PLOG(ERROR) << "Failed to open file :" << path; - return false; - } - - const int len = read(fd, buffer, sizeof(buffer) - 1); - close(fd); - if (len < 0) { - return false; - } - - buffer[len] = '\0'; - char* p = buffer; - uint32_t found = 0; - uint32_t lineno = 0; - bool zram_tag_found = false; - while (*p && found < ntags) { - for (size_t tagno = 0; tagno < ntags; ++tagno) { - const std::string_view& tag = tags[tagno]; - // Special case for "Zram:" tag that android_os_Debug and friends look - // up along with the rest of the numbers from /proc/meminfo - if (!zram_tag_found && tag == "Zram:") { - store_val(tag, mem_zram_kb()); - zram_tag_found = true; - found++; - continue; - } - - if (strncmp(p, tag.data(), tag.size()) == 0) { - p += tag.size(); - while (*p == ' ') p++; - char* endptr = nullptr; - uint64_t val = strtoull(p, &endptr, 10); - if (p == endptr) { - PLOG(ERROR) << "Failed to parse line:" << lineno + 1 << " in file: " << path; - return false; - } - store_val(tag, val); - p = endptr; - found++; - break; - } - } - - while (*p && *p != '\n') { - p++; - } - if (*p) p++; - lineno++; - } - - return true; -} - -uint64_t SysMemInfo::mem_zram_kb(const char* zram_dev_cstr) { - uint64_t mem_zram_total = 0; - if (zram_dev_cstr) { - if (!MemZramDevice(zram_dev_cstr, &mem_zram_total)) { - return 0; - } - return mem_zram_total / 1024; - } - - constexpr uint32_t kMaxZramDevices = 256; - for (uint32_t i = 0; i < kMaxZramDevices; i++) { - std::string zram_dev_abspath = ::android::base::StringPrintf("/sys/block/zram%u/", i); - if (access(zram_dev_abspath.c_str(), F_OK)) { - // We assume zram devices appear in range 0-255 and appear always in sequence - // under /sys/block. So, stop looking for them once we find one is missing. - break; - } - - uint64_t mem_zram_dev; - if (!MemZramDevice(zram_dev_abspath.c_str(), &mem_zram_dev)) { - return 0; - } - - mem_zram_total += mem_zram_dev; - } - - return mem_zram_total / 1024; -} - -bool SysMemInfo::MemZramDevice(const char* zram_dev, uint64_t* mem_zram_dev) { - std::string mmstat = ::android::base::StringPrintf("%s/%s", zram_dev, "mm_stat"); - auto mmstat_fp = std::unique_ptr{fopen(mmstat.c_str(), "re"), fclose}; - if (mmstat_fp != nullptr) { - // only if we do have mmstat, use it. Otherwise, fall through to trying out the old - // 'mem_used_total' - if (fscanf(mmstat_fp.get(), "%*" SCNu64 " %*" SCNu64 " %" SCNu64, mem_zram_dev) != 1) { - PLOG(ERROR) << "Malformed mm_stat file in: " << zram_dev; - return false; - } - return true; - } - - std::string content; - if (::android::base::ReadFileToString( - ::android::base::StringPrintf("%s/mem_used_total", zram_dev), &content)) { - *mem_zram_dev = strtoull(content.c_str(), NULL, 10); - if (*mem_zram_dev == ULLONG_MAX) { - PLOG(ERROR) << "Malformed mem_used_total file for zram dev: " << zram_dev - << " content: " << content; - return false; - } - - return true; - } - - LOG(ERROR) << "Can't find memory status under: " << zram_dev; - return false; -} - -// Public methods -uint64_t ReadVmallocInfo(const char* path) { - uint64_t vmalloc_total = 0; - auto fp = std::unique_ptr{fopen(path, "re"), fclose}; - if (fp == nullptr) { - return vmalloc_total; - } - - char* line = nullptr; - size_t line_alloc = 0; - while (getline(&line, &line_alloc, fp.get()) > 0) { - // We are looking for lines like - // - // 0x0000000000000000-0x0000000000000000 12288 drm_property_create_blob+0x44/0xec pages=2 vmalloc - // 0x0000000000000000-0x0000000000000000 8192 wlan_logging_sock_init_svc+0xf8/0x4f0 [wlan] pages=1 vmalloc - // - // Notice that if the caller is coming from a module, the kernel prints and extra - // "[module_name]" after the address and the symbol of the call site. This means we can't - // use the old sscanf() method of getting the # of pages. - char* p_start = strstr(line, "pages="); - if (p_start == nullptr) { - // we didn't find anything - continue; - } - - uint64_t nr_pages; - if (sscanf(p_start, "pages=%" SCNu64 "", &nr_pages) == 1) { - vmalloc_total += (nr_pages * getpagesize()); - } - } - - free(line); - - return vmalloc_total; -} - -} // namespace meminfo -} // namespace android diff --git a/libmeminfo/testdata1/mm_stat b/libmeminfo/testdata1/mm_stat deleted file mode 100644 index 32b325fa8..000000000 --- a/libmeminfo/testdata1/mm_stat +++ /dev/null @@ -1 +0,0 @@ - 145674240 26801454 31236096 0 45772800 3042 1887 517 diff --git a/libmeminfo/testdata1/showmap_test.sh b/libmeminfo/testdata1/showmap_test.sh deleted file mode 100755 index 8ee713ead..000000000 --- a/libmeminfo/testdata1/showmap_test.sh +++ /dev/null @@ -1,86 +0,0 @@ -#! /system/bin/sh - -TESTDATA_PATH=/data/nativetest64/libmeminfo_test/testdata1 -SMAPS=$TESTDATA_PATH/smaps -OUT1=$TMPDIR/1.txt -OUT2=$TMPDIR/2.txt - -showmap -f $SMAPS > $OUT1 -showmap2 -f $SMAPS > $OUT2 -diff $OUT1 $OUT2 > /dev/null -ret=$? -if [[ $ret != 0 ]]; then - echo "fail: showmap -f "; -else - echo "pass: showmap -f " -fi - -showmap -q -f $SMAPS > $OUT1 -showmap2 -q -f $SMAPS > $OUT2 -diff $OUT1 $OUT2 > /dev/null -ret=$? -if [[ $ret != 0 ]]; then - echo "fail: showmap -q -f "; -else - echo "pass: showmap -q -f " -fi - -showmap -v -f $SMAPS > $OUT1 -showmap2 -v -f $SMAPS > $OUT2 -diff $OUT1 $OUT2 > /dev/null -ret=$? -if [[ $ret != 0 ]]; then - echo "fail: showmap -v -f "; -else - echo "pass: showmap -v -f " -fi - -showmap -a -f $SMAPS > $OUT1 -showmap2 -a -f $SMAPS > $OUT2 -diff $OUT1 $OUT2 > /dev/null -ret=$? -if [[ $ret != 0 ]]; then - echo "fail: showmap -a -f "; -else - echo "pass: showmap -a -f " -fi - -# Note that all tests from here down that have the option -# '-a' added to the command are expected to fail as -# 'showmap2' actually fixes the 64-bit address truncating -# that was already happening with showmap -showmap -a -t -f $SMAPS > $OUT1 -showmap2 -a -t -f $SMAPS > $OUT2 -diff $OUT1 $OUT2 > /dev/null -ret=$? -if [[ $ret != 0 ]]; then - echo "fail: showmap -a -t -f "; -else - echo "pass: showmap -a -t -f " -fi - -showmap -a -t -v -f $SMAPS > $OUT1 -showmap2 -a -t -v -f $SMAPS > $OUT2 -diff $OUT1 $OUT2 > /dev/null -ret=$? -if [[ $ret != 0 ]]; then - echo "fail: showmap -a -t -v -f "; -else - echo "pass: showmap -a -t -v -f " -fi - -# Note: This test again is expected to fail as the new -# showmap fixes an issue with -t where the tool was only -# showing maps with private dirty pages. The '-t' option was however -# supposed to show all maps that have 'private' pages, clean or dirty. -showmap -t -f $SMAPS > $OUT1 -showmap2 -t -f $SMAPS > $OUT2 -diff $OUT1 $OUT2 > /dev/null -ret=$? -if [[ $ret != 0 ]]; then - echo "fail: showmap -t -f "; -else - echo "pass: showmap -t -f " -fi - - diff --git a/libmeminfo/testdata1/smaps b/libmeminfo/testdata1/smaps deleted file mode 100644 index 23aa2af3c..000000000 --- a/libmeminfo/testdata1/smaps +++ /dev/null @@ -1,56297 +0,0 @@ -12c00000-13440000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 8448 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2652 kB -Pss: 2652 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 2652 kB -Referenced: 2652 kB -Anonymous: 2652 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2652 kB -VmFlags: rd wr mr mw me ac -13440000-13500000 ---p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 768 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -13500000-13540000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 256 kB -Pss: 256 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 256 kB -Referenced: 256 kB -Anonymous: 256 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 256 kB -VmFlags: rd wr mr mw me ac -13540000-137c0000 ---p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 2560 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -137c0000-13880000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 768 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 740 kB -Pss: 740 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 740 kB -Referenced: 740 kB -Anonymous: 740 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 740 kB -VmFlags: rd wr mr mw me ac -13880000-13900000 ---p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 512 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -13900000-13940000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 256 kB -Pss: 256 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 256 kB -Referenced: 256 kB -Anonymous: 256 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 256 kB -VmFlags: rd wr mr mw me ac -13940000-13a40000 ---p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -13a40000-13a80000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 256 kB -Pss: 256 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 256 kB -Referenced: 256 kB -Anonymous: 256 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 256 kB -VmFlags: rd wr mr mw me ac -13a80000-13b40000 ---p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 768 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -13b40000-13b80000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 256 kB -Pss: 256 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 256 kB -Referenced: 256 kB -Anonymous: 256 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 256 kB -VmFlags: rd wr mr mw me ac -13b80000-13bc0000 ---p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -13bc0000-13d80000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 1792 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1792 kB -Pss: 1792 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 1792 kB -Referenced: 1792 kB -Anonymous: 1792 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1792 kB -VmFlags: rd wr mr mw me ac -13d80000-13dc0000 ---p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -13dc0000-13e00000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 256 kB -Pss: 256 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 256 kB -Referenced: 256 kB -Anonymous: 256 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 256 kB -VmFlags: rd wr mr mw me ac -13e00000-13e40000 ---p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -13e40000-13e80000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 256 kB -Pss: 256 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 256 kB -Referenced: 256 kB -Anonymous: 256 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 256 kB -VmFlags: rd wr mr mw me ac -13e80000-13ec0000 ---p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -13ec0000-52c00000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)] -Name: [anon:dalvik-main space (region space)] -Size: 1029376 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 768 kB -Pss: 768 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 768 kB -Referenced: 768 kB -Anonymous: 768 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 768 kB -VmFlags: rd wr mr mw me ac -52c00000-54c00000 rw-p 00000000 00:00 0 [anon:dalvik-zygote-data-code-cache] -Name: [anon:dalvik-zygote-data-code-cache] -Size: 32768 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2048 kB -Pss: 512 kB -Shared_Clean: 0 kB -Shared_Dirty: 2048 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 2048 kB -Anonymous: 2048 kB -AnonHugePages: 2048 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 512 kB -VmFlags: rd wr mr mw me ac -54c00000-56c00000 r-xp 00000000 00:00 0 [anon:dalvik-zygote-jit-code-cache] -Name: [anon:dalvik-zygote-jit-code-cache] -Size: 32768 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2048 kB -Pss: 113 kB -Shared_Clean: 0 kB -Shared_Dirty: 2048 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 2048 kB -Anonymous: 2048 kB -AnonHugePages: 2048 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 113 kB -VmFlags: rd ex mr mw me ac -56c00000-56c05000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -56c05000-56c37000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 200 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 200 kB -Pss: 11 kB -Shared_Clean: 0 kB -Shared_Dirty: 200 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 200 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 11 kB -VmFlags: rd wr mr mw me ac -56c37000-56c45000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -56c45000-56c4e000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 36 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 36 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd wr mr mw me ac -56c52000-56c5c000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 40 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 40 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd wr mr mw me ac -56c5c000-56c61000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 20 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr mr mw me ac -56c63000-56c6e000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 44 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 44 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd wr mr mw me ac -56c6e000-56c77000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -56c79000-56d05000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 560 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 560 kB -Pss: 31 kB -Shared_Clean: 0 kB -Shared_Dirty: 560 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 560 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 31 kB -VmFlags: rd wr mr mw me ac -56d05000-56d0e000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -56d10000-56d16000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd wr mr mw me ac -56d1d000-56d21000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -56d21000-58d21000 rw-s 00000000 00:05 9572 /memfd:/jit-cache (deleted) -Size: 32768 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr sh mr mw me ms -58d21000-5ad21000 r-xs 02000000 00:05 9572 /memfd:/jit-cache (deleted) -Size: 32768 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex sh mr mw me ms -5ad21000-5ae6f000 rw-p 00000000 00:00 0 [anon:dalvik-/system/framework/oat/x86_64/services.art] -Name: [anon:dalvik-/system/framework/oat/x86_64/services.art] -Size: 1336 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1336 kB -Pss: 1336 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 1336 kB -Referenced: 1336 kB -Anonymous: 1336 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1336 kB -VmFlags: rd wr mr mw me ac -5ae6f000-5aeb5000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 280 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 112 kB -Pss: 112 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 112 kB -Referenced: 112 kB -Anonymous: 112 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 112 kB -VmFlags: rd wr mr mw me ac -5aeb6000-5aebf000 rw-p 00000000 00:00 0 [anon:dalvik-large object space allocation] -Name: [anon:dalvik-large object space allocation] -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me ac -6fc4d000-6ff1e000 rw-p 00000000 fe:00 3184 /system/framework/x86_64/boot.art -Size: 2884 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2884 kB -Pss: 472 kB -Shared_Clean: 4 kB -Shared_Dirty: 2552 kB -Private_Clean: 0 kB -Private_Dirty: 328 kB -Referenced: 2728 kB -Anonymous: 2880 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 472 kB -VmFlags: rd wr mr mw me ac -6ff1e000-70050000 rw-p 00000000 fe:00 3174 /system/framework/x86_64/boot-core-libart.art -Size: 1224 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1212 kB -Pss: 234 kB -Shared_Clean: 4 kB -Shared_Dirty: 1032 kB -Private_Clean: 0 kB -Private_Dirty: 176 kB -Referenced: 1092 kB -Anonymous: 1208 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 234 kB -VmFlags: rd wr mr mw me ac -70050000-70051000 rw-p 00000000 fe:00 3197 /system/framework/x86_64/boot-core-simple.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70051000-70091000 rw-p 00000000 fe:00 3168 /system/framework/x86_64/boot-conscrypt.art -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 256 kB -Pss: 89 kB -Shared_Clean: 4 kB -Shared_Dirty: 172 kB -Private_Clean: 0 kB -Private_Dirty: 80 kB -Referenced: 236 kB -Anonymous: 252 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 89 kB -VmFlags: rd wr mr mw me ac -70091000-700ce000 rw-p 00000000 fe:00 3166 /system/framework/x86_64/boot-okhttp.art -Size: 244 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 240 kB -Pss: 28 kB -Shared_Clean: 0 kB -Shared_Dirty: 224 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 200 kB -Anonymous: 240 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 28 kB -VmFlags: rd wr mr mw me ac -700ce000-70136000 rw-p 00000000 fe:00 3175 /system/framework/x86_64/boot-bouncycastle.art -Size: 416 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 412 kB -Pss: 22 kB -Shared_Clean: 0 kB -Shared_Dirty: 412 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 236 kB -Anonymous: 412 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 22 kB -VmFlags: rd wr mr mw me ac -70136000-7019d000 rw-p 00000000 fe:00 3167 /system/framework/x86_64/boot-apache-xml.art -Size: 412 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 408 kB -Pss: 22 kB -Shared_Clean: 0 kB -Shared_Dirty: 408 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 276 kB -Anonymous: 408 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 22 kB -VmFlags: rd wr mr mw me ac -7019d000-701ea000 rw-p 00000000 fe:00 3196 /system/framework/x86_64/boot-ext.art -Size: 308 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 308 kB -Pss: 20 kB -Shared_Clean: 4 kB -Shared_Dirty: 300 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 256 kB -Anonymous: 304 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr mr mw me ac -701ea000-70cdb000 rw-p 00000000 fe:00 3165 /system/framework/x86_64/boot-framework.art -Size: 11204 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 11188 kB -Pss: 2200 kB -Shared_Clean: 80 kB -Shared_Dirty: 9448 kB -Private_Clean: 0 kB -Private_Dirty: 1660 kB -Referenced: 9892 kB -Anonymous: 11108 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2200 kB -VmFlags: rd wr mr mw me ac -70cdb000-70df1000 rw-p 00000000 fe:00 3178 /system/framework/x86_64/boot-telephony-common.art -Size: 1112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1112 kB -Pss: 63 kB -Shared_Clean: 4 kB -Shared_Dirty: 1108 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 524 kB -Anonymous: 1108 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 63 kB -VmFlags: rd wr mr mw me ac -70df1000-70e02000 rw-p 00000000 fe:00 3198 /system/framework/x86_64/boot-voip-common.art -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 68 kB -Pss: 3 kB -Shared_Clean: 4 kB -Shared_Dirty: 64 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 64 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd wr mr mw me ac -70e02000-70e1e000 rw-p 00000000 fe:00 3176 /system/framework/x86_64/boot-ims-common.art -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 112 kB -Pss: 6 kB -Shared_Clean: 0 kB -Shared_Dirty: 112 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 112 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd wr mr mw me ac -70e1e000-70e20000 rw-p 00000000 fe:00 3201 /system/framework/x86_64/boot-framework-oahl-backward-compatibility.art -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70e20000-70e26000 rw-p 00000000 fe:00 3170 /system/framework/x86_64/boot-android.test.base.impl.art -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd wr mr mw me ac -70e26000-70f04000 r--p 00000000 fe:00 3199 /system/framework/x86_64/boot.oat -Size: 888 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 856 kB -Pss: 66 kB -Shared_Clean: 856 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 856 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 66 kB -VmFlags: rd mr mw me -70f04000-71279000 r-xp 000de000 fe:00 3199 /system/framework/x86_64/boot.oat -Size: 3540 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 3476 kB -Pss: 308 kB -Shared_Clean: 3412 kB -Shared_Dirty: 0 kB -Private_Clean: 64 kB -Private_Dirty: 0 kB -Referenced: 3476 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 308 kB -VmFlags: rd ex mr mw me -71279000-7127a000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7127a000-71700000 r--s 00000000 fe:00 3396 /system/framework/boot.vdex -Size: 4632 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 3592 kB -Pss: 423 kB -Shared_Clean: 3592 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 3592 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 423 kB -VmFlags: rd mr me ms -71700000-71701000 r--p 00453000 fe:00 3199 /system/framework/x86_64/boot.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -71701000-71702000 rw-p 00454000 fe:00 3199 /system/framework/x86_64/boot.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -71702000-7175d000 r--p 00000000 fe:00 3181 /system/framework/x86_64/boot-core-libart.oat -Size: 364 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 356 kB -Pss: 20 kB -Shared_Clean: 356 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 356 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd mr mw me -7175d000-718b6000 r-xp 0005b000 fe:00 3181 /system/framework/x86_64/boot-core-libart.oat -Size: 1380 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1360 kB -Pss: 127 kB -Shared_Clean: 1360 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 1360 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 127 kB -VmFlags: rd ex mr mw me -718b6000-718b7000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -718b7000-71bcb000 r--s 00000000 fe:00 3146 /system/framework/boot-core-libart.vdex -Size: 3152 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2228 kB -Pss: 238 kB -Shared_Clean: 2228 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 2228 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 238 kB -VmFlags: rd mr me ms -71bcb000-71bcc000 r--p 001b4000 fe:00 3181 /system/framework/x86_64/boot-core-libart.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -71bcc000-71bcd000 rw-p 001b5000 fe:00 3181 /system/framework/x86_64/boot-core-libart.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -71bcd000-71bcf000 r--p 00000000 fe:00 3182 /system/framework/x86_64/boot-core-simple.oat -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -71bcf000-71bd0000 r-xp 00002000 fe:00 3182 /system/framework/x86_64/boot-core-simple.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -71bd0000-71bd1000 r--s 00000000 fe:00 3216 /system/framework/boot-core-simple.vdex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -71bd1000-71bd2000 r--p 00003000 fe:00 3182 /system/framework/x86_64/boot-core-simple.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -71bd2000-71bd3000 rw-p 00004000 fe:00 3182 /system/framework/x86_64/boot-core-simple.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -71bd3000-71be2000 r--p 00000000 fe:00 3205 /system/framework/x86_64/boot-conscrypt.oat -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 3 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -71be2000-71c12000 r-xp 0000f000 fe:00 3205 /system/framework/x86_64/boot-conscrypt.oat -Size: 192 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 184 kB -Pss: 25 kB -Shared_Clean: 184 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 184 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 25 kB -VmFlags: rd ex mr mw me -71c12000-71c13000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -71c13000-71c78000 r--s 00000000 fe:00 3142 /system/framework/boot-conscrypt.vdex -Size: 404 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 404 kB -Pss: 47 kB -Shared_Clean: 404 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 404 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 47 kB -VmFlags: rd mr me ms -71c78000-71c79000 r--p 0003f000 fe:00 3205 /system/framework/x86_64/boot-conscrypt.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -71c79000-71c7a000 rw-p 00040000 fe:00 3205 /system/framework/x86_64/boot-conscrypt.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -71c7a000-71c8e000 r--p 00000000 fe:00 3183 /system/framework/x86_64/boot-okhttp.oat -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 80 kB -Pss: 13 kB -Shared_Clean: 80 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 80 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 13 kB -VmFlags: rd mr mw me -71c8e000-71cd1000 r-xp 00014000 fe:00 3183 /system/framework/x86_64/boot-okhttp.oat -Size: 268 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 228 kB -Pss: 134 kB -Shared_Clean: 188 kB -Shared_Dirty: 0 kB -Private_Clean: 40 kB -Private_Dirty: 0 kB -Referenced: 228 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 134 kB -VmFlags: rd ex mr mw me -71cd1000-71cd2000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -71cd2000-71d32000 r--s 00000000 fe:00 3135 /system/framework/boot-okhttp.vdex -Size: 384 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 312 kB -Pss: 71 kB -Shared_Clean: 288 kB -Shared_Dirty: 0 kB -Private_Clean: 24 kB -Private_Dirty: 0 kB -Referenced: 312 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 71 kB -VmFlags: rd mr me ms -71d32000-71d33000 r--p 00057000 fe:00 3183 /system/framework/x86_64/boot-okhttp.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -71d33000-71d34000 rw-p 00058000 fe:00 3183 /system/framework/x86_64/boot-okhttp.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -71d34000-71d48000 r--p 00000000 fe:00 3200 /system/framework/x86_64/boot-bouncycastle.oat -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 3 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -71d48000-71d84000 r-xp 00014000 fe:00 3200 /system/framework/x86_64/boot-bouncycastle.oat -Size: 240 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 188 kB -Pss: 98 kB -Shared_Clean: 180 kB -Shared_Dirty: 0 kB -Private_Clean: 8 kB -Private_Dirty: 0 kB -Referenced: 188 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 98 kB -VmFlags: rd ex mr mw me -71d84000-71d85000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -71d85000-71ec6000 r--s 00000000 fe:00 3145 /system/framework/boot-bouncycastle.vdex -Size: 1284 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 444 kB -Pss: 76 kB -Shared_Clean: 444 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 444 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 76 kB -VmFlags: rd mr me ms -71ec6000-71ec7000 r--p 00050000 fe:00 3200 /system/framework/x86_64/boot-bouncycastle.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -71ec7000-71ec8000 rw-p 00051000 fe:00 3200 /system/framework/x86_64/boot-bouncycastle.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -71ec8000-71ed2000 r--p 00000000 fe:00 3187 /system/framework/x86_64/boot-apache-xml.oat -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 2 kB -Shared_Clean: 40 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -71ed2000-71eec000 r-xp 0000a000 fe:00 3187 /system/framework/x86_64/boot-apache-xml.oat -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -71eec000-71eed000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -71eed000-72010000 r--s 00000000 fe:00 3212 /system/framework/boot-apache-xml.vdex -Size: 1164 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 320 kB -Pss: 35 kB -Shared_Clean: 320 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 320 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 35 kB -VmFlags: rd mr me ms -72010000-72011000 r--p 00024000 fe:00 3187 /system/framework/x86_64/boot-apache-xml.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -72011000-72012000 rw-p 00025000 fe:00 3187 /system/framework/x86_64/boot-apache-xml.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -72012000-7201d000 r--p 00000000 fe:00 3188 /system/framework/x86_64/boot-ext.oat -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 2 kB -Shared_Clean: 44 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -7201d000-72038000 r-xp 0000b000 fe:00 3188 /system/framework/x86_64/boot-ext.oat -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 108 kB -Pss: 37 kB -Shared_Clean: 108 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 108 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 37 kB -VmFlags: rd ex mr mw me -72038000-72039000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -72039000-72124000 r--s 00000000 fe:00 3221 /system/framework/boot-ext.vdex -Size: 940 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 340 kB -Pss: 48 kB -Shared_Clean: 340 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 340 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 48 kB -VmFlags: rd mr me ms -72124000-72125000 r--p 00026000 fe:00 3188 /system/framework/x86_64/boot-ext.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -72125000-72126000 rw-p 00027000 fe:00 3188 /system/framework/x86_64/boot-ext.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -72126000-7240e000 r--p 00000000 fe:00 3189 /system/framework/x86_64/boot-framework.oat -Size: 2976 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2944 kB -Pss: 349 kB -Shared_Clean: 2944 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 2944 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 349 kB -VmFlags: rd mr mw me -7240e000-72ee4000 r-xp 002e8000 fe:00 3189 /system/framework/x86_64/boot-framework.oat -Size: 11096 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 10444 kB -Pss: 1678 kB -Shared_Clean: 10252 kB -Shared_Dirty: 0 kB -Private_Clean: 192 kB -Private_Dirty: 0 kB -Referenced: 10444 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1678 kB -VmFlags: rd ex mr mw me -72ee4000-72ee6000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -72ee6000-7449a000 r--s 00000000 fe:00 3156 /system/framework/boot-framework.vdex -Size: 22224 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16932 kB -Pss: 2196 kB -Shared_Clean: 16872 kB -Shared_Dirty: 0 kB -Private_Clean: 60 kB -Private_Dirty: 0 kB -Referenced: 16932 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2196 kB -VmFlags: rd mr me ms -7449a000-7449b000 r--p 00dbe000 fe:00 3189 /system/framework/x86_64/boot-framework.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7449b000-7449c000 rw-p 00dbf000 fe:00 3189 /system/framework/x86_64/boot-framework.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7449c000-744f8000 r--p 00000000 fe:00 3202 /system/framework/x86_64/boot-telephony-common.oat -Size: 368 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 80 kB -Pss: 5 kB -Shared_Clean: 80 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 80 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -744f8000-7463c000 r-xp 0005c000 fe:00 3202 /system/framework/x86_64/boot-telephony-common.oat -Size: 1296 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7463c000-7463d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7463d000-74974000 r--s 00000000 fe:00 3209 /system/framework/boot-telephony-common.vdex -Size: 3292 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 344 kB -Pss: 21 kB -Shared_Clean: 344 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 344 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 21 kB -VmFlags: rd mr me ms -74974000-74975000 r--p 001a0000 fe:00 3202 /system/framework/x86_64/boot-telephony-common.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -74975000-74976000 rw-p 001a1000 fe:00 3202 /system/framework/x86_64/boot-telephony-common.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -74976000-74978000 r--p 00000000 fe:00 3193 /system/framework/x86_64/boot-voip-common.oat -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -74978000-7497a000 r-xp 00002000 fe:00 3193 /system/framework/x86_64/boot-voip-common.oat -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7497a000-7497b000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7497b000-749a1000 r--s 00000000 fe:00 3397 /system/framework/boot-voip-common.vdex -Size: 152 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 144 kB -Pss: 14 kB -Shared_Clean: 144 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 144 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 14 kB -VmFlags: rd mr me ms -749a1000-749a2000 r--p 00004000 fe:00 3193 /system/framework/x86_64/boot-voip-common.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -749a2000-749a3000 rw-p 00005000 fe:00 3193 /system/framework/x86_64/boot-voip-common.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -749a3000-749a9000 r--p 00000000 fe:00 3191 /system/framework/x86_64/boot-ims-common.oat -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -749a9000-749b7000 r-xp 00006000 fe:00 3191 /system/framework/x86_64/boot-ims-common.oat -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -749b7000-749b8000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -749b8000-749db000 r--s 00000000 fe:00 3152 /system/framework/boot-ims-common.vdex -Size: 140 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 104 kB -Pss: 6 kB -Shared_Clean: 104 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 104 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr me ms -749db000-749dc000 r--p 00014000 fe:00 3191 /system/framework/x86_64/boot-ims-common.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -749dc000-749dd000 rw-p 00015000 fe:00 3191 /system/framework/x86_64/boot-ims-common.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -749dd000-749df000 r--p 00000000 fe:00 3194 /system/framework/x86_64/boot-framework-oahl-backward-compatibility.oat -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -749df000-749e0000 r-xp 00002000 fe:00 3194 /system/framework/x86_64/boot-framework-oahl-backward-compatibility.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -749e0000-749e1000 r--s 00000000 fe:00 3147 /system/framework/boot-framework-oahl-backward-compatibility.vdex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -749e1000-749e2000 r--p 00003000 fe:00 3194 /system/framework/x86_64/boot-framework-oahl-backward-compatibility.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -749e2000-749e3000 rw-p 00004000 fe:00 3194 /system/framework/x86_64/boot-framework-oahl-backward-compatibility.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -749e3000-749e5000 r--p 00000000 fe:00 3180 /system/framework/x86_64/boot-android.test.base.impl.oat -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -749e5000-749e6000 r-xp 00002000 fe:00 3180 /system/framework/x86_64/boot-android.test.base.impl.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -749e6000-749ee000 r--s 00000000 fe:00 3350 /system/framework/boot-android.test.base.impl.vdex -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -749ee000-749ef000 r--p 00003000 fe:00 3180 /system/framework/x86_64/boot-android.test.base.impl.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -749ef000-749f0000 rw-p 00004000 fe:00 3180 /system/framework/x86_64/boot-android.test.base.impl.oat -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -749f0000-74b3d000 rw-p 00000000 00:00 0 [anon:dalvik-zygote space] -Name: [anon:dalvik-zygote space] -Size: 1332 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1332 kB -Pss: 497 kB -Shared_Clean: 0 kB -Shared_Dirty: 884 kB -Private_Clean: 0 kB -Private_Dirty: 448 kB -Referenced: 564 kB -Anonymous: 1332 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 497 kB -VmFlags: rd wr mr mw me ac -74b3d000-74b3e000 rw-p 00000000 00:00 0 [anon:dalvik-non moving space] -Name: [anon:dalvik-non moving space] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -74b3e000-74b71000 rw-p 00000000 00:00 0 [anon:dalvik-non moving space] -Name: [anon:dalvik-non moving space] -Size: 204 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 204 kB -Pss: 204 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 204 kB -Referenced: 204 kB -Anonymous: 204 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 204 kB -VmFlags: rd wr mr mw me ac -74b71000-781f1000 ---p 00000000 00:00 0 [anon:dalvik-non moving space] -Name: [anon:dalvik-non moving space] -Size: 55808 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -781f1000-789f0000 rw-p 00000000 00:00 0 [anon:dalvik-non moving space] -Name: [anon:dalvik-non moving space] -Size: 8188 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -ebad6000-ebad7000 ---p 00000000 00:00 0 [anon:dalvik-Sentinel fault page] -Name: [anon:dalvik-Sentinel fault page] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -578de5770000-578de5773000 r--p 00000000 fe:00 408 /system/bin/app_process64 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 1 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me dw -578de5773000-578de5777000 r-xp 00003000 fe:00 408 /system/bin/app_process64 -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 16 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me dw -578de5777000-578de5778000 r--p 00007000 fe:00 408 /system/bin/app_process64 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me dw ac -578de5778000-578de577a000 rw-p 00000000 00:00 0 -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700749747000-7007497f6000 rw-s 00000000 00:05 12329 /dev/ashmem/gralloc-1332.3 (deleted) -Size: 700 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 656 kB -Pss: 656 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 656 kB -Referenced: 656 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 656 kB -VmFlags: rd wr sh mr mw me ms -7007497f6000-7007497f7000 ---s 000af000 00:05 12329 /dev/ashmem/gralloc-1332.3 (deleted) -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: sh mr mw me ms -7007497f7000-7007498a6000 rw-s 00000000 00:05 12330 /dev/ashmem/gralloc-1332.4 (deleted) -Size: 700 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 656 kB -Pss: 656 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 656 kB -Referenced: 656 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 656 kB -VmFlags: rd wr sh mr mw me ms -7007498a6000-7007498a7000 ---s 000af000 00:05 12330 /dev/ashmem/gralloc-1332.4 (deleted) -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: sh mr mw me ms -7007498a7000-700749956000 rw-s 00000000 00:05 12331 /dev/ashmem/gralloc-1332.5 (deleted) -Size: 700 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 656 kB -Pss: 328 kB -Shared_Clean: 0 kB -Shared_Dirty: 656 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 656 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 328 kB -VmFlags: rd wr sh mr mw me ms -700749956000-700749957000 ---s 000af000 00:05 12331 /dev/ashmem/gralloc-1332.5 (deleted) -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: sh mr mw me ms -700749957000-70074995b000 r--p 00000000 fe:30 346 /vendor/lib64/hw/gralloc.vsoc.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 2 kB -Shared_Clean: 16 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -70074995b000-70074995e000 r-xp 00004000 fe:30 346 /vendor/lib64/hw/gralloc.vsoc.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 1 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd ex mr mw me -70074995e000-70074995f000 rw-p 00007000 fe:30 346 /vendor/lib64/hw/gralloc.vsoc.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70074995f000-700749960000 r--p 00008000 fe:30 346 /vendor/lib64/hw/gralloc.vsoc.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700749960000-700749961000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700749981000-70074998a000 r--p 00000000 fe:30 381 /vendor/lib64/vsoc_lib.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 3 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -70074998a000-700749992000 r-xp 00009000 fe:30 381 /vendor/lib64/vsoc_lib.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700749992000-700749993000 rw-p 00011000 fe:30 381 /vendor/lib64/vsoc_lib.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700749993000-700749994000 r--p 00012000 fe:30 381 /vendor/lib64/vsoc_lib.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700749994000-700749995000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007499f7000-70074a5f7000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 12288 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70074a909000-70074a90a000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074a90a000-70074a90b000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074a90b000-70074aa0f000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70074aa0f000-70074ab0f000 rw-s 00000000 00:05 11658 /dev/ashmem/MemoryHeapBase (deleted) -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr sh mr mw me ms -70074ab0f000-70074ac0f000 rw-s 00000000 00:05 11656 /dev/ashmem/MemoryHeapBase (deleted) -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr sh mr mw me ms -70074ac0f000-70074c78d000 r--s 00bc3000 fe:00 3346 /system/framework/framework-res.apk -Size: 28152 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 19268 kB -Pss: 933 kB -Shared_Clean: 19268 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 19268 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 933 kB -VmFlags: rd mr me ms -70074c78d000-70074c78e000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074c78e000-70074c78f000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074c78f000-70074c893000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70074c893000-70074d293000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 10240 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 536 kB -Pss: 536 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 536 kB -Referenced: 208 kB -Anonymous: 536 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 536 kB -VmFlags: rd wr mr mw me ac -70074d293000-70074d294000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074d294000-70074d295000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074d295000-70074d399000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70074d399000-70074db99000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 8192 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70074db99000-70074db9a000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074db9a000-70074dc93000 rw-p 00000000 00:00 0 -Size: 996 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me nr -70074dc93000-70074dc94000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074dc94000-70074dd8d000 rw-p 00000000 00:00 0 -Size: 996 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70074dd8d000-70074ee0d000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 16896 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 15272 kB -Pss: 15272 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 15272 kB -Referenced: 11156 kB -Anonymous: 15272 kB -AnonHugePages: 6144 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 15272 kB -VmFlags: rd wr mr mw me ac -70074ee0d000-70074ee0e000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074ee0e000-70074ee0f000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074ee0f000-70074ef13000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70074ef13000-70074f493000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 5632 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 5348 kB -Pss: 5348 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 5348 kB -Referenced: 3364 kB -Anonymous: 5348 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5348 kB -VmFlags: rd wr mr mw me ac -70074f493000-70074f8a0000 r--s 001a6000 fe:00 1821 /system/priv-app/Telecom/Telecom.apk -Size: 4148 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr me ms -70074f8e1000-70074f9e1000 rw-s 00000000 00:05 11617 /dev/ashmem/MemoryHeapBase (deleted) -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr sh mr mw me ms -70074f9e1000-70074fae1000 rw-s 00000000 00:05 11565 /dev/ashmem/MemoryHeapBase (deleted) -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr sh mr mw me ms -70074fae1000-70074fae2000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074fae2000-70074fae3000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074fae3000-70074fbe7000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70074fbe7000-70074fca2000 r--s 0287a000 fe:00 3346 /system/framework/framework-res.apk -Size: 748 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 748 kB -Pss: 160 kB -Shared_Clean: 748 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 748 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 160 kB -VmFlags: rd mr me ms -70074fca2000-70074fca4000 r--p 00000000 fe:00 2040 /system/priv-app/FusedLocation/oat/x86_64/FusedLocation.odex -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 8 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me -70074fca4000-70074fca7000 r-xp 00002000 fe:00 2040 /system/priv-app/FusedLocation/oat/x86_64/FusedLocation.odex -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 12 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me -70074fca7000-70074fca8000 r--p 00005000 fe:00 2040 /system/priv-app/FusedLocation/oat/x86_64/FusedLocation.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -70074fca8000-70074fca9000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70074fca9000-70074fcaa000 r--s 00000000 fe:00 2039 /system/priv-app/FusedLocation/oat/x86_64/FusedLocation.vdex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr me ms -70074fcaa000-70074fcab000 r--p 00006000 fe:00 2040 /system/priv-app/FusedLocation/oat/x86_64/FusedLocation.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -70074fcab000-70074fcac000 rw-p 00007000 fe:00 2040 /system/priv-app/FusedLocation/oat/x86_64/FusedLocation.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70074fcef000-70074fcf2000 r--p 00000000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 6 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -70074fcf2000-70074fcf6000 r-xp 00003000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 16 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd ex mr mw me -70074fcf6000-70074fcf7000 r--p 00007000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -70074fcf7000-70074fcf8000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70074fcf8000-70074fcfd000 r--s 00000000 fe:00 3249 /system/framework/oat/x86_64/com.android.location.provider.impl.vdex -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 10 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr me ms -70074fcfd000-70074fcfe000 r--p 00008000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -70074fcfe000-70074fcff000 rw-p 00009000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70074fd15000-70074fe15000 rw-s 00000000 00:05 11532 /dev/ashmem/MemoryHeapBase (deleted) -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr sh mr mw me ms -70074fe15000-70074fe16000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074fe16000-70074fe17000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70074fe17000-70074ff1b000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70074ff1b000-70074ffa5000 r--p 00000000 fe:00 1819 /system/priv-app/Telecom/oat/x86_64/Telecom.odex -Size: 552 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 72 kB -Pss: 72 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 72 kB -Private_Dirty: 0 kB -Referenced: 72 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 72 kB -VmFlags: rd mr mw me -70074ffa5000-7007501f2000 r-xp 0008a000 fe:00 1819 /system/priv-app/Telecom/oat/x86_64/Telecom.odex -Size: 2356 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1784 kB -Pss: 1784 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 1784 kB -Private_Dirty: 0 kB -Referenced: 1784 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1784 kB -VmFlags: rd ex mr mw me -7007501f2000-7007501f4000 r--p 002d7000 fe:00 1819 /system/priv-app/Telecom/oat/x86_64/Telecom.odex -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -7007501f4000-7007501f9000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 20 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr mr mw me ac -7007501f9000-7007501fe000 r--s 00000000 fe:00 1820 /system/priv-app/Telecom/oat/x86_64/Telecom.vdex -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 20 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd mr me ms -7007501fe000-7007501ff000 r--p 002d9000 fe:00 1819 /system/priv-app/Telecom/oat/x86_64/Telecom.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007501ff000-700750200000 rw-p 002da000 fe:00 1819 /system/priv-app/Telecom/oat/x86_64/Telecom.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700750296000-700750297000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700750297000-700750298000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700750298000-70075039c000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70075039c000-70075039d000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075039d000-70075039e000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075039e000-700750496000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700750496000-70075056f000 r--s 003f5000 fe:00 1805 /system/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk -Size: 868 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 384 kB -Pss: 192 kB -Shared_Clean: 384 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 384 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 192 kB -VmFlags: rd mr me ms -7007509c2000-700750dc2000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 4096 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1980 kB -Pss: 1980 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 1980 kB -Referenced: 176 kB -Anonymous: 1980 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1980 kB -VmFlags: rd wr mr mw me ac -70075185d000-70075185e000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075185e000-70075185f000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075185f000-700751957000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700751adb000-700751adc000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700751adc000-700751add000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700751add000-700751be1000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 28 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 28 kB -Referenced: 28 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 28 kB -VmFlags: rd wr mr mw me nr -700751d30000-700751d31000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700751d31000-700751d32000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700751d32000-700751e2a000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700751e50000-700751e51000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700751e51000-700751e52000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700751e52000-700751f56000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700751f56000-700751f57000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700751f57000-700751f58000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700751f58000-70075205c000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70075205c000-70075205d000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075205d000-70075205e000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075205e000-700752162000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700752162000-700752163000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752163000-700752164000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752164000-70075225c000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70075225c000-70075225d000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075225d000-70075225e000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075225e000-700752362000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700752362000-700752363000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752363000-700752364000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752364000-700752468000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700752474000-700752475000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752475000-700752476000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752476000-70075256e000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70075256e000-70075266e000 rw-s 00000000 00:05 11287 /dev/ashmem/MemoryHeapBase (deleted) -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr sh mr mw me ms -70075266e000-70075266f000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075266f000-700752670000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752670000-700752774000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700752780000-700752781000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752781000-700752782000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752782000-70075287a000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70075287a000-70075287b000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075287b000-70075287c000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075287c000-700752980000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700752980000-700752981000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752981000-700752982000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752982000-700752a7a000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700752a7a000-700752a7b000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752a7b000-700752a7c000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752a7c000-700752b74000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700752b74000-700752b75000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752b75000-700752b76000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752b76000-700752c6e000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me nr -700752cb5000-700752cb8000 r--p 00000000 fe:00 1482 /system/lib64/vndk-sp-Q/hw/android.hidl.memory@1.0-impl.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 6 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -700752cb8000-700752cb9000 r-xp 00003000 fe:00 1482 /system/lib64/vndk-sp-Q/hw/android.hidl.memory@1.0-impl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd ex mr mw me -700752cb9000-700752cba000 rw-p 00004000 fe:00 1482 /system/lib64/vndk-sp-Q/hw/android.hidl.memory@1.0-impl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700752cba000-700752cbb000 r--p 00005000 fe:00 1482 /system/lib64/vndk-sp-Q/hw/android.hidl.memory@1.0-impl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700752cbb000-700752cbc000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700752cf5000-700752cf6000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752cf6000-700752cf7000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752cf7000-700752dfb000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700752dfb000-700752dfc000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752dfc000-700752dfd000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752dfd000-700752ef5000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me nr -700752ef5000-700752ef6000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752ef6000-700752ef7000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752ef7000-700752fef000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me nr -700752fef000-700752ff0000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752ff0000-700752ff1000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700752ff1000-7007530e9000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me nr -700753145000-700753148000 r--p 00000000 fe:30 382 /vendor/lib64/libcuttlefish_fs.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 1 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -700753148000-70075314d000 r-xp 00003000 fe:30 382 /vendor/lib64/libcuttlefish_fs.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -70075314d000-70075314e000 rw-p 00008000 fe:30 382 /vendor/lib64/libcuttlefish_fs.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075314e000-70075314f000 r--p 00009000 fe:30 382 /vendor/lib64/libcuttlefish_fs.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -70075319d000-70075319e000 r--p 00000000 fe:30 408 /vendor/lib64/cuttlefish_auto_resources.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -70075319e000-70075319f000 r-xp 00001000 fe:30 408 /vendor/lib64/cuttlefish_auto_resources.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -70075319f000-7007531a0000 rw-p 00002000 fe:30 408 /vendor/lib64/cuttlefish_auto_resources.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007531a0000-7007531a1000 r--p 00003000 fe:30 408 /vendor/lib64/cuttlefish_auto_resources.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007531e3000-7007531e4000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007531e4000-7007531e5000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007531e5000-7007532e9000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me nr -7007532e9000-700753669000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 3584 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 3060 kB -Pss: 3060 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 3060 kB -Referenced: 1816 kB -Anonymous: 3060 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3060 kB -VmFlags: rd wr mr mw me ac -700753669000-70075366a000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075366a000-70075366b000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075366b000-70075376f000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70075376f000-700753770000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753770000-700753771000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753771000-700753875000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700753875000-700753876000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753876000-700753877000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753877000-70075397b000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70075397b000-70075397c000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075397c000-70075397d000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075397d000-700753a81000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700753a81000-700753a82000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753a82000-700753a83000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753a83000-700753b87000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700753b87000-700753b88000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753b88000-700753b89000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753b89000-700753c8d000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700753c8d000-700753c8e000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753c8e000-700753c8f000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753c8f000-700753d93000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700753d93000-700753d94000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753d94000-700753d95000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753d95000-700753e99000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700753e99000-700753e9a000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753e9a000-700753e9b000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753e9b000-700753f9f000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 28 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 28 kB -Referenced: 28 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 28 kB -VmFlags: rd wr mr mw me nr -700753f9f000-700753fa0000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753fa0000-700753fa1000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700753fa1000-700754099000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700754099000-70075409a000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075409a000-70075409b000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075409b000-70075419f000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70075419f000-7007541a0000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007541a0000-7007541a1000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007541a1000-7007542a5000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -7007542a5000-7007542a6000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007542a6000-7007542a7000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007542a7000-7007543ab000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007543ab000-7007543ac000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007543ac000-7007543ad000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007543ad000-7007544b1000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007544b1000-7007544b2000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007544b2000-7007544b3000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007544b3000-7007545b7000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007545b7000-7007545b8000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007545b8000-7007545b9000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007545b9000-7007546bd000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -7007546bd000-7007546be000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007546be000-7007546bf000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007546bf000-7007547c3000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me nr -7007547c3000-7007547c4000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007547c4000-7007547c5000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007547c5000-7007548c9000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007548c9000-7007548ca000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007548ca000-7007548cb000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007548cb000-7007549cf000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -7007549cf000-7007549d0000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007549d0000-7007549d1000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007549d1000-700754ad5000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700754ad5000-700754ad6000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754ad6000-700754ad7000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754ad7000-700754bdb000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me nr -700754bdb000-700754bdc000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754bdc000-700754bdd000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754bdd000-700754ce1000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700754ce1000-700754ce2000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754ce2000-700754ce3000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754ce3000-700754de7000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700754de7000-700754de8000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754de8000-700754de9000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754de9000-700754eed000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me nr -700754eed000-700754eee000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754eee000-700754eef000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754eef000-700754ff3000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700754ff3000-700754ff4000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754ff4000-700754ff5000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700754ff5000-7007550f9000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007550f9000-7007550fa000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007550fa000-7007550fb000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007550fb000-7007551ff000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007551ff000-700755200000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755200000-700755201000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755201000-700755305000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700755305000-700755306000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755306000-700755307000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755307000-70075540b000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70075540b000-70075540c000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075540c000-70075540d000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075540d000-700755511000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700755511000-700755512000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755512000-700755513000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755513000-70075560b000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 20 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr mr mw me nr -70075560b000-70075560c000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075560c000-70075560d000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075560d000-700755705000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700755705000-700755706000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755706000-700755707000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755707000-70075580b000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70075580b000-70075580c000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075580c000-70075580d000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075580d000-700755911000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700755911000-700755912000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755912000-700755913000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755913000-700755a17000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700755a17000-700755a2d000 r--p 00000000 fe:00 1947 /system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex -Size: 88 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 88 kB -Pss: 88 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 88 kB -Private_Dirty: 0 kB -Referenced: 88 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 88 kB -VmFlags: rd mr mw me -700755a2d000-700755a6e000 r-xp 00016000 fe:00 1947 /system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex -Size: 260 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 260 kB -Pss: 260 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 260 kB -Private_Dirty: 0 kB -Referenced: 260 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 260 kB -VmFlags: rd ex mr mw me -700755a6e000-700755a6f000 r--p 00057000 fe:00 1947 /system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700755a6f000-700755a70000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700755a70000-700755a71000 r--s 00000000 fe:00 1946 /system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.vdex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr me ms -700755a71000-700755a72000 r--p 00058000 fe:00 1947 /system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -700755a72000-700755a73000 rw-p 00059000 fe:00 1947 /system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700755aae000-700755aaf000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755aaf000-700755ab0000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755ab0000-700755bb4000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700755bb4000-700755bb5000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755bb5000-700755bb6000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755bb6000-700755cba000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700755cba000-700755cbb000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755cbb000-700755cbc000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755cbc000-700755db4000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700755db4000-700755db5000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755db5000-700755db6000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700755db6000-700755eae000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700755f18000-700755f28000 r--p 00000000 fe:00 1483 /system/lib64/vndk-sp-Q/android.hidl.memory@1.0.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 32 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd mr mw me -700755f28000-700755f3c000 r-xp 00010000 fe:00 1483 /system/lib64/vndk-sp-Q/android.hidl.memory@1.0.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 80 kB -Pss: 40 kB -Shared_Clean: 80 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 80 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 40 kB -VmFlags: rd ex mr mw me -700755f3c000-700755f3d000 rw-p 00024000 fe:00 1483 /system/lib64/vndk-sp-Q/android.hidl.memory@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700755f3d000-700755f40000 r--p 00025000 fe:00 1483 /system/lib64/vndk-sp-Q/android.hidl.memory@1.0.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me ac -700755f71000-7007560ba000 r--p 00000000 fe:00 1821 /system/priv-app/Telecom/Telecom.apk -Size: 1316 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 128 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 128 kB -Private_Dirty: 0 kB -Referenced: 128 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 128 kB -VmFlags: rd mr mw me ac -7007560ba000-7007560bb000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007560bb000-7007560bc000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007560bc000-7007561c0000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007561c0000-7007561c1000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007561c1000-7007561c2000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007561c2000-7007562c6000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007562c6000-7007562c7000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007562c7000-7007562c8000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007562c8000-7007563cc000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -7007563d8000-7007563d9000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007563d9000-7007563da000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007563da000-7007564d2000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 72 kB -Pss: 72 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 72 kB -Referenced: 72 kB -Anonymous: 72 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 72 kB -VmFlags: rd wr mr mw me nr -7007564d2000-7007564d3000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007564d3000-7007564d4000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007564d4000-7007565d8000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -7007565d8000-7007565d9000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007565d9000-7007565da000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007565da000-7007566de000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -7007566de000-7007566df000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007566df000-7007566e0000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007566e0000-7007567e4000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -7007567e4000-7007567e5000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007567e5000-7007567e6000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007567e6000-7007568de000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007568de000-7007568df000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007568df000-7007568e0000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007568e0000-7007569e4000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007569e4000-7007569e5000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007569e5000-7007569e6000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007569e6000-700756aea000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700756aea000-700756aeb000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700756aeb000-700756aec000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700756aec000-700756bf0000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 76 kB -Pss: 76 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 76 kB -Referenced: 76 kB -Anonymous: 76 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 76 kB -VmFlags: rd wr mr mw me nr -700756bf0000-700756bf1000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700756bf1000-700756bf2000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700756bf2000-700756cf6000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700756cf6000-700756cf7000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700756cf7000-700756cf8000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700756cf8000-700756dfc000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700756dfc000-700756dfd000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700756dfd000-700756dfe000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700756dfe000-700756f02000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700756f02000-700757000000 r--p 00000000 00:13 6792 /dev/hwbinder -Size: 1016 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 8 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr me dc nr mm -700757000000-700757400000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 4096 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2048 kB -Pss: 2048 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 2048 kB -Referenced: 2048 kB -Anonymous: 2048 kB -AnonHugePages: 2048 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2048 kB -VmFlags: rd wr mr mw me ac -700757442000-700757443000 r--p 00000000 fe:00 1554 /system/lib64/libwifi-service.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -700757443000-700757444000 r-xp 00001000 fe:00 1554 /system/lib64/libwifi-service.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd ex mr mw me -700757444000-700757445000 rw-p 00002000 fe:00 1554 /system/lib64/libwifi-service.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700757445000-700757446000 r--p 00003000 fe:00 1554 /system/lib64/libwifi-service.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -70075749f000-7007574a0000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007574a0000-7007574a1000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007574a1000-7007575a5000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007575a5000-7007578a5000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 3072 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2728 kB -Pss: 2728 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 2728 kB -Referenced: 1524 kB -Anonymous: 2728 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2728 kB -VmFlags: rd wr mr mw me ac -7007578a5000-7007578a6000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007578a6000-7007578a7000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007578a7000-7007579ab000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -7007579ab000-7007579ac000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007579ac000-7007579ad000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -7007579ad000-700757ab1000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -700757ab1000-700757ab2000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700757ab2000-700757ab3000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700757ab3000-700757bb7000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 20 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr mr mw me nr -700757bb7000-700757bb8000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700757bb8000-700757bb9000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700757bb9000-700757cbd000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 24 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 24 kB -Referenced: 24 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd wr mr mw me nr -700757cbd000-700757cbe000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700757cbe000-700757cbf000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700757cbf000-700757dc3000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 28 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 28 kB -Referenced: 28 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 28 kB -VmFlags: rd wr mr mw me nr -700757dcf000-700757dd0000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700757dd0000-700757dd1000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700757dd1000-700757ec9000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -700757ec9000-700757ed4000 r--p 00000000 fe:00 1737 /system/lib64/android.hardware.vibrator@1.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 16 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700757ed4000-700757ee0000 r-xp 0000b000 fe:00 1737 /system/lib64/android.hardware.vibrator@1.0.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 48 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 48 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 48 kB -VmFlags: rd ex mr mw me -700757ee0000-700757ee1000 rw-p 00017000 fe:00 1737 /system/lib64/android.hardware.vibrator@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700757ee1000-700757ee3000 r--p 00018000 fe:00 1737 /system/lib64/android.hardware.vibrator@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700757f0c000-700757f3c000 r--p 00000000 fe:00 1129 /system/lib64/libinputflinger.so -Size: 192 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 112 kB -Pss: 112 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 112 kB -Private_Dirty: 0 kB -Referenced: 112 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 112 kB -VmFlags: rd mr mw me -700757f3c000-700757f6f000 r-xp 00030000 fe:00 1129 /system/lib64/libinputflinger.so -Size: 204 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 200 kB -Pss: 200 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 200 kB -Private_Dirty: 0 kB -Referenced: 200 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 200 kB -VmFlags: rd ex mr mw me -700757f6f000-700757f70000 rw-p 00063000 fe:00 1129 /system/lib64/libinputflinger.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700757f70000-700757f74000 r--p 00064000 fe:00 1129 /system/lib64/libinputflinger.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me ac -700757f74000-700757f75000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700757f82000-700757faa000 r--p 00000000 fe:00 1625 /system/lib64/android.hardware.gnss@1.1.so -Size: 160 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 68 kB -Pss: 68 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 68 kB -Private_Dirty: 0 kB -Referenced: 68 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 68 kB -VmFlags: rd mr mw me -700757faa000-700757fe1000 r-xp 00028000 fe:00 1625 /system/lib64/android.hardware.gnss@1.1.so -Size: 220 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 216 kB -Pss: 216 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 216 kB -Private_Dirty: 0 kB -Referenced: 216 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 216 kB -VmFlags: rd ex mr mw me -700757fe1000-700757fe2000 rw-p 0005f000 fe:00 1625 /system/lib64/android.hardware.gnss@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700757fe2000-700757fea000 r--p 00060000 fe:00 1625 /system/lib64/android.hardware.gnss@1.1.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 32 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 32 kB -Referenced: 32 kB -Anonymous: 32 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd mr mw me ac -700758023000-70075802d000 r--p 00000000 fe:00 1510 /system/lib64/android.hardware.tetheroffload.config@1.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 20 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd mr mw me -70075802d000-700758036000 r-xp 0000a000 fe:00 1510 /system/lib64/android.hardware.tetheroffload.config@1.0.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 36 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 36 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 36 kB -VmFlags: rd ex mr mw me -700758036000-700758037000 rw-p 00013000 fe:00 1510 /system/lib64/android.hardware.tetheroffload.config@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758037000-700758039000 r--p 00014000 fe:00 1510 /system/lib64/android.hardware.tetheroffload.config@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700758043000-700758053000 r--p 00000000 fe:00 1259 /system/lib64/libkeymaster4support.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 16 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700758053000-700758069000 r-xp 00010000 fe:00 1259 /system/lib64/libkeymaster4support.so -Size: 88 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700758069000-70075806a000 rw-p 00026000 fe:00 1259 /system/lib64/libkeymaster4support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075806a000-70075806c000 r--p 00027000 fe:00 1259 /system/lib64/libkeymaster4support.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700758089000-700758099000 r--p 00000000 fe:00 1175 /system/lib64/android.hardware.tv.input@1.0.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 12 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me -700758099000-7007580ab000 r-xp 00010000 fe:00 1175 /system/lib64/android.hardware.tv.input@1.0.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 72 kB -Pss: 72 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 72 kB -Private_Dirty: 0 kB -Referenced: 72 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 72 kB -VmFlags: rd ex mr mw me -7007580ab000-7007580ac000 rw-p 00022000 fe:00 1175 /system/lib64/android.hardware.tv.input@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007580ac000-7007580af000 r--p 00023000 fe:00 1175 /system/lib64/android.hardware.tv.input@1.0.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me ac -7007580d7000-7007580d8000 r--p 00000000 fe:00 1648 /system/lib64/android.hardware.audio.common@2.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007580d8000-7007580d9000 r-xp 00001000 fe:00 1648 /system/lib64/android.hardware.audio.common@2.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007580d9000-7007580da000 rw-p 00002000 fe:00 1648 /system/lib64/android.hardware.audio.common@2.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007580da000-7007580db000 r--p 00003000 fe:00 1648 /system/lib64/android.hardware.audio.common@2.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700758110000-700758122000 r--p 00000000 fe:00 1680 /system/lib64/android.hardware.tv.cec@1.0.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 12 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me -700758122000-70075813c000 r-xp 00012000 fe:00 1680 /system/lib64/android.hardware.tv.cec@1.0.so -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 104 kB -Pss: 104 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 104 kB -Private_Dirty: 0 kB -Referenced: 104 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 104 kB -VmFlags: rd ex mr mw me -70075813c000-70075813d000 rw-p 0002c000 fe:00 1680 /system/lib64/android.hardware.tv.cec@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075813d000-700758140000 r--p 0002d000 fe:00 1680 /system/lib64/android.hardware.tv.cec@1.0.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me ac -700758153000-70075815e000 r--p 00000000 fe:00 1725 /system/lib64/android.hardware.thermal@1.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 14 kB -Shared_Clean: 44 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 14 kB -VmFlags: rd mr mw me -70075815e000-700758169000 r-xp 0000b000 fe:00 1725 /system/lib64/android.hardware.thermal@1.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 14 kB -Shared_Clean: 44 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 14 kB -VmFlags: rd ex mr mw me -700758169000-70075816a000 rw-p 00016000 fe:00 1725 /system/lib64/android.hardware.thermal@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075816a000-70075816c000 r--p 00017000 fe:00 1725 /system/lib64/android.hardware.thermal@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700758198000-7007581a3000 r--p 00000000 fe:00 1171 /system/lib64/android.hardware.power@1.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 14 kB -Shared_Clean: 44 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 14 kB -VmFlags: rd mr mw me -7007581a3000-7007581ae000 r-xp 0000b000 fe:00 1171 /system/lib64/android.hardware.power@1.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 14 kB -Shared_Clean: 44 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 14 kB -VmFlags: rd ex mr mw me -7007581ae000-7007581af000 rw-p 00016000 fe:00 1171 /system/lib64/android.hardware.power@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007581af000-7007581b1000 r--p 00017000 fe:00 1171 /system/lib64/android.hardware.power@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -7007581c1000-7007581e1000 r--s 00000000 00:13 6677 /dev/__properties__/u:object_r:boottime_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 6 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr me ms -7007581e1000-7007581ec000 r--p 00000000 fe:00 1568 /system/lib64/android.hardware.vibrator@1.1.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 16 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -7007581ec000-7007581f7000 r-xp 0000b000 fe:00 1568 /system/lib64/android.hardware.vibrator@1.1.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 44 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 44 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 44 kB -VmFlags: rd ex mr mw me -7007581f7000-7007581f8000 rw-p 00016000 fe:00 1568 /system/lib64/android.hardware.vibrator@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007581f8000-7007581fa000 r--p 00017000 fe:00 1568 /system/lib64/android.hardware.vibrator@1.1.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700758202000-700758212000 r--p 00000000 fe:00 1534 /system/lib64/android.hardware.keymaster@3.0.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 16 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700758212000-70075822d000 r-xp 00010000 fe:00 1534 /system/lib64/android.hardware.keymaster@3.0.so -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 108 kB -Pss: 27 kB -Shared_Clean: 108 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 108 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 27 kB -VmFlags: rd ex mr mw me -70075822d000-70075822e000 rw-p 0002b000 fe:00 1534 /system/lib64/android.hardware.keymaster@3.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075822e000-700758231000 r--p 0002c000 fe:00 1534 /system/lib64/android.hardware.keymaster@3.0.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me ac -700758243000-70075824d000 r--p 00000000 fe:00 1257 /system/lib64/android.hardware.vr@1.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 20 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd mr mw me -70075824d000-700758256000 r-xp 0000a000 fe:00 1257 /system/lib64/android.hardware.vr@1.0.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 36 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 36 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 36 kB -VmFlags: rd ex mr mw me -700758256000-700758257000 rw-p 00013000 fe:00 1257 /system/lib64/android.hardware.vr@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758257000-700758259000 r--p 00014000 fe:00 1257 /system/lib64/android.hardware.vr@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700758267000-700758287000 r--s 00000000 00:13 6710 /dev/__properties__/u:object_r:firstboot_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr me ms -700758287000-700758299000 r--p 00000000 fe:00 1586 /system/lib64/android.hardware.keymaster@4.0.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 16 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700758299000-7007582ba000 r-xp 00012000 fe:00 1586 /system/lib64/android.hardware.keymaster@4.0.so -Size: 132 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 104 kB -Pss: 26 kB -Shared_Clean: 104 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 104 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 26 kB -VmFlags: rd ex mr mw me -7007582ba000-7007582bb000 rw-p 00033000 fe:00 1586 /system/lib64/android.hardware.keymaster@4.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007582bb000-7007582be000 r--p 00034000 fe:00 1586 /system/lib64/android.hardware.keymaster@4.0.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me ac -7007582ce000-7007582ea000 r--p 00000000 fe:00 1729 /system/lib64/android.frameworks.sensorservice@1.0.so -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 8 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me -7007582ea000-70075830d000 r-xp 0001c000 fe:00 1729 /system/lib64/android.frameworks.sensorservice@1.0.so -Size: 140 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 140 kB -Pss: 140 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 140 kB -Private_Dirty: 0 kB -Referenced: 140 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 140 kB -VmFlags: rd ex mr mw me -70075830d000-70075830e000 rw-p 0003f000 fe:00 1729 /system/lib64/android.frameworks.sensorservice@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075830e000-700758313000 r--p 00040000 fe:00 1729 /system/lib64/android.frameworks.sensorservice@1.0.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 20 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd mr mw me ac -700758367000-7007583d9000 r--p 00000000 fe:00 1138 /system/lib64/android.hardware.gnss@1.0.so -Size: 456 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 64 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 64 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 64 kB -VmFlags: rd mr mw me -7007583d9000-700758494000 r-xp 00072000 fe:00 1138 /system/lib64/android.hardware.gnss@1.0.so -Size: 748 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 724 kB -Pss: 724 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 724 kB -Private_Dirty: 0 kB -Referenced: 724 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 724 kB -VmFlags: rd ex mr mw me -700758494000-700758495000 rw-p 0012d000 fe:00 1138 /system/lib64/android.hardware.gnss@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758495000-7007584ac000 r--p 0012e000 fe:00 1138 /system/lib64/android.hardware.gnss@1.0.so -Size: 92 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 92 kB -Pss: 92 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 92 kB -Referenced: 92 kB -Anonymous: 92 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 92 kB -VmFlags: rd mr mw me ac -7007584f4000-7007584f7000 r--p 00000000 fe:00 1550 /system/lib64/libtinyalsa.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 12 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me -7007584f7000-7007584fb000 r-xp 00003000 fe:00 1550 /system/lib64/libtinyalsa.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007584fb000-7007584fc000 rw-p 00007000 fe:00 1550 /system/lib64/libtinyalsa.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007584fc000-7007584fd000 r--p 00008000 fe:00 1550 /system/lib64/libtinyalsa.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700758501000-70075850d000 r--p 00000000 fe:00 1197 /system/lib64/android.hardware.power@1.1.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 15 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 15 kB -VmFlags: rd mr mw me -70075850d000-700758519000 r-xp 0000c000 fe:00 1197 /system/lib64/android.hardware.power@1.1.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 15 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 15 kB -VmFlags: rd ex mr mw me -700758519000-70075851a000 rw-p 00018000 fe:00 1197 /system/lib64/android.hardware.power@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075851a000-70075851c000 r--p 00019000 fe:00 1197 /system/lib64/android.hardware.power@1.1.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700758521000-700758541000 r--s 00000000 00:13 6676 /dev/__properties__/u:object_r:bootloader_boot_reason_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr me ms -700758541000-700758552000 r--p 00000000 fe:00 1517 /system/lib64/libsensorservice.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 20 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd mr mw me -700758552000-700758572000 r-xp 00011000 fe:00 1517 /system/lib64/libsensorservice.so -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 128 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 128 kB -Private_Dirty: 0 kB -Referenced: 128 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 128 kB -VmFlags: rd ex mr mw me -700758572000-700758573000 rw-p 00031000 fe:00 1517 /system/lib64/libsensorservice.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758573000-700758577000 r--p 00032000 fe:00 1517 /system/lib64/libsensorservice.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me ac -700758577000-700758578000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758586000-700758591000 r--p 00000000 fe:00 1649 /system/lib64/android.frameworks.schedulerservice@1.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 16 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700758591000-70075859b000 r-xp 0000b000 fe:00 1649 /system/lib64/android.frameworks.schedulerservice@1.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 40 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 40 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 40 kB -VmFlags: rd ex mr mw me -70075859b000-70075859c000 rw-p 00015000 fe:00 1649 /system/lib64/android.frameworks.schedulerservice@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075859c000-70075859e000 r--p 00016000 fe:00 1649 /system/lib64/android.frameworks.schedulerservice@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -7007585ae000-7007585ce000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007585ce000-7007585d1000 r--p 00000000 fe:00 1634 /system/lib64/libnetutils.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 6 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -7007585d1000-7007585d5000 r-xp 00003000 fe:00 1634 /system/lib64/libnetutils.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007585d5000-7007585d6000 rw-p 00007000 fe:00 1634 /system/lib64/libnetutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007585d6000-7007585d7000 r--p 00008000 fe:00 1634 /system/lib64/libnetutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007585d7000-7007585d8000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007585e6000-7007585e7000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007585e7000-7007585ef000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007585ef000-7007585f0000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007585f0000-7007585f3000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007585f3000-7007585f4000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007585f4000-7007585fc000 rw-s 00000000 fe:10 24584 /data/system_ce/0/accounts_ce.db-shm -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr sh mr mw me ms -7007585fc000-7007585fd000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007585fd000-700758605000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758605000-70075862a000 r--p 00000000 fe:00 1626 /system/lib64/android.hardware.broadcastradio@1.1.so -Size: 148 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 68 kB -Pss: 68 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 68 kB -Private_Dirty: 0 kB -Referenced: 68 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 68 kB -VmFlags: rd mr mw me -70075862a000-70075865c000 r-xp 00025000 fe:00 1626 /system/lib64/android.hardware.broadcastradio@1.1.so -Size: 200 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 196 kB -Pss: 196 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 196 kB -Private_Dirty: 0 kB -Referenced: 196 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 196 kB -VmFlags: rd ex mr mw me -70075865c000-70075865d000 rw-p 00057000 fe:00 1626 /system/lib64/android.hardware.broadcastradio@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075865d000-700758664000 r--p 00058000 fe:00 1626 /system/lib64/android.hardware.broadcastradio@1.1.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 28 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 28 kB -Referenced: 28 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 28 kB -VmFlags: rd mr mw me ac -700758666000-700758667000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700758667000-70075866f000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075866f000-700758674000 r--s 004e8000 fe:00 1805 /system/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 10 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr me ms -70075869d000-7007586a6000 r--p 00000000 fe:00 1249 /system/lib64/libinputservice.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 24 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 24 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd mr mw me -7007586a6000-7007586ad000 r-xp 00009000 fe:00 1249 /system/lib64/libinputservice.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007586ad000-7007586ae000 rw-p 00010000 fe:00 1249 /system/lib64/libinputservice.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007586ae000-7007586af000 r--p 00011000 fe:00 1249 /system/lib64/libinputservice.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007586b2000-7007586b3000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007586b3000-7007586b6000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007586b6000-7007586b7000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007586d2000-7007586df000 r--p 00000000 fe:00 1211 /system/lib64/android.hardware.sensors@1.0.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 16 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -7007586df000-7007586f1000 r-xp 0000d000 fe:00 1211 /system/lib64/android.hardware.sensors@1.0.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 72 kB -Pss: 72 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 72 kB -Private_Dirty: 0 kB -Referenced: 72 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 72 kB -VmFlags: rd ex mr mw me -7007586f1000-7007586f2000 rw-p 0001f000 fe:00 1211 /system/lib64/android.hardware.sensors@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007586f2000-7007586f4000 r--p 00020000 fe:00 1211 /system/lib64/android.hardware.sensors@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -7007586f4000-7007586f5000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007586f5000-7007586f8000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007586f8000-7007586f9000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700758721000-70075872e000 r--p 00000000 fe:00 1212 /system/lib64/libkeystore_binder.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 17 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 17 kB -VmFlags: rd mr mw me -70075872e000-700758739000 r-xp 0000d000 fe:00 1212 /system/lib64/libkeystore_binder.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 14 kB -Shared_Clean: 44 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 14 kB -VmFlags: rd ex mr mw me -700758739000-70075873a000 rw-p 00018000 fe:00 1212 /system/lib64/libkeystore_binder.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075873a000-70075873d000 r--p 00019000 fe:00 1212 /system/lib64/libkeystore_binder.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me ac -70075873d000-70075873e000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758740000-700758742000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758742000-700758754000 r--p 00000000 fe:00 1521 /system/lib64/android.hardware.contexthub@1.0.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 12 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me -700758754000-70075876e000 r-xp 00012000 fe:00 1521 /system/lib64/android.hardware.contexthub@1.0.so -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 100 kB -Pss: 100 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 100 kB -Private_Dirty: 0 kB -Referenced: 100 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 100 kB -VmFlags: rd ex mr mw me -70075876e000-70075876f000 rw-p 0002c000 fe:00 1521 /system/lib64/android.hardware.contexthub@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075876f000-700758772000 r--p 0002d000 fe:00 1521 /system/lib64/android.hardware.contexthub@1.0.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me ac -7007587a6000-7007587a8000 r--p 00000000 fe:00 1270 /system/lib64/libschedulerservicehidl.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007587a8000-7007587a9000 r-xp 00002000 fe:00 1270 /system/lib64/libschedulerservicehidl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd ex mr mw me -7007587a9000-7007587aa000 rw-p 00003000 fe:00 1270 /system/lib64/libschedulerservicehidl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007587aa000-7007587ab000 r--p 00004000 fe:00 1270 /system/lib64/libschedulerservicehidl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007587ab000-7007587ae000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587ae000-7007587af000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587af000-7007587b2000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587b2000-7007587b3000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587b3000-7007587b6000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587b6000-7007587b7000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587b7000-7007587ba000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587ba000-7007587bb000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587bb000-7007587be000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587be000-7007587bf000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587bf000-7007587c2000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587c2000-7007587c3000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587c3000-7007587cd000 r--p 00000000 fe:00 1157 /system/lib64/android.hardware.light@2.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 16 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -7007587cd000-7007587d7000 r-xp 0000a000 fe:00 1157 /system/lib64/android.hardware.light@2.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 40 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 40 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 40 kB -VmFlags: rd ex mr mw me -7007587d7000-7007587d8000 rw-p 00014000 fe:00 1157 /system/lib64/android.hardware.light@2.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007587d8000-7007587da000 r--p 00015000 fe:00 1157 /system/lib64/android.hardware.light@2.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -7007587db000-7007587dd000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587dd000-7007587e0000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587e0000-7007587e1000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587e1000-7007587e4000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587e4000-7007587e5000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587e5000-7007587e8000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587e8000-7007587e9000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587e9000-7007587ec000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587ec000-7007587ed000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007587ed000-7007587f0000 r-xp 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me ac -7007587f0000-7007587f1000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758808000-700758814000 r--p 00000000 fe:00 1677 /system/lib64/android.hardware.vibrator@1.2.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 12 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me -700758814000-70075881f000 r-xp 0000c000 fe:00 1677 /system/lib64/android.hardware.vibrator@1.2.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 44 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 44 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 44 kB -VmFlags: rd ex mr mw me -70075881f000-700758820000 rw-p 00017000 fe:00 1677 /system/lib64/android.hardware.vibrator@1.2.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758820000-700758822000 r--p 00018000 fe:00 1677 /system/lib64/android.hardware.vibrator@1.2.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700758830000-700758850000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 32 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 32 kB -Referenced: 32 kB -Anonymous: 32 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd wr mr mw me ac -700758850000-700758858000 r--p 00000000 fe:00 1546 /system/lib64/libsensorservicehidl.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 24 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 24 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd mr mw me -700758858000-70075885c000 r-xp 00008000 fe:00 1546 /system/lib64/libsensorservicehidl.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 16 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd ex mr mw me -70075885c000-70075885d000 rw-p 0000c000 fe:00 1546 /system/lib64/libsensorservicehidl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075885d000-70075885f000 r--p 0000d000 fe:00 1546 /system/lib64/libsensorservicehidl.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700758860000-700758880000 r--s 00000000 00:13 6738 /dev/__properties__/u:object_r:system_boot_reason_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr me ms -700758880000-700758897000 r--p 00000000 fe:00 1225 /system/lib64/libkeystore_aidl.so -Size: 92 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 92 kB -Pss: 32 kB -Shared_Clean: 92 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 92 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd mr mw me -700758897000-7007588a4000 r-xp 00017000 fe:00 1225 /system/lib64/libkeystore_aidl.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 17 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 17 kB -VmFlags: rd ex mr mw me -7007588a4000-7007588a5000 rw-p 00024000 fe:00 1225 /system/lib64/libkeystore_aidl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007588a5000-7007588ad000 r--p 00025000 fe:00 1225 /system/lib64/libkeystore_aidl.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 32 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 32 kB -Referenced: 32 kB -Anonymous: 32 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd mr mw me ac -7007588ad000-7007588ae000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007588ae000-7007588b0000 r-xp 00000000 00:00 0 -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd ex mr mw me ac -7007588b0000-7007588d0000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me ac -7007588d0000-7007588d6000 r--p 00000000 fe:00 1704 /system/lib64/libkeystore_parcelables.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 7 kB -Shared_Clean: 24 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd mr mw me -7007588d6000-7007588da000 r-xp 00006000 fe:00 1704 /system/lib64/libkeystore_parcelables.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007588da000-7007588db000 rw-p 0000a000 fe:00 1704 /system/lib64/libkeystore_parcelables.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007588db000-7007588dc000 r--p 0000b000 fe:00 1704 /system/lib64/libkeystore_parcelables.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007588dd000-7007588de000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007588de000-7007588e6000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007588e6000-700758906000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700758906000-70075890e000 rw-s 00000000 fe:10 188581 /data/system/notification_log.db-shm -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr sh mr mw me ms -70075890e000-70075892d000 r--p 00000000 fe:00 1578 /system/lib64/android.hardware.broadcastradio@1.0.so -Size: 124 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 8 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me -70075892d000-70075895a000 r-xp 0001f000 fe:00 1578 /system/lib64/android.hardware.broadcastradio@1.0.so -Size: 180 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 176 kB -Pss: 176 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 176 kB -Private_Dirty: 0 kB -Referenced: 176 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 176 kB -VmFlags: rd ex mr mw me -70075895a000-70075895b000 rw-p 0004c000 fe:00 1578 /system/lib64/android.hardware.broadcastradio@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075895b000-700758961000 r--p 0004d000 fe:00 1578 /system/lib64/android.hardware.broadcastradio@1.0.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 24 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 24 kB -Referenced: 24 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd mr mw me ac -700758961000-700758962000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700758962000-700758965000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758965000-700758966000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700758966000-700758968000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758983000-700758984000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700758984000-70075898c000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075898c000-70075898d000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70075898d000-700758990000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700758990000-700758991000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700758991000-700758993000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007589b3000-7007589b4000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007589b4000-7007589bc000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007589bc000-7007589f8000 r--p 00000000 fe:00 1622 /system/lib64/libandroid_servers.so -Size: 240 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 100 kB -Pss: 100 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 100 kB -Private_Dirty: 0 kB -Referenced: 100 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 100 kB -VmFlags: rd mr mw me -7007589f8000-700758a36000 r-xp 0003c000 fe:00 1622 /system/lib64/libandroid_servers.so -Size: 248 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 244 kB -Pss: 244 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 244 kB -Private_Dirty: 0 kB -Referenced: 244 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 244 kB -VmFlags: rd ex mr mw me -700758a36000-700758a37000 rw-p 0007a000 fe:00 1622 /system/lib64/libandroid_servers.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758a37000-700758a3f000 r--p 0007b000 fe:00 1622 /system/lib64/libandroid_servers.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 32 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 32 kB -Referenced: 32 kB -Anonymous: 32 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd mr mw me ac -700758a3f000-700758a40000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758a40000-700758a41000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700758a41000-700758a49000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758a49000-700758a4a000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700758a4a000-700758a52000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758a52000-700758a5c000 r--p 00000000 fe:00 1507 /system/lib64/android.hardware.ir@1.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 16 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700758a5c000-700758a66000 r-xp 0000a000 fe:00 1507 /system/lib64/android.hardware.ir@1.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 40 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 40 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 40 kB -VmFlags: rd ex mr mw me -700758a66000-700758a67000 rw-p 00014000 fe:00 1507 /system/lib64/android.hardware.ir@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758a67000-700758a69000 r--p 00015000 fe:00 1507 /system/lib64/android.hardware.ir@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700758a69000-700758a6a000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700758a6a000-700758a6d000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758a6d000-700758a6e000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700758a6e000-700758a8e000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 36 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 36 kB -Referenced: 36 kB -Anonymous: 36 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 36 kB -VmFlags: rd wr mr mw me ac -700758a8e000-700758a8f000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700758a8f000-700758a90000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700758a90000-700758b88000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 20 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr mr mw me nr -700758b88000-700758b89000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700758b89000-700758b8a000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -700758b8a000-700758c82000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me nr -700758c82000-700758c85000 r--p 00000000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 6 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -700758c85000-700758c89000 r-xp 00003000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700758c89000-700758c8a000 r--p 00007000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700758c8a000-700758c8b000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758c8b000-700758c90000 r--s 00000000 fe:00 3249 /system/framework/oat/x86_64/com.android.location.provider.impl.vdex -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 10 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr me ms -700758c90000-700758c91000 r--p 00008000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -700758c91000-700758c92000 rw-p 00009000 fe:00 3277 /system/framework/oat/x86_64/com.android.location.provider.impl.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700758c93000-700758c94000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700758c94000-700758c97000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758c97000-700758c98000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700758c98000-700758c99000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700758c99000-700758ca1000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758ca1000-700758ca2000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700758ca2000-700758caa000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700758caa000-700758cca000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 128 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 128 kB -Referenced: 128 kB -Anonymous: 128 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 128 kB -VmFlags: rd wr mr mw me ac -700758cca000-700758d93000 r--p 00000000 fe:00 3287 /system/framework/oat/x86_64/wifi-service.odex -Size: 804 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 116 kB -Pss: 116 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 116 kB -Private_Dirty: 0 kB -Referenced: 116 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 116 kB -VmFlags: rd mr mw me -700758d93000-70075910d000 r-xp 000c9000 fe:00 3287 /system/framework/oat/x86_64/wifi-service.odex -Size: 3560 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 3184 kB -Pss: 3184 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 3184 kB -Private_Dirty: 0 kB -Referenced: 3184 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3184 kB -VmFlags: rd ex mr mw me -70075910d000-70075910f000 r--p 00443000 fe:00 3287 /system/framework/oat/x86_64/wifi-service.odex -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -70075910f000-700759118000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 36 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 36 kB -Referenced: 36 kB -Anonymous: 36 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 36 kB -VmFlags: rd wr mr mw me ac -700759118000-70075932e000 r--s 00000000 fe:00 3231 /system/framework/oat/x86_64/wifi-service.vdex -Size: 2136 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 64 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 64 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 64 kB -VmFlags: rd mr me ms -70075932e000-70075932f000 r--p 00445000 fe:00 3287 /system/framework/oat/x86_64/wifi-service.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -70075932f000-700759330000 rw-p 00446000 fe:00 3287 /system/framework/oat/x86_64/wifi-service.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700759330000-700759332000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700759332000-700759348000 r--s 00602000 fe:00 1821 /system/priv-app/Telecom/Telecom.apk -Size: 88 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 88 kB -Pss: 88 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 88 kB -Private_Dirty: 0 kB -Referenced: 88 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 88 kB -VmFlags: rd mr me ms -700759348000-700759349000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700759349000-700759351000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700759351000-700759355000 r--p 00000000 fe:00 3250 /system/framework/oat/x86_64/ethernet-service.odex -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 16 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700759355000-700759361000 r-xp 00004000 fe:00 3250 /system/framework/oat/x86_64/ethernet-service.odex -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 48 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 48 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 48 kB -VmFlags: rd ex mr mw me -700759361000-700759362000 r--p 00010000 fe:00 3250 /system/framework/oat/x86_64/ethernet-service.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700759362000-700759363000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700759363000-70075936b000 r--s 00000000 fe:00 3243 /system/framework/oat/x86_64/ethernet-service.vdex -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 32 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 32 kB -Private_Dirty: 0 kB -Referenced: 32 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd mr me ms -70075936b000-70075936c000 r--p 00011000 fe:00 3250 /system/framework/oat/x86_64/ethernet-service.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -70075936c000-70075936d000 rw-p 00012000 fe:00 3250 /system/framework/oat/x86_64/ethernet-service.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075936d000-70075936f000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075936f000-700759370000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700759370000-700759373000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700759373000-700759375000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700759375000-700759378000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700759378000-700759379000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700759379000-70075937a000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70075937a000-700759382000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700759382000-700759383000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700759383000-700759386000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700759386000-700759387000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700759387000-70075983a000 r--p 00000000 fe:00 3248 /system/framework/oat/x86_64/services.odex -Size: 4812 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2576 kB -Pss: 2576 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 2576 kB -Private_Dirty: 0 kB -Referenced: 2576 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2576 kB -VmFlags: rd mr mw me -70075983a000-70075a9b3000 r-xp 004b3000 fe:00 3248 /system/framework/oat/x86_64/services.odex -Size: 17892 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 17060 kB -Pss: 17060 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 17060 kB -Private_Dirty: 0 kB -Referenced: 17060 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 17060 kB -VmFlags: rd ex mr mw me -70075a9b3000-70075a9ba000 r--p 0162c000 fe:00 3248 /system/framework/oat/x86_64/services.odex -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 28 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 28 kB -Referenced: 28 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 28 kB -VmFlags: rd mr mw me ac -70075a9ba000-70075a9e2000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 160 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 160 kB -Pss: 160 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 160 kB -Referenced: 160 kB -Anonymous: 160 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 160 kB -VmFlags: rd wr mr mw me ac -70075a9e2000-70075b335000 r--s 00000000 fe:00 3271 /system/framework/oat/x86_64/services.vdex -Size: 9548 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2856 kB -Pss: 2856 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 2856 kB -Private_Dirty: 0 kB -Referenced: 2856 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2856 kB -VmFlags: rd mr me ms -70075b335000-70075b336000 r--p 01633000 fe:00 3248 /system/framework/oat/x86_64/services.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -70075b336000-70075b337000 rw-p 01634000 fe:00 3248 /system/framework/oat/x86_64/services.odex -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075b338000-70075b33a000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075b33a000-70075b33b000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70075b33b000-70075b343000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075b344000-70075b346000 r-xp 00000000 00:00 0 -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd ex mr mw me ac -70075b34b000-70075b34c000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70075b34c000-70075b34f000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075b34f000-70075b350000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70075b350000-70075b352000 r-xp 00000000 00:00 0 -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd ex mr mw me ac -70075b354000-70075b355000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70075b355000-70075b358000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075b358000-70075b359000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70075b359000-70075b35a000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70075b35a000-70075b362000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075b362000-70075b363000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70075b363000-70075b366000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075b366000-70075b367000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70075b367000-70075b369000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70075b369000-70075b36a000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70075b36a000-70075b372000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075b372000-70075b373000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70075b373000-70075b37b000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70075b37b000-70075b479000 r--p 00000000 00:13 6783 /dev/binder -Size: 1016 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 24 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 24 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd mr me dc nr mm -70075b479000-70075b47a000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075b47a000-70075b47b000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075b47b000-70075b57f000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70075b57f000-70075b580000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075b580000-70075b581000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075b581000-70075b685000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70075b685000-70075b686000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075b686000-70075b687000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075b687000-70075b78b000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me nr -70075b78b000-70075b78c000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075b78c000-70075b78d000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70075b78d000-70075b891000 rw-p 00000000 00:00 0 -Size: 1040 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70075b891000-70075d891000 r--s 02000000 00:05 9572 /memfd:/jit-cache (deleted) -Size: 32768 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd sh mr mw me ms -70075d891000-700766592000 ---p 00000000 00:00 0 -Size: 144388 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766592000-700766593000 r--p 00000000 fe:00 1106 /system/lib64/libwebviewchromium_loader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -700766593000-700766594000 r-xp 00001000 fe:00 1106 /system/lib64/libwebviewchromium_loader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700766594000-700766595000 rw-p 00002000 fe:00 1106 /system/lib64/libwebviewchromium_loader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766595000-700766596000 r--p 00003000 fe:00 1106 /system/lib64/libwebviewchromium_loader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700766596000-700766597000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766597000-700766598000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766598000-7007665a0000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665a0000-7007665a1000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007665a1000-7007665a4000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665a4000-7007665a5000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007665a5000-7007665a9000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007665ab000-7007665af000 r--s 00002000 fe:00 2036 /system/priv-app/FusedLocation/FusedLocation.apk -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 14 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 12 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 14 kB -VmFlags: rd mr me ms -7007665af000-7007665b2000 r--p 00000000 fe:00 2036 /system/priv-app/FusedLocation/FusedLocation.apk -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 10 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 8 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me ac -7007665b5000-7007665b7000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007665b7000-7007665b8000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007665b8000-7007665bb000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665bb000-7007665bc000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007665bc000-7007665be000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007665be000-7007665bf000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007665bf000-7007665c7000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665c7000-7007665c8000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007665c8000-7007665d0000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665d0000-7007665d1000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007665d1000-7007665d4000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665d4000-7007665d6000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007665d6000-7007665d9000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665d9000-7007665da000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007665da000-7007665db000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007665db000-7007665e3000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665e3000-7007665e4000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007665e4000-7007665ec000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665ed000-7007665ef000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665ef000-7007665f0000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007665f0000-7007665f8000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007665f8000-700766646000 r--s 00000000 fe:00 1030 /system/usr/hyphen-data/hyph-hu.hyb -Size: 312 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700766646000-70076664f000 r--p 00000000 fe:00 1712 /system/lib64/libcompiler_rt.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 9 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -70076664f000-700766664000 r-xp 00009000 fe:00 1712 /system/lib64/libcompiler_rt.so -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700766664000-700766665000 rw-p 0001e000 fe:00 1712 /system/lib64/libcompiler_rt.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766665000-700766666000 r--p 0001f000 fe:00 1712 /system/lib64/libcompiler_rt.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700766666000-700766690000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 168 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766691000-700766699000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700766699000-70076669b000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076669b000-70076669c000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076669c000-70076669f000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076669f000-7007666a0000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007666a0000-7007666b0000 rw-s 00000000 00:05 11661 /dev/ashmem/RemoteDataSource (deleted) -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd wr sh mr mw me ms -7007666b0000-7007666b1000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007666b1000-7007666b9000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007666b9000-7007666ba000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007666ba000-7007666bd000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007666bd000-7007666be000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007666be000-7007666c0000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007666c0000-700766751000 r--p 00000000 fe:30 333 /vendor/lib64/egl/libGLESv1_CM_swiftshader.so -Size: 580 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 192 kB -Pss: 38 kB -Shared_Clean: 192 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 192 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 38 kB -VmFlags: rd mr mw me -700766751000-70076690e000 r-xp 00091000 fe:30 333 /vendor/lib64/egl/libGLESv1_CM_swiftshader.so -Size: 1780 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 116 kB -Pss: 24 kB -Shared_Clean: 116 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 116 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd ex mr mw me -70076690e000-70076690f000 rw-p 0024e000 fe:30 333 /vendor/lib64/egl/libGLESv1_CM_swiftshader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076690f000-70076691f000 r--p 0024f000 fe:30 333 /vendor/lib64/egl/libGLESv1_CM_swiftshader.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 3 kB -Shared_Clean: 0 kB -Shared_Dirty: 64 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 64 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me ac -70076691f000-70076696d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 312 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 312 kB -Pss: 17 kB -Shared_Clean: 0 kB -Shared_Dirty: 312 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 312 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 17 kB -VmFlags: rd wr mr mw me ac -70076696d000-70076696e000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076696e000-700766976000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766976000-700766977000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766977000-70076697f000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076697f000-700766980000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766980000-700766983000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766983000-700766985000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766985000-700766988000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766988000-70076698a000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076698a000-70076698d000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076698d000-70076698f000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076698f000-700766992000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766992000-700766993000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766993000-700766994000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766994000-70076699c000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076699c000-700766a5f000 r--p 00000000 fe:30 335 /vendor/lib64/egl/libGLESv2_swiftshader.so -Size: 780 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 256 kB -Pss: 51 kB -Shared_Clean: 256 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 256 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 51 kB -VmFlags: rd mr mw me -700766a5f000-700766c8d000 r-xp 000c3000 fe:30 335 /vendor/lib64/egl/libGLESv2_swiftshader.so -Size: 2232 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2212 kB -Pss: 624 kB -Shared_Clean: 2212 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 2212 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 624 kB -VmFlags: rd ex mr mw me -700766c8d000-700766c8e000 rw-p 002f1000 fe:30 335 /vendor/lib64/egl/libGLESv2_swiftshader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700766c8e000-700766ca2000 r--p 002f2000 fe:30 335 /vendor/lib64/egl/libGLESv2_swiftshader.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 80 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 80 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 80 kB -Anonymous: 80 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700766ca2000-700766cf0000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 312 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 312 kB -Pss: 32 kB -Shared_Clean: 0 kB -Shared_Dirty: 296 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 44 kB -Anonymous: 312 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd wr mr mw me ac -700766cf1000-700766cf3000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766cf3000-700766cf4000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766cf4000-700766cf7000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766cf7000-700766cf9000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766cf9000-700766cfc000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766cfc000-700766cfd000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766cfd000-700766cfe000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766cfe000-700766d06000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766d06000-700766d13000 r--p 00000000 fe:30 334 /vendor/lib64/egl/libEGL_swiftshader.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 10 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -700766d13000-700766d2f000 r-xp 0000d000 fe:30 334 /vendor/lib64/egl/libEGL_swiftshader.so -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 112 kB -Pss: 22 kB -Shared_Clean: 112 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 112 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 22 kB -VmFlags: rd ex mr mw me -700766d2f000-700766d30000 rw-p 00029000 fe:30 334 /vendor/lib64/egl/libEGL_swiftshader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766d30000-700766d31000 r--p 0002a000 fe:30 334 /vendor/lib64/egl/libEGL_swiftshader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700766d31000-700766d78000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 284 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 284 kB -Pss: 19 kB -Shared_Clean: 0 kB -Shared_Dirty: 280 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 284 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 19 kB -VmFlags: rd wr mr mw me ac -700766d78000-700766d7e000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me ac -700766d7e000-700766d7f000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766d7f000-700766d82000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766d82000-700766d83000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766d83000-700766d84000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766d84000-700766d8c000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766d8c000-700766d8d000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766d8d000-700766d90000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766d90000-700766d91000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766d91000-700766db1000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 124 kB -Pss: 124 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 124 kB -Referenced: 124 kB -Anonymous: 124 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 124 kB -VmFlags: rd wr mr mw me ac -700766db1000-700766db3000 r--p 00000000 fe:00 1488 /system/lib64/vndk-sp-Q/libbinderthreadstate.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -700766db3000-700766db5000 r-xp 00002000 fe:00 1488 /system/lib64/vndk-sp-Q/libbinderthreadstate.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700766db5000-700766db6000 rw-p 00004000 fe:00 1488 /system/lib64/vndk-sp-Q/libbinderthreadstate.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766db6000-700766db7000 r--p 00005000 fe:00 1488 /system/lib64/vndk-sp-Q/libbinderthreadstate.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700766db7000-700766db8000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766db8000-700766dbc000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700766dbc000-700766dbd000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766dbd000-700766dc5000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766dc5000-700766dc6000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766dc6000-700766dce000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766dce000-700766e26000 r--p 00000000 fe:00 1497 /system/lib64/vndk-sp-Q/libc++.so -Size: 352 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 252 kB -Pss: 11 kB -Shared_Clean: 252 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 252 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 11 kB -VmFlags: rd mr mw me -700766e26000-700766e9a000 r-xp 00058000 fe:00 1497 /system/lib64/vndk-sp-Q/libc++.so -Size: 464 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 408 kB -Pss: 18 kB -Shared_Clean: 408 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 408 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 18 kB -VmFlags: rd ex mr mw me -700766e9a000-700766e9b000 rw-p 000cc000 fe:00 1497 /system/lib64/vndk-sp-Q/libc++.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766e9b000-700766ea3000 r--p 000cd000 fe:00 1497 /system/lib64/vndk-sp-Q/libc++.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 32 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 32 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -700766ea3000-700766ea7000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me ac -700766ea8000-700766ea9000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766ea9000-700766eac000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766eac000-700766ead000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766ead000-700766eae000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766eae000-700766eb6000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766eb6000-700766ed6000 r--s 00000000 00:13 6703 /dev/__properties__/u:object_r:device_logging_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr me ms -700766ed6000-700766ee9000 r--p 00000000 fe:00 1476 /system/lib64/vndk-sp-Q/libhwbinder.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 3 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -700766ee9000-700766efa000 r-xp 00013000 fe:00 1476 /system/lib64/vndk-sp-Q/libhwbinder.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700766efa000-700766efb000 rw-p 00024000 fe:00 1476 /system/lib64/vndk-sp-Q/libhwbinder.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766efb000-700766efd000 r--p 00025000 fe:00 1476 /system/lib64/vndk-sp-Q/libhwbinder.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700766efd000-700766efe000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766eff000-700766f01000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700766f01000-700766f02000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766f02000-700766f05000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766f05000-700766f07000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766f07000-700766f0a000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766f0a000-700766f0b000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766f0c000-700766f0d000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766f0d000-700766f10000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766f10000-700766f11000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766f11000-700766f13000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700766f13000-700766f14000 r--p 00000000 fe:00 1492 /system/lib64/vndk-sp-Q/libhardware.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -700766f14000-700766f15000 r-xp 00001000 fe:00 1492 /system/lib64/vndk-sp-Q/libhardware.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700766f15000-700766f16000 rw-p 00002000 fe:00 1492 /system/lib64/vndk-sp-Q/libhardware.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766f16000-700766f17000 r--p 00003000 fe:00 1492 /system/lib64/vndk-sp-Q/libhardware.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700766f17000-700766f37000 r--s 00000000 00:13 6734 /dev/__properties__/u:object_r:safemode_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr me ms -700766f37000-700766f57000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 128 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 128 kB -Referenced: 128 kB -Anonymous: 128 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 128 kB -VmFlags: rd wr mr mw me ac -700766f57000-700766f63000 r--p 00000000 fe:00 1491 /system/lib64/vndk-sp-Q/android.hardware.graphics.mapper@2.0.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 6 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -700766f63000-700766f6f000 r-xp 0000c000 fe:00 1491 /system/lib64/vndk-sp-Q/android.hardware.graphics.mapper@2.0.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 6 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd ex mr mw me -700766f6f000-700766f70000 rw-p 00018000 fe:00 1491 /system/lib64/vndk-sp-Q/android.hardware.graphics.mapper@2.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766f70000-700766f72000 r--p 00019000 fe:00 1491 /system/lib64/vndk-sp-Q/android.hardware.graphics.mapper@2.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700766f72000-700766f74000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700766f74000-700766f75000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766f75000-700766f7d000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766f7d000-700766f7e000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766f7e000-700766f81000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766f81000-700766f82000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766f82000-700766f83000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766f83000-700766f8b000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766f8b000-700766f8e000 r--p 00000000 fe:30 348 /vendor/lib64/hw/android.hardware.graphics.mapper@2.0-impl.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 1 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -700766f8e000-700766f91000 r-xp 00003000 fe:30 348 /vendor/lib64/hw/android.hardware.graphics.mapper@2.0-impl.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 2 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd ex mr mw me -700766f91000-700766f92000 rw-p 00006000 fe:30 348 /vendor/lib64/hw/android.hardware.graphics.mapper@2.0-impl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766f92000-700766f93000 r--p 00007000 fe:30 348 /vendor/lib64/hw/android.hardware.graphics.mapper@2.0-impl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700766f93000-700766f94000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700766f95000-700766f99000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700766f99000-700766f9a000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766f9a000-700766fa2000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766fa2000-700766fa3000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700766fa3000-700766fab000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766fab000-700766fcb000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 128 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 128 kB -Referenced: 128 kB -Anonymous: 128 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 128 kB -VmFlags: rd wr mr mw me ac -700766fcb000-700766fd2000 r--p 00000000 fe:00 1487 /system/lib64/vndk-sp-Q/libcutils.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 1 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -700766fd2000-700766fdb000 r-xp 00007000 fe:00 1487 /system/lib64/vndk-sp-Q/libcutils.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 2 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd ex mr mw me -700766fdb000-700766fdc000 rw-p 00010000 fe:00 1487 /system/lib64/vndk-sp-Q/libcutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766fdc000-700766fde000 r--p 00011000 fe:00 1487 /system/lib64/vndk-sp-Q/libcutils.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700766fde000-700766fdf000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766fe0000-700766fe1000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766fe1000-700766fe4000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700766fe4000-700766fe5000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700766fe5000-700767005000 r--s 00000000 00:13 6741 /dev/__properties__/u:object_r:system_radio_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr me ms -700767005000-70076700e000 r--p 00000000 fe:00 1503 /system/lib64/vndk-sp-Q/libbase.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 1 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -70076700e000-700767017000 r-xp 00009000 fe:00 1503 /system/lib64/vndk-sp-Q/libbase.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700767017000-700767018000 rw-p 00012000 fe:00 1503 /system/lib64/vndk-sp-Q/libbase.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767018000-700767019000 r--p 00013000 fe:00 1503 /system/lib64/vndk-sp-Q/libbase.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700767019000-70076701a000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076701b000-70076701d000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076701d000-70076701e000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076701e000-700767026000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767026000-700767027000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767027000-70076702a000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076702a000-70076702b000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076702b000-70076702c000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076702c000-700767034000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767034000-700767035000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767035000-700767038000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767038000-700767039000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767039000-70076703a000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076703a000-700767042000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767042000-700767043000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700767043000-70076704b000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076704b000-70076705a000 r--p 00000000 fe:00 1478 /system/lib64/vndk-sp-Q/libutils.so -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 2 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -70076705a000-700767066000 r-xp 0000f000 fe:00 1478 /system/lib64/vndk-sp-Q/libutils.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 2 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd ex mr mw me -700767066000-700767067000 rw-p 0001b000 fe:00 1478 /system/lib64/vndk-sp-Q/libutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767067000-700767068000 r--p 0001c000 fe:00 1478 /system/lib64/vndk-sp-Q/libutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700767068000-700767069000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076706a000-70076706c000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076706c000-70076706d000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076706d000-700767070000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767070000-700767072000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767072000-700767075000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767075000-700767077000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767077000-70076707a000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076707a000-70076707b000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076707b000-70076707c000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076707c000-700767084000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767084000-700767085000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700767085000-70076708d000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076708e000-700767094000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700767094000-700767095000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767095000-700767098000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767098000-700767099000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767099000-70076709b000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076709b000-7007670d4000 r--p 00000000 fe:00 1489 /system/lib64/vndk-sp-Q/libhidltransport.so -Size: 228 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 148 kB -Pss: 10 kB -Shared_Clean: 148 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 148 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007670d4000-70076712f000 r-xp 00039000 fe:00 1489 /system/lib64/vndk-sp-Q/libhidltransport.so -Size: 364 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 236 kB -Pss: 13 kB -Shared_Clean: 236 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 236 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 13 kB -VmFlags: rd ex mr mw me -70076712f000-700767130000 rw-p 00094000 fe:00 1489 /system/lib64/vndk-sp-Q/libhidltransport.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767130000-70076713a000 r--p 00095000 fe:00 1489 /system/lib64/vndk-sp-Q/libhidltransport.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 40 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 40 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me ac -70076713a000-70076713b000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076713b000-70076713c000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076713c000-70076713f000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076713f000-700767141000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767141000-700767144000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767144000-700767145000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767145000-700767146000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700767146000-70076714e000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076714e000-70076714f000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076714f000-700767152000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767152000-700767153000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700767153000-700767154000 r--p 00000000 fe:00 1495 /system/lib64/vndk-sp-Q/android.hardware.graphics.common@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -700767154000-700767155000 r-xp 00001000 fe:00 1495 /system/lib64/vndk-sp-Q/android.hardware.graphics.common@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700767155000-700767156000 rw-p 00002000 fe:00 1495 /system/lib64/vndk-sp-Q/android.hardware.graphics.common@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700767156000-700767157000 r--p 00003000 fe:00 1495 /system/lib64/vndk-sp-Q/android.hardware.graphics.common@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700767157000-700767197000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 152 kB -Pss: 152 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 152 kB -Referenced: 152 kB -Anonymous: 152 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 152 kB -VmFlags: rd wr mr mw me ac -700767197000-7007671a6000 r--p 00000000 fe:00 1477 /system/lib64/vndk-sp-Q/libhidlbase.so -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 3 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007671a6000-7007671b9000 r-xp 0000f000 fe:00 1477 /system/lib64/vndk-sp-Q/libhidlbase.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 1 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd ex mr mw me -7007671b9000-7007671ba000 rw-p 00022000 fe:00 1477 /system/lib64/vndk-sp-Q/libhidlbase.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007671ba000-7007671bc000 r--p 00023000 fe:00 1477 /system/lib64/vndk-sp-Q/libhidlbase.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007671bc000-7007671bd000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007671bd000-7007671bf000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007671bf000-7007671c0000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007671c0000-7007671c8000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007671c8000-7007671c9000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007671c9000-7007671cc000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007671cc000-7007671cd000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007671cd000-7007671ce000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007671ce000-7007671d6000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007671d6000-7007671d7000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007671d7000-7007671da000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007671da000-7007671db000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007671db000-700768d59000 r--s 00bc3000 fe:00 3346 /system/framework/framework-res.apk -Size: 28152 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 19968 kB -Pss: 1144 kB -Shared_Clean: 19956 kB -Shared_Dirty: 0 kB -Private_Clean: 12 kB -Private_Dirty: 0 kB -Referenced: 19968 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1144 kB -VmFlags: rd mr me ms -700768d59000-700768e14000 r--s 0287a000 fe:00 3346 /system/framework/framework-res.apk -Size: 748 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 144 kB -Pss: 18 kB -Shared_Clean: 144 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 144 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 18 kB -VmFlags: rd mr me ms -700768e14000-700768e35000 r--p 00000000 fe:00 1638 /system/lib64/libssl.so -Size: 132 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 108 kB -Pss: 38 kB -Shared_Clean: 108 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 108 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 38 kB -VmFlags: rd mr mw me -700768e35000-700768e6c000 r-xp 00021000 fe:00 1638 /system/lib64/libssl.so -Size: 220 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 172 kB -Pss: 88 kB -Shared_Clean: 168 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 172 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 88 kB -VmFlags: rd ex mr mw me -700768e6c000-700768e6d000 rw-p 00058000 fe:00 1638 /system/lib64/libssl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768e6d000-700768e70000 r--p 00059000 fe:00 1638 /system/lib64/libssl.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700768e70000-700768e74000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700768e74000-700768e75000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700768e75000-700768e7d000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768e7d000-700768e7e000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700768e7e000-700768e81000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768e81000-700768e82000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700768e82000-700768ea2000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 128 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 128 kB -Referenced: 128 kB -Anonymous: 128 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 128 kB -VmFlags: rd wr mr mw me ac -700768ea2000-700768ebf000 r--p 00000000 fe:00 1513 /system/lib64/libjavacrypto.so -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 112 kB -Pss: 23 kB -Shared_Clean: 112 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 112 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 23 kB -VmFlags: rd mr mw me -700768ebf000-700768ee5000 r-xp 0001d000 fe:00 1513 /system/lib64/libjavacrypto.so -Size: 152 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 152 kB -Pss: 27 kB -Shared_Clean: 152 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 152 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 27 kB -VmFlags: rd ex mr mw me -700768ee5000-700768ee7000 rw-p 00043000 fe:00 1513 /system/lib64/libjavacrypto.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768ee7000-700768ee9000 r--p 00045000 fe:00 1513 /system/lib64/libjavacrypto.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700768ee9000-700768eea000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768eea000-700768eeb000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700768eeb000-700768ef3000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768ef3000-700768ef4000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700768ef4000-700768efc000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768efc000-700768f1c000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 128 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 128 kB -Referenced: 128 kB -Anonymous: 128 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 128 kB -VmFlags: rd wr mr mw me ac -700768f1c000-700768f22000 r--p 00000000 fe:00 1763 /system/lib64/libsoundpool.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 4 kB -Shared_Clean: 24 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -700768f22000-700768f27000 r-xp 00006000 fe:00 1763 /system/lib64/libsoundpool.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 6 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd ex mr mw me -700768f27000-700768f28000 rw-p 0000b000 fe:00 1763 /system/lib64/libsoundpool.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768f28000-700768f29000 r--p 0000c000 fe:00 1763 /system/lib64/libsoundpool.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700768f29000-700768f2a000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768f2b000-700768f2c000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700768f2c000-700768f2f000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768f2f000-700768f31000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700768f31000-700768f34000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768f34000-700768f35000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700768f35000-700768f36000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700768f36000-700768f3e000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700768f3e000-700768f5e000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 128 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 128 kB -Referenced: 128 kB -Anonymous: 128 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 128 kB -VmFlags: rd wr mr mw me ac -700768f5e000-700768fd9000 r--s 00000000 07:08 15 /apex/com.android.tzdata/etc/tz/tzdata -Size: 492 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700768fd9000-700769748000 r--s 00000000 fe:00 100 /system/fonts/NotoColorEmoji.ttf -Size: 7612 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700769748000-70076aee5000 r--s 00000000 fe:00 130 /system/fonts/NotoSerifCJK-Regular.ttc -Size: 24180 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076aee5000-70076c0b5000 r--s 00000000 fe:00 239 /system/fonts/NotoSansCJK-Regular.ttc -Size: 18240 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c0b5000-70076c163000 r--s 00000000 fe:00 161 /system/fonts/NotoSansSymbols-Regular-Subsetted.ttf -Size: 696 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c163000-70076c1bf000 r--s 00000000 fe:00 257 /system/fonts/NotoSansTibetan-Bold.ttf -Size: 368 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c1bf000-70076c222000 r--s 00000000 fe:00 270 /system/fonts/NotoSansTibetan-Regular.ttf -Size: 396 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c222000-70076c29e000 r--s 00000000 fe:00 254 /system/fonts/NotoSansEgyptianHieroglyphs-Regular.ttf -Size: 496 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c29e000-70076c319000 r--s 00000000 fe:00 196 /system/fonts/NotoSansCuneiform-Regular.ttf -Size: 492 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c319000-70076c36a000 r--s 00000000 fe:00 233 /system/fonts/RobotoCondensed-BoldItalic.ttf -Size: 324 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c36a000-70076c3b5000 r--s 00000000 fe:00 282 /system/fonts/RobotoCondensed-Bold.ttf -Size: 300 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c3b5000-70076c406000 r--s 00000000 fe:00 288 /system/fonts/RobotoCondensed-MediumItalic.ttf -Size: 324 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c406000-70076c451000 r--s 00000000 fe:00 184 /system/fonts/RobotoCondensed-Medium.ttf -Size: 300 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076c451000-70076c6d1000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 2560 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2452 kB -Pss: 1171 kB -Shared_Clean: 0 kB -Shared_Dirty: 1356 kB -Private_Clean: 0 kB -Private_Dirty: 1096 kB -Referenced: 1336 kB -Anonymous: 2452 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1171 kB -VmFlags: rd wr mr mw me ac -70076c6d1000-70076de00000 r--s 00000000 fe:00 1096 /system/usr/icu/icudt63l.dat -Size: 23740 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 452 kB -Pss: 85 kB -Shared_Clean: 452 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 452 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 85 kB -VmFlags: rd mr me ms -70076de00000-70076e200000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 4096 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 3988 kB -Pss: 3677 kB -Shared_Clean: 0 kB -Shared_Dirty: 336 kB -Private_Clean: 0 kB -Private_Dirty: 3652 kB -Referenced: 3632 kB -Anonymous: 3988 kB -AnonHugePages: 2048 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3677 kB -VmFlags: rd wr mr mw me ac -70076e201000-70076e203000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076e203000-70076e204000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076e204000-70076e20c000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076e20c000-70076e25d000 r--s 00000000 fe:00 182 /system/fonts/RobotoCondensed-Italic.ttf -Size: 324 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076e25d000-70076e2a7000 r--s 00000000 fe:00 96 /system/fonts/RobotoCondensed-Regular.ttf -Size: 296 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076e2a7000-70076e2f9000 r--s 00000000 fe:00 285 /system/fonts/RobotoCondensed-LightItalic.ttf -Size: 328 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70076e2f9000-70076e2fd000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -70076e2fd000-70076e2fe000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076e2fe000-70076e301000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076e301000-70076e303000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076e303000-70076e306000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076e306000-70076e307000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076e307000-70076e308000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076e308000-70076e310000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076e310000-70076e311000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076e311000-70076e314000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076e314000-70076e315000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076e315000-70076e316000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076e316000-70076e31e000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076e31e000-70076e31f000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076e31f000-70076e327000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076e327000-70076e328000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70076e328000-70076e329000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70076e329000-70076e421000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70076e421000-70076e422000 ---p 00000000 00:00 0 [anon:thread stack guard] -Name: [anon:thread stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70076e422000-70076e423000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me nr -70076e423000-70076e51b000 rw-p 00000000 00:00 0 -Size: 992 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me nr -70076e51b000-70076e51c000 ---p 00000000 00:00 0 [anon:dalvik-Jit thread pool worker thread 0] -Name: [anon:dalvik-Jit thread pool worker thread 0] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076e51c000-70076e51d000 ---p 00000000 00:00 0 [anon:dalvik-Jit thread pool worker thread 0] -Name: [anon:dalvik-Jit thread pool worker thread 0] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076e51d000-70076e61c000 rw-p 00000000 00:00 0 [anon:dalvik-Jit thread pool worker thread 0] -Name: [anon:dalvik-Jit thread pool worker thread 0] -Size: 1020 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 28 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 28 kB -Referenced: 28 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 28 kB -VmFlags: rd wr mr mw me ac -70076e61c000-70076e717000 rw-p 00000000 00:00 0 [anon:dalvik-allocspace non moving space mark-bitmap 1] -Name: [anon:dalvik-allocspace non moving space mark-bitmap 1] -Size: 1004 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076e717000-70076e812000 rw-p 00000000 00:00 0 [anon:dalvik-allocspace non moving space live-bitmap 1] -Name: [anon:dalvik-allocspace non moving space live-bitmap 1] -Size: 1004 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076e812000-70076e8f1000 r--p 00000000 fe:00 1114 /system/lib64/libart-compiler.so -Size: 892 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 188 kB -Pss: 27 kB -Shared_Clean: 188 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 188 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 27 kB -VmFlags: rd mr mw me -70076e8f1000-70076eb46000 r-xp 000df000 fe:00 1114 /system/lib64/libart-compiler.so -Size: 2388 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2092 kB -Pss: 201 kB -Shared_Clean: 2092 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 2092 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 201 kB -VmFlags: rd ex mr mw me -70076eb46000-70076eb47000 rw-p 00334000 fe:00 1114 /system/lib64/libart-compiler.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076eb47000-70076eb59000 r--p 00335000 fe:00 1114 /system/lib64/libart-compiler.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 72 kB -Pss: 3 kB -Shared_Clean: 0 kB -Shared_Dirty: 72 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 72 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me ac -70076eb59000-70076eb5a000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076eb5b000-70076eb5d000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076eb5d000-70076eb5e000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076eb5e000-70076eb61000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076eb61000-70076eb62000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076eb62000-70076eb82000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 124 kB -Pss: 124 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 124 kB -Referenced: 124 kB -Anonymous: 124 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 124 kB -VmFlags: rd wr mr mw me ac -70076eb82000-70076eb9c000 r--p 00000000 fe:00 1229 /system/lib64/libopenjdk.so -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 100 kB -Pss: 5 kB -Shared_Clean: 100 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 100 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -70076eb9c000-70076ebb7000 r-xp 0001a000 fe:00 1229 /system/lib64/libopenjdk.so -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 108 kB -Pss: 8 kB -Shared_Clean: 108 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 108 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd ex mr mw me -70076ebb7000-70076ebb9000 rw-p 00035000 fe:00 1229 /system/lib64/libopenjdk.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076ebb9000-70076ebba000 r--p 00037000 fe:00 1229 /system/lib64/libopenjdk.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -70076ebba000-70076ebbb000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076ebbb000-70076ebbd000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076ebbd000-70076ebbe000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076ebbe000-70076ebc1000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076ebc1000-70076ebc2000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70076ebc2000-70076ebe2000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 112 kB -Pss: 112 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 112 kB -Referenced: 112 kB -Anonymous: 112 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 112 kB -VmFlags: rd wr mr mw me ac -70076ebe2000-70076ebe6000 r--p 00000000 fe:00 1645 /system/lib64/libopenjdkjvm.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 5 kB -Shared_Clean: 16 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -70076ebe6000-70076ebea000 r-xp 00004000 fe:00 1645 /system/lib64/libopenjdkjvm.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 16 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -70076ebea000-70076ebeb000 rw-p 00008000 fe:00 1645 /system/lib64/libopenjdkjvm.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076ebeb000-70076ebec000 r--p 00009000 fe:00 1645 /system/lib64/libopenjdkjvm.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -70076ebed000-70076ebef000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70076ebef000-70076ebf0000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076ebf0000-70076ebf8000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076ebf8000-70076ebf9000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076ebf9000-70076ec01000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076ec01000-70076ec02000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -70076ec02000-70076ec0a000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076ec0a000-70076ec2a000 rw-p 00000000 00:00 0 [anon:dalvik-CompilerMetadata] -Name: [anon:dalvik-CompilerMetadata] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70076ec2a000-700770359000 r--s 00000000 fe:00 1096 /system/usr/icu/icudt63l.dat -Size: 23740 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1164 kB -Pss: 165 kB -Shared_Clean: 1164 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 1164 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 165 kB -VmFlags: rd mr me ms rr -700770359000-700770371000 r--p 00000000 fe:00 1615 /system/lib64/libjavacore.so -Size: 96 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 92 kB -Pss: 10 kB -Shared_Clean: 92 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 92 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -700770371000-700770396000 r-xp 00018000 fe:00 1615 /system/lib64/libjavacore.so -Size: 148 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 148 kB -Pss: 8 kB -Shared_Clean: 148 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 148 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd ex mr mw me -700770396000-700770398000 rw-p 0003d000 fe:00 1615 /system/lib64/libjavacore.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770398000-70077039a000 r--p 0003f000 fe:00 1615 /system/lib64/libjavacore.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -70077039a000-70077039b000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70077039c000-70077039e000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70077039e000-70077039f000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70077039f000-7007703a2000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007703a2000-7007703a3000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007703a3000-7007703a4000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007703a4000-7007703ac000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007703ac000-7007703cc000 rw-p 00000000 00:00 0 [anon:dalvik-CompilerMetadata] -Name: [anon:dalvik-CompilerMetadata] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007703cc000-7007703ce000 r--p 00000000 fe:00 1134 /system/lib64/libwebviewchromium_plat_support.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007703ce000-7007703cf000 r-xp 00002000 fe:00 1134 /system/lib64/libwebviewchromium_plat_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007703cf000-7007703d0000 rw-p 00003000 fe:00 1134 /system/lib64/libwebviewchromium_plat_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007703d0000-7007703d1000 r--p 00004000 fe:00 1134 /system/lib64/libwebviewchromium_plat_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007703d1000-7007703d2000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007703d2000-7007703d3000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007703d3000-7007703d6000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007703d6000-7007703d7000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007703d7000-7007703d8000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007703d8000-7007703e0000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007703e0000-700770400000 rw-p 00000000 00:00 0 [anon:dalvik-CompilerMetadata] -Name: [anon:dalvik-CompilerMetadata] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770400000-700770423000 r--p 00000000 fe:00 1228 /system/lib64/android.hardware.renderscript@1.0.so -Size: 140 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 21 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 21 kB -VmFlags: rd mr mw me -700770423000-70077047a000 r-xp 00023000 fe:00 1228 /system/lib64/android.hardware.renderscript@1.0.so -Size: 348 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -70077047a000-70077047b000 rw-p 0007a000 fe:00 1228 /system/lib64/android.hardware.renderscript@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70077047b000-70077047f000 r--p 0007b000 fe:00 1228 /system/lib64/android.hardware.renderscript@1.0.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770480000-700770481000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770481000-700770484000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770484000-700770486000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770486000-700770489000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770489000-70077048a000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70077048a000-7007704aa000 rw-p 00000000 00:00 0 [anon:dalvik-CompilerMetadata] -Name: [anon:dalvik-CompilerMetadata] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007704aa000-7007704b2000 r--p 00000000 fe:00 1184 /system/lib64/libRS.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 10 kB -Shared_Clean: 32 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 32 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007704b2000-7007704bc000 r-xp 00008000 fe:00 1184 /system/lib64/libRS.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007704bc000-7007704bd000 rw-p 00012000 fe:00 1184 /system/lib64/libRS.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007704bd000-7007704be000 r--p 00013000 fe:00 1184 /system/lib64/libRS.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007704be000-7007704bf000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007704c0000-7007704c2000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007704c2000-7007704c3000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007704c3000-7007704c6000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007704c6000-7007704c7000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007704c7000-7007704c8000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007704c8000-7007704d0000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007704d0000-7007704d2000 r--p 00000000 fe:00 1768 /system/lib64/libOpenSLES.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 2 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -7007704d2000-7007704d3000 r-xp 00002000 fe:00 1768 /system/lib64/libOpenSLES.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007704d3000-7007704d4000 rw-p 00003000 fe:00 1768 /system/lib64/libOpenSLES.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007704d4000-7007704d5000 r--p 00004000 fe:00 1768 /system/lib64/libOpenSLES.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007704d5000-7007704d6000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007704d6000-7007704d9000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007704d9000-7007704da000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007704da000-7007704db000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007704db000-7007704e3000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007704e3000-700770503000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 124 kB -Pss: 124 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 124 kB -Referenced: 124 kB -Anonymous: 124 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 124 kB -VmFlags: rd wr mr mw me ac -700770503000-700770505000 r--p 00000000 fe:00 1250 /system/lib64/libOpenMAXAL.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 2 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -700770505000-700770506000 r-xp 00002000 fe:00 1250 /system/lib64/libOpenMAXAL.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770506000-700770507000 rw-p 00003000 fe:00 1250 /system/lib64/libOpenMAXAL.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770507000-700770508000 r--p 00004000 fe:00 1250 /system/lib64/libOpenMAXAL.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770508000-700770528000 rw-p 00000000 00:00 0 [anon:dalvik-CompilerMetadata] -Name: [anon:dalvik-CompilerMetadata] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770528000-700770551000 r--p 00000000 fe:00 1943 /system/priv-app/SettingsProvider/SettingsProvider.apk -Size: 164 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 88 kB -Pss: 88 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 88 kB -Private_Dirty: 0 kB -Referenced: 88 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 88 kB -VmFlags: rd mr mw me ac -700770551000-700770575000 r--p 00000000 fe:00 1470 /system/lib64/libneuralnetworks.so -Size: 144 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 21 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 21 kB -VmFlags: rd mr mw me -700770575000-70077065a000 r-xp 00024000 fe:00 1470 /system/lib64/libneuralnetworks.so -Size: 916 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -70077065a000-70077065b000 rw-p 00109000 fe:00 1470 /system/lib64/libneuralnetworks.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70077065b000-70077065e000 r--p 0010a000 fe:00 1470 /system/lib64/libneuralnetworks.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -70077065e000-70077096f000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 3140 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70077096f000-700770973000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700770973000-700770974000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770974000-700770977000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770977000-700770978000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770978000-700770979000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770979000-700770981000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770981000-70077098b000 r--s 00039000 fe:00 1943 /system/priv-app/SettingsProvider/SettingsProvider.apk -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 40 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 40 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 40 kB -VmFlags: rd mr me ms -70077098b000-7007709ab000 r--p 00000000 fe:00 1724 /system/lib64/android.hardware.neuralnetworks@1.2.so -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 21 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 21 kB -VmFlags: rd mr mw me -7007709ab000-7007709d1000 r-xp 00020000 fe:00 1724 /system/lib64/android.hardware.neuralnetworks@1.2.so -Size: 152 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007709d1000-7007709d2000 rw-p 00046000 fe:00 1724 /system/lib64/android.hardware.neuralnetworks@1.2.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007709d2000-7007709d8000 r--p 00047000 fe:00 1724 /system/lib64/android.hardware.neuralnetworks@1.2.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007709d8000-7007709da000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007709da000-7007709db000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007709db000-7007709de000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007709de000-7007709df000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007709df000-7007709e0000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007709e0000-7007709e8000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007709e8000-700770a08000 r--s 00000000 00:13 6735 /dev/__properties__/u:object_r:serialno_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr me ms -700770a08000-700770a15000 r--p 00000000 fe:00 1214 /system/lib64/android.hardware.neuralnetworks@1.1.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 17 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 17 kB -VmFlags: rd mr mw me -700770a15000-700770a23000 r-xp 0000d000 fe:00 1214 /system/lib64/android.hardware.neuralnetworks@1.1.so -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770a23000-700770a24000 rw-p 0001b000 fe:00 1214 /system/lib64/android.hardware.neuralnetworks@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770a24000-700770a26000 r--p 0001c000 fe:00 1214 /system/lib64/android.hardware.neuralnetworks@1.1.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770a26000-700770a2a000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700770a2a000-700770a2b000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770a2b000-700770a2e000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770a2e000-700770a2f000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770a2f000-700770a30000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770a30000-700770a38000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770a38000-700770a39000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770a39000-700770a3c000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770a3c000-700770a3d000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770a3d000-700770a3e000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770a3e000-700770a46000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770a46000-700770a66000 r--s 00000000 00:13 6726 /dev/__properties__/u:object_r:overlay_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr me ms -700770a66000-700770a80000 r--p 00000000 fe:00 1136 /system/lib64/android.hardware.neuralnetworks@1.0.so -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 21 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 21 kB -VmFlags: rd mr mw me -700770a80000-700770aa1000 r-xp 0001a000 fe:00 1136 /system/lib64/android.hardware.neuralnetworks@1.0.so -Size: 132 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770aa1000-700770aa2000 rw-p 0003b000 fe:00 1136 /system/lib64/android.hardware.neuralnetworks@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770aa2000-700770aa7000 r--p 0003c000 fe:00 1136 /system/lib64/android.hardware.neuralnetworks@1.0.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 20 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -700770aa7000-700770aa9000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770aa9000-700770aaa000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770aaa000-700770ab2000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770ab2000-700770ab3000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770ab3000-700770abb000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770abb000-700770abc000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770abc000-700770ac4000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770ac4000-700770ac6000 r--p 00000000 fe:00 1183 /system/lib64/libtextclassifier_hash.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -700770ac6000-700770aca000 r-xp 00002000 fe:00 1183 /system/lib64/libtextclassifier_hash.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770aca000-700770acb000 rw-p 00006000 fe:00 1183 /system/lib64/libtextclassifier_hash.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770acb000-700770acc000 r--p 00007000 fe:00 1183 /system/lib64/libtextclassifier_hash.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770acd000-700770b1f000 r--s 00000000 fe:00 211 /system/fonts/Roboto-BoldItalic.ttf -Size: 328 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700770b1f000-700770b20000 r--p 00000000 fe:00 1767 /system/lib64/libjnigraphics.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -700770b20000-700770b21000 r-xp 00001000 fe:00 1767 /system/lib64/libjnigraphics.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770b21000-700770b22000 rw-p 00002000 fe:00 1767 /system/lib64/libjnigraphics.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770b22000-700770b23000 r--p 00003000 fe:00 1767 /system/lib64/libjnigraphics.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770b24000-700770b26000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770b26000-700770b27000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770b27000-700770b2a000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770b2a000-700770b2b000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770b2b000-700770b4b000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 44 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 44 kB -Referenced: 44 kB -Anonymous: 44 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 44 kB -VmFlags: rd wr mr mw me ac -700770b4b000-700770b4c000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770b4c000-700770b54000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770b54000-700770b67000 r--p 00000000 fe:00 1691 /system/lib64/libGLESv3.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 19 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 19 kB -VmFlags: rd mr mw me -700770b67000-700770b6e000 r-xp 00013000 fe:00 1691 /system/lib64/libGLESv3.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770b6e000-700770b6f000 rw-p 0001a000 fe:00 1691 /system/lib64/libGLESv3.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770b6f000-700770b70000 r--p 0001b000 fe:00 1691 /system/lib64/libGLESv3.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770b71000-700770b72000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700770b72000-700770b76000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770b76000-700770b77000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770b77000-700770b79000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -700770b79000-700770b7b000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770b7b000-700770b7c000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770b7c000-700770b7f000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770b7f000-700770b80000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770b80000-700770baa000 r--p 00000000 fe:00 1605 /system/lib64/android.hardware.drm@1.0.so -Size: 168 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 16 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700770baa000-700770bf8000 r-xp 0002a000 fe:00 1605 /system/lib64/android.hardware.drm@1.0.so -Size: 312 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770bf8000-700770bf9000 rw-p 00078000 fe:00 1605 /system/lib64/android.hardware.drm@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770bf9000-700770c00000 r--p 00079000 fe:00 1605 /system/lib64/android.hardware.drm@1.0.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 28 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -700770c00000-700770c01000 rw-s 00000000 00:05 19682 /dev/ashmem/GFXStats-2254 (deleted) -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd wr sh mr mw me ms -700770c01000-700770c02000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770c02000-700770c05000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c05000-700770c06000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770c06000-700770c15000 r--p 00000000 fe:00 1658 /system/lib64/libcamera2ndk.so -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 19 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 19 kB -VmFlags: rd mr mw me -700770c15000-700770c28000 r-xp 0000f000 fe:00 1658 /system/lib64/libcamera2ndk.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770c28000-700770c29000 rw-p 00022000 fe:00 1658 /system/lib64/libcamera2ndk.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c29000-700770c2b000 r--p 00023000 fe:00 1658 /system/lib64/libcamera2ndk.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770c2b000-700770c2c000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c2c000-700770c2d000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700770c2d000-700770c2f000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770c2f000-700770c30000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770c30000-700770c33000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c33000-700770c35000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770c35000-700770c38000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c38000-700770c39000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770c39000-700770c3a000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770c3a000-700770c42000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c42000-700770c43000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770c43000-700770c46000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c46000-700770c47000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770c47000-700770c48000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770c48000-700770c50000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c50000-700770c51000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770c51000-700770c54000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c54000-700770c55000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770c55000-700770c67000 r--p 00000000 fe:00 1269 /system/lib64/libmediadrmmetrics_lite.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 16 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700770c67000-700770c79000 r-xp 00012000 fe:00 1269 /system/lib64/libmediadrmmetrics_lite.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770c79000-700770c7a000 rw-p 00024000 fe:00 1269 /system/lib64/libmediadrmmetrics_lite.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c7a000-700770c7c000 r--p 00025000 fe:00 1269 /system/lib64/libmediadrmmetrics_lite.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770c7c000-700770c7d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c7d000-700770c7f000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770c7f000-700770c80000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770c80000-700770c88000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770c88000-700770c9c000 r--p 00000000 fe:00 1173 /system/lib64/libexif.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 15 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 15 kB -VmFlags: rd mr mw me -700770c9c000-700770cac000 r-xp 00014000 fe:00 1173 /system/lib64/libexif.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770cac000-700770cad000 rw-p 00024000 fe:00 1173 /system/lib64/libexif.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770cad000-700770cc0000 r--p 00025000 fe:00 1173 /system/lib64/libexif.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 76 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 76 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 76 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700770cc0000-700770cc2000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770cc2000-700770cd8000 r--p 00000000 fe:00 1584 /system/lib64/libmtp.so -Size: 88 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 16 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700770cd8000-700770cf0000 r-xp 00016000 fe:00 1584 /system/lib64/libmtp.so -Size: 96 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 88 kB -Pss: 58 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 28 kB -Private_Dirty: 0 kB -Referenced: 88 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 58 kB -VmFlags: rd ex mr mw me -700770cf0000-700770cf1000 rw-p 0002e000 fe:00 1584 /system/lib64/libmtp.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770cf1000-700770cf4000 r--p 0002f000 fe:00 1584 /system/lib64/libmtp.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770cf4000-700770cf5000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770cf5000-700770cf9000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770cf9000-700770cfa000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770cfa000-700770cfd000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770cfd000-700770cfe000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770cfe000-700770cff000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770cff000-700770d07000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770d07000-700770d08000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770d08000-700770d10000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770d10000-700770d11000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700770d11000-700770d13000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770d13000-700770d14000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770d14000-700770d17000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770d17000-700770d18000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770d18000-700770d38000 r--s 00000000 00:13 6730 /dev/__properties__/u:object_r:pm_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr me ms -700770d38000-700770d39000 r--p 00000000 fe:00 1731 /system/lib64/libasyncio.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -700770d39000-700770d3a000 r-xp 00001000 fe:00 1731 /system/lib64/libasyncio.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770d3a000-700770d3b000 rw-p 00002000 fe:00 1731 /system/lib64/libasyncio.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770d3b000-700770d3c000 r--p 00003000 fe:00 1731 /system/lib64/libasyncio.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770d3d000-700770d3f000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770d3f000-700770d40000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770d40000-700770d43000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770d43000-700770d44000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770d44000-700770d77000 r--p 00000000 fe:00 1573 /system/lib64/libmedia_jni.so -Size: 204 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 15 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 15 kB -VmFlags: rd mr mw me -700770d77000-700770dae000 r-xp 00033000 fe:00 1573 /system/lib64/libmedia_jni.so -Size: 220 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770dae000-700770daf000 rw-p 0006a000 fe:00 1573 /system/lib64/libmedia_jni.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770daf000-700770db5000 r--p 0006b000 fe:00 1573 /system/lib64/libmedia_jni.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -700770db5000-700770db6000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770db6000-700770db7000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770db7000-700770dbf000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770dbf000-700770dc0000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770dc0000-700770dc3000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770dc3000-700770dc4000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770dc4000-700770dc5000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770dc5000-700770dcd000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770dcd000-700770dce000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770dce000-700770dd1000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770dd1000-700770dd2000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770dd2000-700770dd3000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770dd3000-700770ddb000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770ddb000-700770ddc000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770ddc000-700770de4000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770de4000-700770ded000 r--p 00000000 fe:00 1558 /system/lib64/libmidi.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 9 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -700770ded000-700770df7000 r-xp 00009000 fe:00 1558 /system/lib64/libmidi.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770df7000-700770df8000 rw-p 00013000 fe:00 1558 /system/lib64/libmidi.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770df8000-700770dfa000 r--p 00014000 fe:00 1558 /system/lib64/libmidi.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770dfa000-700770dfb000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770dfb000-700770dfc000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770dfc000-700770dff000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770dff000-700770e00000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770e00000-700770e1a000 r--p 00000000 fe:00 1744 /system/lib64/libmediadrm.so -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 16 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700770e1a000-700770e32000 r-xp 0001a000 fe:00 1744 /system/lib64/libmediadrm.so -Size: 96 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770e32000-700770e33000 rw-p 00032000 fe:00 1744 /system/lib64/libmediadrm.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770e33000-700770e3a000 r--p 00033000 fe:00 1744 /system/lib64/libmediadrm.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 28 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -700770e3a000-700770e3b000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770e3b000-700770e3c000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770e3c000-700770e3f000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770e3f000-700770e40000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770e40000-700770e41000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770e41000-700770e49000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770e49000-700770e59000 r--p 00000000 fe:00 1239 /system/lib64/libmediandk.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 14 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 14 kB -VmFlags: rd mr mw me -700770e59000-700770e66000 r-xp 00010000 fe:00 1239 /system/lib64/libmediandk.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 26 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 26 kB -VmFlags: rd ex mr mw me -700770e66000-700770e67000 rw-p 0001d000 fe:00 1239 /system/lib64/libmediandk.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770e67000-700770e69000 r--p 0001e000 fe:00 1239 /system/lib64/libmediandk.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770e69000-700770e6a000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770e6a000-700770e6e000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700770e6e000-700770e6f000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770e6f000-700770e77000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770e77000-700770e97000 r--s 00000000 00:13 6713 /dev/__properties__/u:object_r:hwservicemanager_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700770e97000-700770eb7000 r--p 00000000 fe:00 1647 /system/lib64/android.hardware.drm@1.1.so -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 16 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -700770eb7000-700770ee3000 r-xp 00020000 fe:00 1647 /system/lib64/android.hardware.drm@1.1.so -Size: 176 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770ee3000-700770ee4000 rw-p 0004c000 fe:00 1647 /system/lib64/android.hardware.drm@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770ee4000-700770eea000 r--p 0004d000 fe:00 1647 /system/lib64/android.hardware.drm@1.1.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -700770eea000-700770eeb000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700770eeb000-700770eed000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770eed000-700770eee000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770eee000-700770ef1000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770ef1000-700770ef2000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770ef2000-700770ef3000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770ef3000-700770efb000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770efb000-700770f1b000 r--s 00000000 00:13 6745 /dev/__properties__/u:object_r:vendor_default_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700770f1b000-700770f22000 r--p 00000000 fe:00 1701 /system/lib64/libbinder_ndk.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 9 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -700770f22000-700770f28000 r-xp 00007000 fe:00 1701 /system/lib64/libbinder_ndk.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770f28000-700770f29000 rw-p 0000d000 fe:00 1701 /system/lib64/libbinder_ndk.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770f29000-700770f2a000 r--p 0000e000 fe:00 1701 /system/lib64/libbinder_ndk.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770f2a000-700770f2b000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770f2b000-700770f2c000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770f2c000-700770f2f000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770f2f000-700770f31000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770f31000-700770f34000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770f34000-700770f35000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770f35000-700770f36000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770f36000-700770f3e000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770f3e000-700770f3f000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770f3f000-700770f47000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770f47000-700770f62000 r--p 00000000 fe:00 1703 /system/lib64/libaaudio.so -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 21 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 21 kB -VmFlags: rd mr mw me -700770f62000-700770f74000 r-xp 0001b000 fe:00 1703 /system/lib64/libaaudio.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770f74000-700770f75000 rw-p 0002d000 fe:00 1703 /system/lib64/libaaudio.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770f75000-700770f7a000 r--p 0002e000 fe:00 1703 /system/lib64/libaaudio.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 20 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -700770f7a000-700770f7b000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770f7b000-700770f7c000 rw-s 00000000 00:05 11676 /dev/ashmem/GFXStats-1674 (deleted) -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd wr sh mr mw me ms -700770f7c000-700770fa0000 r--s 00000000 fe:00 985 /system/usr/hyphen-data/hyph-nn.hyb -Size: 144 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700770fa0000-700770faf000 r--p 00000000 fe:00 1602 /system/lib64/libandroid.so -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 15 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 15 kB -VmFlags: rd mr mw me -700770faf000-700770fb8000 r-xp 0000f000 fe:00 1602 /system/lib64/libandroid.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700770fb8000-700770fb9000 rw-p 00018000 fe:00 1602 /system/lib64/libandroid.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770fb9000-700770fbb000 r--p 00019000 fe:00 1602 /system/lib64/libandroid.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770fbb000-700770fbc000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770fbc000-700770fc0000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700770fc0000-700770fc1000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700770fc1000-700770fc9000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770fc9000-700770fce000 r--p 00000000 fe:00 1736 /system/lib64/libadbconnection.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -700770fce000-700770fd6000 r-xp 00005000 fe:00 1736 /system/lib64/libadbconnection.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 1 kB -Shared_Clean: 32 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 32 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd ex mr mw me -700770fd6000-700770fd7000 rw-p 0000d000 fe:00 1736 /system/lib64/libadbconnection.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770fd7000-700770fd8000 r--p 0000e000 fe:00 1736 /system/lib64/libadbconnection.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700770fd8000-700770fd9000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770fd9000-700770fda000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770fda000-700770fdd000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700770fdd000-700770fde000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700770fde000-70077102f000 r--s 00000000 fe:00 231 /system/fonts/Roboto-BlackItalic.ttf -Size: 324 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -70077102f000-7007711bf000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 1600 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 24 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr mr mw me ac -7007711bf000-7007712bf000 rw-p 00000000 00:00 0 [anon:dalvik-non-moving-space inter region ref bitmap] -Name: [anon:dalvik-non-moving-space inter region ref bitmap] -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007712bf000-7007722bf000 rw-p 00000000 00:00 0 [anon:dalvik-region-space inter region ref bitmap] -Name: [anon:dalvik-region-space inter region ref bitmap] -Size: 16384 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007722bf000-7007724bf000 rw-p 00000000 00:00 0 [anon:dalvik-rb copying gc mark stack] -Name: [anon:dalvik-rb copying gc mark stack] -Size: 2048 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007724bf000-700772cbf000 rw-p 00000000 00:00 0 [anon:dalvik-concurrent copying gc mark stack] -Name: [anon:dalvik-concurrent copying gc mark stack] -Size: 8192 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700772cbf000-700772ebf000 rw-p 00000000 00:00 0 [anon:dalvik-rb copying gc mark stack] -Name: [anon:dalvik-rb copying gc mark stack] -Size: 2048 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700772ebf000-7007736bf000 rw-p 00000000 00:00 0 [anon:dalvik-concurrent copying gc mark stack] -Name: [anon:dalvik-concurrent copying gc mark stack] -Size: 8192 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007736bf000-700773ec0000 rw-p 00000000 00:00 0 [anon:dalvik-live stack] -Name: [anon:dalvik-live stack] -Size: 8196 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700773ec0000-7007746c1000 rw-p 00000000 00:00 0 [anon:dalvik-allocation stack] -Name: [anon:dalvik-allocation stack] -Size: 8196 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007746c1000-700774ac2000 rw-p 00000000 00:00 0 [anon:dalvik-card table] -Name: [anon:dalvik-card table] -Size: 4100 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 56 kB -Pss: 56 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 56 kB -Referenced: 56 kB -Anonymous: 56 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 56 kB -VmFlags: rd wr mr mw me ac -700774ac2000-700775ac2000 rw-p 00000000 00:00 0 [anon:dalvik-region space live bitmap] -Name: [anon:dalvik-region space live bitmap] -Size: 16384 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 84 kB -Pss: 84 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 84 kB -Referenced: 84 kB -Anonymous: 84 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 84 kB -VmFlags: rd wr mr mw me ac -700775ac2000-700775bc2000 rw-p 00000000 00:00 0 [anon:dalvik-allocspace zygote / non moving space mark-bitmap 0] -Name: [anon:dalvik-allocspace zygote / non moving space mark-bitmap 0] -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700775bc2000-700775cc2000 rw-p 00000000 00:00 0 [anon:dalvik-allocspace zygote / non moving space live-bitmap 0] -Name: [anon:dalvik-allocspace zygote / non moving space live-bitmap 0] -Size: 1024 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd wr mr mw me ac -700775cc2000-700775cc4000 r--p 00000000 fe:00 1730 /system/lib64/libsigchain.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -700775cc4000-700775cc6000 r-xp 00002000 fe:00 1730 /system/lib64/libsigchain.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700775cc6000-700775cc7000 rw-p 00004000 fe:00 1730 /system/lib64/libsigchain.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700775cc7000-700775cc8000 r--p 00005000 fe:00 1730 /system/lib64/libsigchain.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700775cc8000-700775ccc000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700775ccc000-700775ccd000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700775ccd000-700775cd5000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700775cd5000-700775d26000 r--s 00000000 fe:00 219 /system/fonts/Roboto-MediumItalic.ttf -Size: 324 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700775d26000-700775d27000 r--p 00000000 fe:00 1509 /system/lib64/libstatssocket.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -700775d27000-700775d28000 r-xp 00001000 fe:00 1509 /system/lib64/libstatssocket.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700775d28000-700775d29000 rw-p 00002000 fe:00 1509 /system/lib64/libstatssocket.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700775d29000-700775d2a000 r--p 00003000 fe:00 1509 /system/lib64/libstatssocket.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700775d2a000-700775d2b000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700775d2b000-700775d2f000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700775d2f000-700775d7a000 r--s 00000000 fe:00 275 /system/fonts/Roboto-Bold.ttf -Size: 300 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700775d7a000-700775ece000 r--p 00000000 fe:00 1156 /system/lib64/libart.so -Size: 1360 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 384 kB -Pss: 39 kB -Shared_Clean: 384 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 384 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 39 kB -VmFlags: rd mr mw me -700775ece000-7007763e6000 r-xp 00154000 fe:00 1156 /system/lib64/libart.so -Size: 5216 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4276 kB -Pss: 288 kB -Shared_Clean: 4272 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4276 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 288 kB -VmFlags: rd ex mr mw me -7007763e6000-7007763e9000 rw-p 0066c000 fe:00 1156 /system/lib64/libart.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 8 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007763e9000-7007763f9000 r--p 0066f000 fe:00 1156 /system/lib64/libart.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 3 kB -Shared_Clean: 0 kB -Shared_Dirty: 64 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 56 kB -Anonymous: 64 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me ac -7007763f9000-7007763fc000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 6 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd wr mr mw me ac -7007763fc000-700776400000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700776400000-700776800000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 4096 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4080 kB -Pss: 3230 kB -Shared_Clean: 0 kB -Shared_Dirty: 900 kB -Private_Clean: 0 kB -Private_Dirty: 3180 kB -Referenced: 3992 kB -Anonymous: 4080 kB -AnonHugePages: 2048 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3230 kB -VmFlags: rd wr mr mw me ac -700776800000-700776804000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -700776804000-700776805000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -700776805000-700776807000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700776807000-700776808000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -700776808000-700776810000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700776810000-700776861000 r--s 00000000 fe:00 195 /system/fonts/Roboto-Italic.ttf -Size: 324 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700776861000-700776862000 r--p 00000000 fe:00 1199 /system/lib64/libmetricslogger.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -700776862000-700776863000 r-xp 00001000 fe:00 1199 /system/lib64/libmetricslogger.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700776863000-700776864000 rw-p 00002000 fe:00 1199 /system/lib64/libmetricslogger.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700776864000-700776865000 r--p 00003000 fe:00 1199 /system/lib64/libmetricslogger.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700776865000-700776866000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700776866000-700776867000 r--s 00009000 fe:00 2036 /system/priv-app/FusedLocation/FusedLocation.apk -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr me ms -700776867000-700776868000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700776868000-70077686b000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -70077686b000-70077686c000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70077686c000-700776890000 r--s 00000000 fe:00 1019 /system/usr/hyphen-data/hyph-nb.hyb -Size: 144 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -700776890000-700776892000 r--p 00000000 fe:00 1606 /system/lib64/libtombstoned_client.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 2 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -700776892000-700776895000 r-xp 00002000 fe:00 1606 /system/lib64/libtombstoned_client.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -700776895000-700776896000 rw-p 00005000 fe:00 1606 /system/lib64/libtombstoned_client.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700776896000-700776897000 r--p 00006000 fe:00 1606 /system/lib64/libtombstoned_client.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -700776897000-700776899000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -700776899000-70077689a000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70077689a000-70077689d000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -70077689d000-70077689f000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -70077689f000-7007768a2000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007768a2000-7007768a3000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007768a3000-7007768c1000 r--s 00000000 fe:00 971 /system/usr/hyphen-data/hyph-de-ch-1901.hyb -Size: 120 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007768c1000-7007768d2000 r--p 00000000 fe:00 1651 /system/lib64/libprofile.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 3 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007768d2000-7007768f3000 r-xp 00011000 fe:00 1651 /system/lib64/libprofile.so -Size: 132 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007768f3000-7007768f4000 rw-p 00032000 fe:00 1651 /system/lib64/libprofile.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007768f4000-7007768f5000 r--p 00033000 fe:00 1651 /system/lib64/libprofile.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007768f5000-7007768f6000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007768f6000-7007768f8000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007768f8000-7007768f9000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007768f9000-700776901000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700776901000-700776902000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700776902000-700776905000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -700776905000-700776906000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -700776906000-700776909000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me nr -700776909000-70077690a000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -70077690a000-7007a2575000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 717228 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me nr -7007a2575000-7007a2576000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007a2576000-7007ae940000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 200488 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me nr -7007ae940000-7007ae941000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007ae941000-7007ae942000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007ae942000-7007ae945000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me nr -7007ae945000-7007ae946000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007ae946000-7007b68f5000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 130748 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me nr -7007b68f5000-7007b68f6000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007b68f6000-7007f6906000 r--p 00000000 00:00 0 [anon:cfi shadow] -Name: [anon:cfi shadow] -Size: 1048640 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me nr -7007f6906000-7007f690d000 r--p 00000000 fe:00 1707 /system/lib64/libmediautils.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 4 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007f690d000-7007f6912000 r-xp 00007000 fe:00 1707 /system/lib64/libmediautils.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6912000-7007f6913000 rw-p 0000c000 fe:00 1707 /system/lib64/libmediautils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6913000-7007f6915000 r--p 0000d000 fe:00 1707 /system/lib64/libmediautils.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6915000-7007f6916000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6916000-7007f6917000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6917000-7007f6919000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6919000-7007f691a000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f691a000-7007f6922000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6922000-7007f6940000 r--s 00000000 fe:00 976 /system/usr/hyphen-data/hyph-de-1996.hyb -Size: 120 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6940000-7007f694d000 r--p 00000000 fe:00 1526 /system/lib64/libmedia_helper.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 8 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me -7007f694d000-7007f6955000 r-xp 0000d000 fe:00 1526 /system/lib64/libmedia_helper.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6955000-7007f6956000 rw-p 00015000 fe:00 1526 /system/lib64/libmedia_helper.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6956000-7007f6958000 r--p 00016000 fe:00 1526 /system/lib64/libmedia_helper.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6958000-7007f6959000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6959000-7007f695a000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f695a000-7007f695c000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f695c000-7007f695d000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f695d000-7007f6960000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6960000-7007f6961000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6961000-7007f6963000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6963000-7007f6964000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f6964000-7007f696c000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f696c000-7007f696d000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f696d000-7007f6970000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007f6970000-7007f6971000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6971000-7007f698f000 r--s 00000000 fe:00 991 /system/usr/hyphen-data/hyph-de-1901.hyb -Size: 120 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f698f000-7007f699d000 r--p 00000000 fe:00 1227 /system/lib64/libminikin.so -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 8 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me -7007f699d000-7007f69b5000 r-xp 0000e000 fe:00 1227 /system/lib64/libminikin.so -Size: 96 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 96 kB -Pss: 24 kB -Shared_Clean: 96 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 96 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd ex mr mw me -7007f69b5000-7007f69b6000 rw-p 00026000 fe:00 1227 /system/lib64/libminikin.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f69b6000-7007f69b7000 r--p 00027000 fe:00 1227 /system/lib64/libminikin.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f69b7000-7007f69b8000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f69b8000-7007f69ba000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f69ba000-7007f69c1000 rw-p 00000000 fe:00 944 /system/etc/event-log-tags -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 2 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd wr mr mw me ac -7007f69c1000-7007f69c2000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f69c2000-7007f69ca000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f69ca000-7007f69d4000 r--p 00000000 fe:00 1135 /system/lib64/android.hidl.memory.token@1.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 7 kB -Shared_Clean: 40 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd mr mw me -7007f69d4000-7007f69dd000 r-xp 0000a000 fe:00 1135 /system/lib64/android.hidl.memory.token@1.0.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f69dd000-7007f69de000 rw-p 00013000 fe:00 1135 /system/lib64/android.hidl.memory.token@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f69de000-7007f69e0000 r--p 00014000 fe:00 1135 /system/lib64/android.hidl.memory.token@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f69e0000-7007f69e1000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f69e1000-7007f69e4000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f69e4000-7007f69e6000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f69e6000-7007f69e9000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f69e9000-7007f69ea000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f69ea000-7007f69eb000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f69eb000-7007f69f3000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f69f3000-7007f69f4000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f69f4000-7007f69fc000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f69fc000-7007f6a1c000 r--s 00000000 00:13 6716 /dev/__properties__/u:object_r:log_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6a1c000-7007f6a1d000 r--p 00000000 fe:00 1746 /system/lib64/android.hardware.configstore-utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f6a1d000-7007f6a1e000 r-xp 00001000 fe:00 1746 /system/lib64/android.hardware.configstore-utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd ex mr mw me -7007f6a1e000-7007f6a1f000 rw-p 00002000 fe:00 1746 /system/lib64/android.hardware.configstore-utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6a1f000-7007f6a20000 r--p 00003000 fe:00 1746 /system/lib64/android.hardware.configstore-utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6a20000-7007f6a21000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6a21000-7007f6a24000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6a24000-7007f6a25000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6a25000-7007f6a45000 rw-p 00000000 00:00 0 [anon:dalvik-CompilerMetadata] -Name: [anon:dalvik-CompilerMetadata] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6a45000-7007f6a56000 r--p 00000000 fe:00 1599 /system/lib64/libvulkan.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 12 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me -7007f6a56000-7007f6a69000 r-xp 00011000 fe:00 1599 /system/lib64/libvulkan.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6a69000-7007f6a6a000 rw-p 00024000 fe:00 1599 /system/lib64/libvulkan.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6a6a000-7007f6a6c000 r--p 00025000 fe:00 1599 /system/lib64/libvulkan.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6a6c000-7007f6a6d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6a6d000-7007f6a8d000 rw-p 00000000 00:00 0 [anon:dalvik-CompilerMetadata] -Name: [anon:dalvik-CompilerMetadata] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6a8d000-7007f6ab4000 r--p 00000000 fe:00 1727 /system/lib64/libandroidicu.so -Size: 156 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 16 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd mr mw me -7007f6ab4000-7007f6abc000 r-xp 00027000 fe:00 1727 /system/lib64/libandroidicu.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6abc000-7007f6abd000 rw-p 0002f000 fe:00 1727 /system/lib64/libandroidicu.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6abd000-7007f6abf000 r--p 00030000 fe:00 1727 /system/lib64/libandroidicu.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6abf000-7007f6ac3000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6ac3000-7007f6ac4000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f6ac4000-7007f6acc000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6acc000-7007f6acd000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6acd000-7007f6ad0000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6ad0000-7007f6ad1000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6ad1000-7007f6ad2000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f6ad2000-7007f6ada000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6ada000-7007f6ae9000 r--p 00000000 fe:00 1717 /system/lib64/android.hardware.configstore@1.1.so -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 5 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -7007f6ae9000-7007f6af7000 r-xp 0000f000 fe:00 1717 /system/lib64/android.hardware.configstore@1.1.so -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6af7000-7007f6af8000 rw-p 0001d000 fe:00 1717 /system/lib64/android.hardware.configstore@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6af8000-7007f6afb000 r--p 0001e000 fe:00 1717 /system/lib64/android.hardware.configstore@1.1.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6afb000-7007f6afc000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f6afc000-7007f6afe000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6afe000-7007f6aff000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6aff000-7007f6b02000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6b02000-7007f6b04000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6b04000-7007f6b07000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6b07000-7007f6b08000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6b08000-7007f6b09000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f6b09000-7007f6b11000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6b11000-7007f6b62000 r--p 00000000 fe:00 1580 /system/lib64/libbinder.so -Size: 324 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 252 kB -Pss: 9 kB -Shared_Clean: 252 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 252 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007f6b62000-7007f6ba1000 r-xp 00051000 fe:00 1580 /system/lib64/libbinder.so -Size: 252 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 248 kB -Pss: 6 kB -Shared_Clean: 248 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 248 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd ex mr mw me -7007f6ba1000-7007f6ba2000 rw-p 00090000 fe:00 1580 /system/lib64/libbinder.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6ba2000-7007f6bb1000 r--p 00091000 fe:00 1580 /system/lib64/libbinder.so -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 3 kB -Shared_Clean: 0 kB -Shared_Dirty: 60 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 60 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me ac -7007f6bb1000-7007f6bb2000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6bb2000-7007f6bb3000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6bb3000-7007f6bb6000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6bb6000-7007f6bb7000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6bb7000-7007f6bb8000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f6bb8000-7007f6bc0000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6bc0000-7007f6bc1000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f6bc1000-7007f6bc9000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6bc9000-7007f6bdf000 r--p 00000000 fe:00 1694 /system/lib64/libinput.so -Size: 88 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 88 kB -Pss: 20 kB -Shared_Clean: 88 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 88 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd mr mw me -7007f6bdf000-7007f6bf3000 r-xp 00016000 fe:00 1694 /system/lib64/libinput.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 72 kB -Pss: 18 kB -Shared_Clean: 72 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 72 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 18 kB -VmFlags: rd ex mr mw me -7007f6bf3000-7007f6bf4000 rw-p 0002a000 fe:00 1694 /system/lib64/libinput.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6bf4000-7007f6bfb000 r--p 0002b000 fe:00 1694 /system/lib64/libinput.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 28 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007f6bfb000-7007f6bfc000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6bfc000-7007f6bfd000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007f6bfd000-7007f6c05000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6c05000-7007f6c0e000 r--s 00000000 fe:00 972 /system/usr/hyphen-data/hyph-ga.hyb -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6c0e000-7007f6c1a000 r--p 00000000 fe:00 1613 /system/lib64/android.hardware.graphics.mapper@2.0.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 4 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007f6c1a000-7007f6c26000 r-xp 0000c000 fe:00 1613 /system/lib64/android.hardware.graphics.mapper@2.0.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 6 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd ex mr mw me -7007f6c26000-7007f6c27000 rw-p 00018000 fe:00 1613 /system/lib64/android.hardware.graphics.mapper@2.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6c27000-7007f6c29000 r--p 00019000 fe:00 1613 /system/lib64/android.hardware.graphics.mapper@2.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6c29000-7007f6c2b000 r--p 0007b000 fe:00 3288 /system/framework/oat/x86_64/services.art -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 8 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me -7007f6c2b000-7007f6c3a000 r--s 00000000 fe:00 984 /system/usr/hyphen-data/hyph-en-us.hyb -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 30 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 30 kB -VmFlags: rd mr me ms -7007f6c3a000-7007f6c46000 r--s 00000000 fe:00 1020 /system/usr/hyphen-data/hyph-en-gb.hyb -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6c46000-7007f6c5b000 r--p 00000000 fe:00 1210 /system/lib64/libstagefright_foundation.so -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 10 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007f6c5b000-7007f6c7a000 r-xp 00015000 fe:00 1210 /system/lib64/libstagefright_foundation.so -Size: 124 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 124 kB -Pss: 27 kB -Shared_Clean: 124 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 124 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 27 kB -VmFlags: rd ex mr mw me -7007f6c7a000-7007f6c7b000 rw-p 00034000 fe:00 1210 /system/lib64/libstagefright_foundation.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6c7b000-7007f6c7d000 r--p 00035000 fe:00 1210 /system/lib64/libstagefright_foundation.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6c7d000-7007f6c7e000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6c7e000-7007f6c7f000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f6c7f000-7007f6c81000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6c81000-7007f6ca1000 rw-p 00000000 00:00 0 [anon:dalvik-CompilerMetadata] -Name: [anon:dalvik-CompilerMetadata] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6ca1000-7007f6ca3000 r--p 00000000 fe:00 1711 /system/lib64/libhardware_legacy.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 1 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007f6ca3000-7007f6ca5000 r-xp 00002000 fe:00 1711 /system/lib64/libhardware_legacy.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 8 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd ex mr mw me -7007f6ca5000-7007f6ca6000 rw-p 00004000 fe:00 1711 /system/lib64/libhardware_legacy.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6ca6000-7007f6ca7000 r--p 00005000 fe:00 1711 /system/lib64/libhardware_legacy.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6ca7000-7007f6ca8000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6ca8000-7007f6ca9000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6ca9000-7007f6cac000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6cac000-7007f6cad000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007f6cad000-7007f6cba000 r--s 00000000 fe:00 1022 /system/usr/hyphen-data/hyph-cu.hyb -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6cba000-7007f6cda000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 128 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 128 kB -Referenced: 128 kB -Anonymous: 128 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 128 kB -VmFlags: rd wr mr mw me ac -7007f6cda000-7007f6cdf000 r--p 00000000 fe:00 1678 /system/lib64/libappfuse.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 5 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -7007f6cdf000-7007f6ce6000 r-xp 00005000 fe:00 1678 /system/lib64/libappfuse.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6ce6000-7007f6ce7000 rw-p 0000c000 fe:00 1678 /system/lib64/libappfuse.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6ce7000-7007f6ce8000 r--p 0000d000 fe:00 1678 /system/lib64/libappfuse.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6ce8000-7007f6cea000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6cea000-7007f6cf3000 r--s 00000000 fe:00 1000 /system/usr/hyphen-data/hyph-cy.hyb -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6cf3000-7007f6d0c000 r--s 00000000 fe:00 162 /system/fonts/NotoSansBhaiksuki-Regular.otf -Size: 100 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6d0c000-7007f6d18000 r--p 00000000 fe:00 1607 /system/lib64/android.hardware.cas.native@1.0.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 9 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007f6d18000-7007f6d23000 r-xp 0000c000 fe:00 1607 /system/lib64/android.hardware.cas.native@1.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6d23000-7007f6d24000 rw-p 00017000 fe:00 1607 /system/lib64/android.hardware.cas.native@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6d24000-7007f6d26000 r--p 00018000 fe:00 1607 /system/lib64/android.hardware.cas.native@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6d26000-7007f6d2c000 r--s 00000000 fe:00 1025 /system/usr/hyphen-data/hyph-et.hyb -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6d2c000-7007f6d3d000 r--s 00000000 fe:00 274 /system/fonts/NotoSansNewa-Regular.otf -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6d3d000-7007f6d5e000 r--s 00000000 fe:00 142 /system/fonts/NotoSansAnatolianHieroglyphs-Regular.otf -Size: 132 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6d5e000-7007f6d60000 r--p 00000000 fe:00 1650 /system/lib64/libstagefright_omx_utils.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 1 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007f6d60000-7007f6d62000 r-xp 00002000 fe:00 1650 /system/lib64/libstagefright_omx_utils.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 4 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd ex mr mw me -7007f6d62000-7007f6d63000 rw-p 00004000 fe:00 1650 /system/lib64/libstagefright_omx_utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6d63000-7007f6d64000 r--p 00005000 fe:00 1650 /system/lib64/libstagefright_omx_utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6d64000-7007f6d65000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6d65000-7007f6d67000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6d67000-7007f6db2000 r--s 00000000 fe:00 144 /system/fonts/Roboto-Black.ttf -Size: 300 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6db2000-7007f6db5000 r--p 00000000 fe:00 1142 /system/lib64/libhidlmemory.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 2 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -7007f6db5000-7007f6db7000 r-xp 00003000 fe:00 1142 /system/lib64/libhidlmemory.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 2 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd ex mr mw me -7007f6db7000-7007f6db8000 rw-p 00005000 fe:00 1142 /system/lib64/libhidlmemory.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6db8000-7007f6db9000 r--p 00006000 fe:00 1142 /system/lib64/libhidlmemory.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6db9000-7007f6dba000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6dba000-7007f6dca000 r--s 00000000 fe:00 119 /system/fonts/NotoSansMarchen-Regular.otf -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6dca000-7007f6dcc000 r--p 00000000 fe:00 1469 /system/lib64/libprocessgroup.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f6dcc000-7007f6dcf000 r-xp 00002000 fe:00 1469 /system/lib64/libprocessgroup.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6dcf000-7007f6dd0000 rw-p 00005000 fe:00 1469 /system/lib64/libprocessgroup.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6dd0000-7007f6dd1000 r--p 00006000 fe:00 1469 /system/lib64/libprocessgroup.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6dd1000-7007f6dd2000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6dd2000-7007f6dd3000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f6dd3000-7007f6dd7000 r--s 00000000 fe:00 1008 /system/usr/hyphen-data/hyph-es.hyb -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6dd7000-7007f6dde000 r--s 00000000 fe:00 132 /system/fonts/NotoSansSharada-Regular.otf -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6dde000-7007f6de7000 r--s 00000000 fe:00 157 /system/fonts/NotoSansLinearA-Regular.otf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6de7000-7007f6e03000 r--s 00000000 fe:00 139 /system/fonts/NotoSansMongolian-Regular.ttf -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6e03000-7007f6e15000 r--p 00000000 fe:00 1511 /system/lib64/libpdx_default_transport.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 9 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007f6e15000-7007f6e29000 r-xp 00012000 fe:00 1511 /system/lib64/libpdx_default_transport.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6e29000-7007f6e2a000 rw-p 00026000 fe:00 1511 /system/lib64/libpdx_default_transport.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6e2a000-7007f6e2b000 r--p 00027000 fe:00 1511 /system/lib64/libpdx_default_transport.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6e2b000-7007f6e2c000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6e2c000-7007f6e2d000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f6e2d000-7007f6e2f000 r--s 00000000 fe:00 964 /system/usr/hyphen-data/hyph-sl.hyb -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6e2f000-7007f6e4e000 r--s 00000000 fe:00 289 /system/fonts/NotoSansYi-Regular.ttf -Size: 124 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6e4e000-7007f6e60000 r--p 00000000 fe:00 1545 /system/lib64/libEGL.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 72 kB -Pss: 8 kB -Shared_Clean: 72 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 72 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me -7007f6e60000-7007f6e73000 r-xp 00012000 fe:00 1545 /system/lib64/libEGL.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 76 kB -Pss: 3 kB -Shared_Clean: 76 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 76 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd ex mr mw me -7007f6e73000-7007f6e74000 rw-p 00025000 fe:00 1545 /system/lib64/libEGL.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6e74000-7007f6e78000 r--p 00026000 fe:00 1545 /system/lib64/libEGL.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6e78000-7007f6e80000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 20 kB -Anonymous: 32 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me ac -7007f6e80000-7007f6e82000 r--s 00000000 fe:00 983 /system/usr/hyphen-data/hyph-mn-cyrl.hyb -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6e82000-7007f6e91000 r--p 00000000 fe:00 1200 /system/lib64/libutils.so -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 1 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007f6e91000-7007f6e9d000 r-xp 0000f000 fe:00 1200 /system/lib64/libutils.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 1 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd ex mr mw me -7007f6e9d000-7007f6e9e000 rw-p 0001b000 fe:00 1200 /system/lib64/libutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6e9e000-7007f6e9f000 r--p 0001c000 fe:00 1200 /system/lib64/libutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6e9f000-7007f6ea0000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6ea1000-7007f6eb1000 r--s 00000000 fe:00 220 /system/fonts/NotoSansVai-Regular.ttf -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6eb1000-7007f6eca000 r--s 00000000 fe:00 154 /system/fonts/NotoSansLepcha-Regular.ttf -Size: 100 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6eca000-7007f6ecb000 r--p 00000000 fe:00 1636 /system/lib64/android.hardware.graphics.common@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f6ecb000-7007f6ecc000 r-xp 00001000 fe:00 1636 /system/lib64/android.hardware.graphics.common@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6ecc000-7007f6ecd000 rw-p 00002000 fe:00 1636 /system/lib64/android.hardware.graphics.common@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6ecd000-7007f6ece000 r--p 00003000 fe:00 1636 /system/lib64/android.hardware.graphics.common@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6ece000-7007f6ed0000 r--s 00000000 fe:00 986 /system/usr/hyphen-data/hyph-fr.hyb -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6ed0000-7007f6edc000 r--s 00000000 fe:00 156 /system/fonts/NotoSansTaiTham-Regular.ttf -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6edc000-7007f6efd000 r--s 00000000 fe:00 147 /system/fonts/NotoSansBamum-Regular.ttf -Size: 132 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6efd000-7007f6f17000 r--s 00000000 fe:00 105 /system/fonts/NotoSansMyanmarUI-Bold.ttf -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6f17000-7007f6f54000 r--p 00000000 fe:00 1563 /system/lib64/libjpeg.so -Size: 244 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 15 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 15 kB -VmFlags: rd mr mw me -7007f6f54000-7007f6fa6000 r-xp 0003d000 fe:00 1563 /system/lib64/libjpeg.so -Size: 328 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6fa6000-7007f6fa7000 rw-p 0008f000 fe:00 1563 /system/lib64/libjpeg.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6fa7000-7007f6fa8000 r--p 00090000 fe:00 1563 /system/lib64/libjpeg.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6fa8000-7007f6fa9000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6fa9000-7007f6faa000 r-xp 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd ex mr mw me ac -7007f6faa000-7007f6ff5000 r--s 00000000 fe:00 121 /system/fonts/Roboto-Medium.ttf -Size: 300 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 148 kB -Pss: 47 kB -Shared_Clean: 148 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 148 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 47 kB -VmFlags: rd mr me ms -7007f6ff5000-7007f6ff6000 r--p 00000000 fe:00 1623 /system/lib64/libvndksupport.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f6ff6000-7007f6ff7000 r-xp 00001000 fe:00 1623 /system/lib64/libvndksupport.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f6ff7000-7007f6ff8000 rw-p 00002000 fe:00 1623 /system/lib64/libvndksupport.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6ff8000-7007f6ff9000 r--p 00003000 fe:00 1623 /system/lib64/libvndksupport.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f6ff9000-7007f6ffa000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f6ffa000-7007f6ffb000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f6ffb000-7007f6ffd000 r--s 00000000 fe:00 1014 /system/usr/hyphen-data/hyph-da.hyb -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f6ffd000-7007f7001000 r--s 00000000 fe:00 199 /system/fonts/NotoSansPahawhHmong-Regular.otf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7001000-7007f700e000 r--s 00000000 fe:00 159 /system/fonts/NotoSansSyriacWestern-Regular.ttf -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f700e000-7007f7028000 r--s 00000000 fe:00 80 /system/fonts/NotoSansMyanmarUI-Regular.ttf -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7028000-7007f702b000 r--p 00000000 fe:00 1747 /system/lib64/libnetdbpf.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 2 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -7007f702b000-7007f7031000 r-xp 00003000 fe:00 1747 /system/lib64/libnetdbpf.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7031000-7007f7032000 rw-p 00009000 fe:00 1747 /system/lib64/libnetdbpf.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7032000-7007f7033000 r--p 0000a000 fe:00 1747 /system/lib64/libnetdbpf.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7033000-7007f7034000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7034000-7007f7037000 r--s 00000000 fe:00 214 /system/fonts/NotoSansPauCinHau-Regular.otf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7037000-7007f7044000 r--s 00000000 fe:00 194 /system/fonts/NotoSansSyriacEastern-Regular.ttf -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7044000-7007f704b000 r--p 00000000 fe:00 1620 /system/lib64/libmediametrics.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 3 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007f704b000-7007f7051000 r-xp 00007000 fe:00 1620 /system/lib64/libmediametrics.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 4 kB -Shared_Clean: 24 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd ex mr mw me -7007f7051000-7007f7052000 rw-p 0000d000 fe:00 1620 /system/lib64/libmediametrics.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7052000-7007f7054000 r--p 0000e000 fe:00 1620 /system/lib64/libmediametrics.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7054000-7007f7055000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f7055000-7007f7058000 r--s 00000000 fe:00 141 /system/fonts/NotoSansPalmyrene-Regular.otf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7058000-7007f707a000 r--s 00000000 fe:00 226 /system/fonts/NotoSerifMyanmar-Bold.otf -Size: 136 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f707a000-7007f709c000 r--s 00000000 fe:00 153 /system/fonts/NotoSerifMyanmar-Regular.otf -Size: 136 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f709c000-7007f70da000 r--p 00000000 fe:00 1512 /system/lib64/libaudioclient.so -Size: 248 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 22 kB -Shared_Clean: 128 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 128 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 22 kB -VmFlags: rd mr mw me -7007f70da000-7007f7110000 r-xp 0003e000 fe:00 1512 /system/lib64/libaudioclient.so -Size: 216 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 188 kB -Pss: 41 kB -Shared_Clean: 188 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 188 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 41 kB -VmFlags: rd ex mr mw me -7007f7110000-7007f7111000 rw-p 00074000 fe:00 1512 /system/lib64/libaudioclient.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7111000-7007f711f000 r--p 00075000 fe:00 1512 /system/lib64/libaudioclient.so -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 56 kB -Pss: 3 kB -Shared_Clean: 0 kB -Shared_Dirty: 56 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 32 kB -Anonymous: 56 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me ac -7007f711f000-7007f7120000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f7120000-7007f7126000 r--s 00000000 fe:00 108 /system/fonts/NotoSansMiao-Regular.otf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7126000-7007f7132000 r--s 00000000 fe:00 206 /system/fonts/NotoSansSyriacEstrangela-Regular.ttf -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7132000-7007f714d000 r--s 00000000 fe:00 227 /system/fonts/NotoSansMyanmar-Bold.ttf -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f714d000-7007f7172000 r--p 00000000 fe:00 1732 /system/lib64/libmedia_omx.so -Size: 148 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 120 kB -Pss: 24 kB -Shared_Clean: 120 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 120 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd mr mw me -7007f7172000-7007f7194000 r-xp 00025000 fe:00 1732 /system/lib64/libmedia_omx.so -Size: 136 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 136 kB -Pss: 31 kB -Shared_Clean: 136 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 136 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 31 kB -VmFlags: rd ex mr mw me -7007f7194000-7007f7195000 rw-p 00047000 fe:00 1732 /system/lib64/libmedia_omx.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7195000-7007f71a0000 r--p 00048000 fe:00 1732 /system/lib64/libmedia_omx.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 44 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 44 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me ac -7007f71a0000-7007f71a1000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f71a1000-7007f71a3000 r--s 00000000 fe:00 997 /system/usr/hyphen-data/hyph-be.hyb -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f71a3000-7007f71be000 r--s 00000000 fe:00 187 /system/fonts/NotoSansMyanmar-Regular.ttf -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f71be000-7007f71e2000 r--s 00000000 fe:00 180 /system/fonts/NotoSansKhmer-VF.ttf -Size: 144 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f71e2000-7007f71ea000 r--p 00000000 fe:00 1655 /system/lib64/libselinux.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 0 kB -Shared_Clean: 32 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 32 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f71ea000-7007f71fa000 r-xp 00008000 fe:00 1655 /system/lib64/libselinux.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 2 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd ex mr mw me -7007f71fa000-7007f71fb000 rw-p 00018000 fe:00 1655 /system/lib64/libselinux.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f71fb000-7007f71fc000 r--p 00019000 fe:00 1655 /system/lib64/libselinux.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f71fc000-7007f71fe000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007f71fe000-7007f7203000 r--s 00000000 fe:00 261 /system/fonts/NotoSansMeroitic-Regular.otf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7203000-7007f7212000 r--s 00000000 fe:00 190 /system/fonts/NotoSansLinearB-Regular.ttf -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7212000-7007f7219000 r--p 00000000 fe:00 1697 /system/lib64/libpiex.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 6 kB -Shared_Clean: 24 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -7007f7219000-7007f722c000 r-xp 00007000 fe:00 1697 /system/lib64/libpiex.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f722c000-7007f722d000 rw-p 0001a000 fe:00 1697 /system/lib64/libpiex.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f722d000-7007f722e000 r--p 0001b000 fe:00 1697 /system/lib64/libpiex.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f722e000-7007f722f000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f722f000-7007f7238000 r--s 00000000 fe:00 259 /system/fonts/NotoSansSymbols-Regular-Subsetted2.ttf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7238000-7007f724d000 r--s 00000000 fe:00 72 /system/fonts/NotoSansSinhalaUI-Bold.otf -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f724d000-7007f7262000 r--s 00000000 fe:00 241 /system/fonts/NotoSansSinhalaUI-Regular.otf -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7262000-7007f726a000 r--p 00000000 fe:00 1240 /system/lib64/libaudioutils.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 5 kB -Shared_Clean: 32 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 32 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -7007f726a000-7007f7274000 r-xp 00008000 fe:00 1240 /system/lib64/libaudioutils.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7274000-7007f7275000 rw-p 00012000 fe:00 1240 /system/lib64/libaudioutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7275000-7007f7276000 r--p 00013000 fe:00 1240 /system/lib64/libaudioutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7276000-7007f7277000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f7277000-7007f7286000 r--s 00000000 fe:00 186 /system/fonts/NotoSansKaithi-Regular.ttf -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7286000-7007f7304000 r--p 00000000 fe:00 1125 /system/lib64/libcrypto.so -Size: 504 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 296 kB -Pss: 18 kB -Shared_Clean: 296 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 296 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 18 kB -VmFlags: rd mr mw me -7007f7304000-7007f73e2000 r-xp 0007e000 fe:00 1125 /system/lib64/libcrypto.so -Size: 888 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 752 kB -Pss: 256 kB -Shared_Clean: 632 kB -Shared_Dirty: 0 kB -Private_Clean: 120 kB -Private_Dirty: 0 kB -Referenced: 752 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 256 kB -VmFlags: rd ex mr mw me -7007f73e2000-7007f73e3000 rw-p 0015c000 fe:00 1125 /system/lib64/libcrypto.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f73e3000-7007f73f4000 r--p 0015d000 fe:00 1125 /system/lib64/libcrypto.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 68 kB -Pss: 3 kB -Shared_Clean: 0 kB -Shared_Dirty: 68 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 68 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me ac -7007f73f4000-7007f73f6000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007f73f6000-7007f73fd000 r--s 00000000 fe:00 267 /system/fonts/NotoSansPhagsPa-Regular.ttf -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f73fd000-7007f7423000 r--s 00000000 fe:00 129 /system/fonts/NotoSansSinhala-Bold.ttf -Size: 152 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7423000-7007f7426000 r--p 00000000 fe:00 1569 /system/lib64/libnativewindow.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 1 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007f7426000-7007f7428000 r-xp 00003000 fe:00 1569 /system/lib64/libnativewindow.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7428000-7007f7429000 rw-p 00005000 fe:00 1569 /system/lib64/libnativewindow.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7429000-7007f742a000 r--p 00006000 fe:00 1569 /system/lib64/libnativewindow.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f742a000-7007f7434000 r--s 00000000 fe:00 178 /system/fonts/NotoSansJavanese-Regular.ttf -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7434000-7007f7449000 r--s 00000000 fe:00 198 /system/fonts/NotoSerifSinhala-Bold.otf -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7449000-7007f7471000 r--s 00000000 fe:00 115 /system/fonts/NotoSansSinhala-Regular.ttf -Size: 160 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7471000-7007f7473000 r--p 00000000 fe:00 1740 /system/lib64/android.hidl.token@1.0-utils.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f7473000-7007f7474000 r-xp 00002000 fe:00 1740 /system/lib64/android.hidl.token@1.0-utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7474000-7007f7475000 rw-p 00003000 fe:00 1740 /system/lib64/android.hidl.token@1.0-utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7475000-7007f7476000 r--p 00004000 fe:00 1740 /system/lib64/android.hidl.token@1.0-utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7476000-7007f7477000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7477000-7007f7486000 r--s 00000000 fe:00 76 /system/fonts/NotoSansCherokee-Regular.ttf -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7486000-7007f7499000 r--s 00000000 fe:00 131 /system/fonts/NotoSerifSinhala-Regular.otf -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7499000-7007f74ad000 r--s 00000000 fe:00 284 /system/fonts/NotoSansOriyaUI-Bold.ttf -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f74ad000-7007f74c9000 r--p 00000000 fe:00 1562 /system/lib64/android.hardware.cas@1.0.so -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 12 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me -7007f74c9000-7007f74f5000 r-xp 0001c000 fe:00 1562 /system/lib64/android.hardware.cas@1.0.so -Size: 176 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f74f5000-7007f74f6000 rw-p 00048000 fe:00 1562 /system/lib64/android.hardware.cas@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f74f6000-7007f74fb000 r--p 00049000 fe:00 1562 /system/lib64/android.hardware.cas@1.0.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 20 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007f74fb000-7007f7500000 r--s 00000000 fe:00 86 /system/fonts/NotoSansManichaean-Regular.otf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7500000-7007f7514000 r--s 00000000 fe:00 244 /system/fonts/NotoSansOriyaUI-Regular.ttf -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7514000-7007f7523000 r--p 00000000 fe:00 1198 /system/lib64/libhidlbase.so -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 60 kB -Pss: 2 kB -Shared_Clean: 60 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 60 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -7007f7523000-7007f7536000 r-xp 0000f000 fe:00 1198 /system/lib64/libhidlbase.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 76 kB -Pss: 3 kB -Shared_Clean: 76 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 76 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd ex mr mw me -7007f7536000-7007f7537000 rw-p 00022000 fe:00 1198 /system/lib64/libhidlbase.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7537000-7007f7539000 r--p 00023000 fe:00 1198 /system/lib64/libhidlbase.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7539000-7007f753a000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f753a000-7007f753b000 rw-s 00000000 00:05 11403 /dev/ashmem/GFXStats-1521 (deleted) -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd wr sh mr mw me ms -7007f753b000-7007f7547000 r--s 00000000 fe:00 283 /system/fonts/NotoSansCanadianAboriginal-Regular.ttf -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7547000-7007f7558000 r--p 00000000 fe:00 1748 /system/lib64/libpng.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 10 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007f7558000-7007f757e000 r-xp 00011000 fe:00 1748 /system/lib64/libpng.so -Size: 152 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 152 kB -Pss: 38 kB -Shared_Clean: 152 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 152 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 38 kB -VmFlags: rd ex mr mw me -7007f757e000-7007f757f000 rw-p 00037000 fe:00 1748 /system/lib64/libpng.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f757f000-7007f7580000 r--p 00038000 fe:00 1748 /system/lib64/libpng.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7580000-7007f75a0000 r--p 00000000 fe:00 1539 /system/lib64/libpcre2.so -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 20 kB -Shared_Clean: 128 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 128 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd mr mw me -7007f75a0000-7007f75cf000 r-xp 00020000 fe:00 1539 /system/lib64/libpcre2.so -Size: 188 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 184 kB -Pss: 37 kB -Shared_Clean: 184 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 184 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 37 kB -VmFlags: rd ex mr mw me -7007f75cf000-7007f75d0000 rw-p 0004f000 fe:00 1539 /system/lib64/libpcre2.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f75d0000-7007f75d1000 r--p 00050000 fe:00 1539 /system/lib64/libpcre2.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f75d1000-7007f75d4000 r--s 00000000 fe:00 281 /system/fonts/NotoSansOldPermic-Regular.otf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f75d4000-7007f75d8000 r--s 00000000 fe:00 268 /system/fonts/NotoSansTifinagh-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f75d8000-7007f75ed000 r--s 00000000 fe:00 60 /system/fonts/NotoSansOriya-Bold.ttf -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f75ed000-7007f7602000 r--s 00000000 fe:00 120 /system/fonts/NotoSansOriya-Regular.ttf -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7602000-7007f760a000 r--p 00000000 fe:00 1141 /system/lib64/libnetdutils.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 6 kB -Shared_Clean: 32 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 32 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -7007f760a000-7007f7614000 r-xp 00008000 fe:00 1141 /system/lib64/libnetdutils.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7614000-7007f7615000 rw-p 00012000 fe:00 1141 /system/lib64/libnetdutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7615000-7007f7616000 r--p 00013000 fe:00 1141 /system/lib64/libnetdutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7616000-7007f7617000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7617000-7007f7619000 r--s 00000000 fe:00 277 /system/fonts/NotoSansSoraSompeng-Regular.otf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7619000-7007f761d000 r--s 00000000 fe:00 225 /system/fonts/NotoSansTaiViet-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f761d000-7007f7668000 r--s 00000000 fe:00 83 /system/fonts/Roboto-Regular.ttf -Size: 300 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 208 kB -Pss: 55 kB -Shared_Clean: 208 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 208 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 55 kB -VmFlags: rd mr me ms -7007f7668000-7007f7909000 r--p 00000000 fe:00 1705 /system/lib64/libpdfium.so -Size: 2692 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 37 kB -Shared_Clean: 128 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 128 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 37 kB -VmFlags: rd mr mw me -7007f7909000-7007f7b59000 r-xp 002a1000 fe:00 1705 /system/lib64/libpdfium.so -Size: 2368 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7b59000-7007f7b5d000 rw-p 004f1000 fe:00 1705 /system/lib64/libpdfium.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7b5d000-7007f7b72000 r--p 004f5000 fe:00 1705 /system/lib64/libpdfium.so -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 84 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 84 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 84 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f7b72000-7007f7b7a000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7b7a000-7007f7b7c000 r--s 00000000 fe:00 230 /system/fonts/NotoSansOldNorthArabian-Regular.otf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7b7c000-7007f7b85000 r--s 00000000 fe:00 137 /system/fonts/NotoSansChakma-Regular.ttf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7b85000-7007f7b9c000 r--s 00000000 fe:00 210 /system/fonts/NotoSerifKannada-Bold.ttf -Size: 92 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7b9c000-7007f7bb3000 r--s 00000000 fe:00 160 /system/fonts/NotoSerifKannada-Regular.ttf -Size: 92 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7bb3000-7007f7bcd000 r--p 00000000 fe:00 1595 /system/lib64/libwilhelm.so -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 10 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007f7bcd000-7007f7bed000 r-xp 0001a000 fe:00 1595 /system/lib64/libwilhelm.so -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7bed000-7007f7bee000 rw-p 0003a000 fe:00 1595 /system/lib64/libwilhelm.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7bee000-7007f7bf3000 r--p 0003b000 fe:00 1595 /system/lib64/libwilhelm.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 20 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007f7bf3000-7007f7bf4000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7bf4000-7007f7bf6000 r--s 00000000 fe:00 213 /system/fonts/NotoSansNabataean-Regular.otf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7bf6000-7007f7c0a000 r--s 00000000 fe:00 169 /system/fonts/NotoSansKannadaUI-Bold.ttf -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7c0a000-7007f7c96000 r--p 00000000 fe:00 1659 /system/lib64/libstagefright.so -Size: 560 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 256 kB -Pss: 66 kB -Shared_Clean: 256 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 256 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 66 kB -VmFlags: rd mr mw me -7007f7c96000-7007f7dad000 r-xp 0008c000 fe:00 1659 /system/lib64/libstagefright.so -Size: 1116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 788 kB -Pss: 289 kB -Shared_Clean: 788 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 788 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 289 kB -VmFlags: rd ex mr mw me -7007f7dad000-7007f7dae000 rw-p 001a3000 fe:00 1659 /system/lib64/libstagefright.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7dae000-7007f7dbe000 r--p 001a4000 fe:00 1659 /system/lib64/libstagefright.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 3 kB -Shared_Clean: 0 kB -Shared_Dirty: 64 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 64 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me ac -7007f7dbe000-7007f7dbf000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f7dbf000-7007f7ddb000 r--s 00000000 fe:00 291 /system/fonts/NotoSansTeluguUI-Bold.ttf -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7ddb000-7007f7de5000 r--p 00000000 fe:00 1770 /system/lib64/android.hidl.allocator@1.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 6 kB -Shared_Clean: 40 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -7007f7de5000-7007f7def000 r-xp 0000a000 fe:00 1770 /system/lib64/android.hidl.allocator@1.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 7 kB -Shared_Clean: 40 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd ex mr mw me -7007f7def000-7007f7df0000 rw-p 00014000 fe:00 1770 /system/lib64/android.hidl.allocator@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7df0000-7007f7df2000 r--p 00015000 fe:00 1770 /system/lib64/android.hidl.allocator@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7df2000-7007f7df3000 rw-s 00000000 00:05 11403 /dev/ashmem/GFXStats-1521 (deleted) -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd wr sh mr mw me ms -7007f7df3000-7007f7e07000 r--s 00000000 fe:00 236 /system/fonts/NotoSansKannadaUI-Regular.ttf -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7e07000-7007f7e10000 r--p 00000000 fe:00 1203 /system/lib64/liblzma.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 3 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007f7e10000-7007f7e2f000 r-xp 00009000 fe:00 1203 /system/lib64/liblzma.so -Size: 124 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7e2f000-7007f7e30000 rw-p 00028000 fe:00 1203 /system/lib64/liblzma.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7e30000-7007f7e31000 r--p 00029000 fe:00 1203 /system/lib64/liblzma.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7e31000-7007f7e38000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7e38000-7007f7e3d000 r--s 00000000 fe:00 269 /system/fonts/NotoSansSaurashtra-Regular.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7e3d000-7007f7e45000 r--s 00000000 fe:00 204 /system/fonts/NotoSansBalinese-Regular.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7e45000-7007f7e50000 r--p 00000000 fe:00 1544 /system/lib64/android.hidl.token@1.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 5 kB -Shared_Clean: 44 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -7007f7e50000-7007f7e5b000 r-xp 0000b000 fe:00 1544 /system/lib64/android.hidl.token@1.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7e5b000-7007f7e5c000 rw-p 00016000 fe:00 1544 /system/lib64/android.hidl.token@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7e5c000-7007f7e5e000 r--p 00017000 fe:00 1544 /system/lib64/android.hidl.token@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7e5e000-7007f7e60000 r--s 00000000 fe:00 85 /system/fonts/NotoSansMultani-Regular.otf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7e60000-7007f7e65000 r--s 00000000 fe:00 168 /system/fonts/NotoSansNKo-Regular.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7e65000-7007f7eb7000 r--s 00000000 fe:00 165 /system/fonts/Roboto-LightItalic.ttf -Size: 328 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7eb7000-7007f7ed5000 r--p 00000000 fe:00 1126 /system/lib64/libprotobuf-cpp-lite.so -Size: 120 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 96 kB -Pss: 8 kB -Shared_Clean: 96 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 96 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me -7007f7ed5000-7007f7ef4000 r-xp 0001e000 fe:00 1126 /system/lib64/libprotobuf-cpp-lite.so -Size: 124 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 124 kB -Pss: 11 kB -Shared_Clean: 124 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 124 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 11 kB -VmFlags: rd ex mr mw me -7007f7ef4000-7007f7ef5000 rw-p 0003d000 fe:00 1126 /system/lib64/libprotobuf-cpp-lite.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7ef5000-7007f7ef7000 r--p 0003e000 fe:00 1126 /system/lib64/libprotobuf-cpp-lite.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7ef7000-7007f7ef8000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7ef8000-7007f7ef9000 r--p 00000000 00:00 0 [anon:atexit handlers] -Name: [anon:atexit handlers] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f7ef9000-7007f7f0d000 r--s 00000000 fe:00 111 /system/fonts/NotoSansKannada-Bold.ttf -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7f0d000-7007f7f19000 r--p 00000000 fe:00 1208 /system/lib64/libbufferhubqueue.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 6 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -7007f7f19000-7007f7f2a000 r-xp 0000c000 fe:00 1208 /system/lib64/libbufferhubqueue.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7f2a000-7007f7f2b000 rw-p 0001d000 fe:00 1208 /system/lib64/libbufferhubqueue.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7f2b000-7007f7f2c000 r--p 0001e000 fe:00 1208 /system/lib64/libbufferhubqueue.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7f2c000-7007f7f2d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7f2d000-7007f7f2e000 rw-s 00000000 00:05 9940 /dev/ashmem/0f02fd80-4c97-473b-981d-e08369625636 (deleted) -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr sh mr mw ms -7007f7f2e000-7007f7f30000 r--s 00000000 fe:00 112 /system/fonts/NotoSansMro-Regular.otf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7f30000-7007f7f71000 r--s 00000000 fe:00 62 /system/fonts/NotoSerif-BoldItalic.ttf -Size: 260 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7f71000-7007f7f72000 r--p 00000000 fe:00 1177 /system/lib64/libsync.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f7f72000-7007f7f73000 r-xp 00001000 fe:00 1177 /system/lib64/libsync.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f7f73000-7007f7f74000 rw-p 00002000 fe:00 1177 /system/lib64/libsync.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7f74000-7007f7f75000 r--p 00003000 fe:00 1177 /system/lib64/libsync.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f7f75000-7007f7f76000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f7f76000-7007f7f7a000 r--s 00000000 fe:00 99 /system/fonts/NotoSansSylotiNagri-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7f7a000-7007f7f87000 r--s 00000000 fe:00 125 /system/fonts/NotoSansAdlam-Regular.ttf -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f7f87000-7007f7fd1000 r--p 00000000 fe:00 1597 /system/lib64/libc.so -Size: 296 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 228 kB -Pss: 3 kB -Shared_Clean: 228 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 228 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007f7fd1000-7007f8089000 r-xp 0004a000 fe:00 1597 /system/lib64/libc.so -Size: 736 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 728 kB -Pss: 12 kB -Shared_Clean: 728 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 728 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me -7007f8089000-7007f808c000 rw-p 00102000 fe:00 1597 /system/lib64/libc.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007f808c000-7007f8093000 r--p 00105000 fe:00 1597 /system/lib64/libc.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 28 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007f8093000-7007f80e5000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 328 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 40 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 40 kB -Referenced: 48 kB -Anonymous: 48 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 40 kB -VmFlags: rd wr mr mw me ac -7007f80e5000-7007f80e6000 r--p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f80e6000-7007f80eb000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 20 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 20 kB -Referenced: 20 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd wr mr mw me ac -7007f80eb000-7007f80ec000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f80ec000-7007f80ee000 r--s 00000000 fe:00 209 /system/fonts/NotoSansHatran-Regular.otf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f80ee000-7007f810a000 r--s 00000000 fe:00 181 /system/fonts/NotoSansTeluguUI-Regular.ttf -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f810a000-7007f8113000 r--p 00000000 fe:00 1515 /system/lib64/libsoundtrigger.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 9 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007f8113000-7007f8118000 r-xp 00009000 fe:00 1515 /system/lib64/libsoundtrigger.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 10 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd ex mr mw me -7007f8118000-7007f8119000 rw-p 0000e000 fe:00 1515 /system/lib64/libsoundtrigger.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f8119000-7007f811d000 r--p 0000f000 fe:00 1515 /system/lib64/libsoundtrigger.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f811d000-7007f811e000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f811e000-7007f8122000 r--s 00000000 fe:00 107 /system/fonts/NotoSansOldPersian-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8122000-7007f812a000 r--s 00000000 fe:00 116 /system/fonts/NotoSansLaoUI-Bold.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f812a000-7007f814f000 r--s 00000000 fe:00 252 /system/fonts/NotoSerifTelugu-Bold.ttf -Size: 148 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f814f000-7007f815d000 r--p 00000000 fe:00 1190 /system/lib64/libexpat.so -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 56 kB -Pss: 9 kB -Shared_Clean: 56 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 56 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007f815d000-7007f8178000 r-xp 0000e000 fe:00 1190 /system/lib64/libexpat.so -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f8178000-7007f8179000 rw-p 00029000 fe:00 1190 /system/lib64/libexpat.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f8179000-7007f817b000 r--p 0002a000 fe:00 1190 /system/lib64/libexpat.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f817b000-7007f817c000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f817c000-7007f8182000 r--s 00000000 fe:00 188 /system/fonts/NotoSansKharoshthi-Regular.ttf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8182000-7007f81c5000 r--p 00000000 fe:00 1204 /system/lib64/libmedia.so -Size: 268 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 21 kB -Shared_Clean: 128 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 128 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 21 kB -VmFlags: rd mr mw me -7007f81c5000-7007f821a000 r-xp 00043000 fe:00 1204 /system/lib64/libmedia.so -Size: 340 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 272 kB -Pss: 65 kB -Shared_Clean: 272 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 272 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 65 kB -VmFlags: rd ex mr mw me -7007f821a000-7007f821b000 rw-p 00098000 fe:00 1204 /system/lib64/libmedia.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f821b000-7007f8230000 r--p 00099000 fe:00 1204 /system/lib64/libmedia.so -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 84 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 84 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 84 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f8230000-7007f8231000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f8231000-7007f8232000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f8232000-7007f8257000 r--s 00000000 fe:00 203 /system/fonts/NotoSerifTelugu-Regular.ttf -Size: 148 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8257000-7007f8264000 r--p 00000000 fe:00 1700 /system/lib64/android.hardware.graphics.mapper@2.1.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 5 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -7007f8264000-7007f8271000 r-xp 0000d000 fe:00 1700 /system/lib64/android.hardware.graphics.mapper@2.1.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 6 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd ex mr mw me -7007f8271000-7007f8272000 rw-p 0001a000 fe:00 1700 /system/lib64/android.hardware.graphics.mapper@2.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f8272000-7007f8274000 r--p 0001b000 fe:00 1700 /system/lib64/android.hardware.graphics.mapper@2.1.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f8274000-7007f827a000 r--s 00000000 fe:00 106 /system/fonts/NotoSansCoptic-Regular.ttf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f827a000-7007f8282000 r--s 00000000 fe:00 59 /system/fonts/NotoSansLaoUI-Regular.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8282000-7007f8296000 r--p 00000000 fe:00 1216 /system/lib64/android.system.suspend@1.0.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 9 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007f8296000-7007f82ae000 r-xp 00014000 fe:00 1216 /system/lib64/android.system.suspend@1.0.so -Size: 96 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 96 kB -Pss: 19 kB -Shared_Clean: 96 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 96 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 19 kB -VmFlags: rd ex mr mw me -7007f82ae000-7007f82af000 rw-p 0002c000 fe:00 1216 /system/lib64/android.system.suspend@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f82af000-7007f82b3000 r--p 0002d000 fe:00 1216 /system/lib64/android.system.suspend@1.0.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f82b3000-7007f82b4000 r--s 00000000 00:13 6990 /dev/event-log-tags -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f82b4000-7007f82ba000 r--s 00000000 fe:00 242 /system/fonts/NotoSansBrahmi-Regular.ttf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f82ba000-7007f82c4000 r--s 00000000 fe:00 92 /system/fonts/NotoSansKhmerUI-Regular.ttf -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f82c4000-7007f82c5000 r--p 00000000 fe:00 1217 /system/lib64/libhidlallocatorutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f82c5000-7007f82c6000 r-xp 00001000 fe:00 1217 /system/lib64/libhidlallocatorutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f82c6000-7007f82c7000 rw-p 00002000 fe:00 1217 /system/lib64/libhidlallocatorutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f82c7000-7007f82c8000 r--p 00003000 fe:00 1217 /system/lib64/libhidlallocatorutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f82c8000-7007f82ce000 r--s 00000000 fe:00 101 /system/fonts/NotoSansCham-Bold.ttf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f82ce000-7007f82da000 r--s 00000000 fe:00 228 /system/fonts/NotoSerifKhmer-Bold.otf -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f82da000-7007f832b000 r--s 00000000 fe:00 89 /system/fonts/Roboto-ThinItalic.ttf -Size: 324 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f832b000-7007f835c000 r--p 00000000 fe:00 1152 /system/lib64/libvintf.so -Size: 196 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 124 kB -Pss: 32 kB -Shared_Clean: 124 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 124 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd mr mw me -7007f835c000-7007f83b7000 r-xp 00031000 fe:00 1152 /system/lib64/libvintf.so -Size: 364 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 360 kB -Pss: 138 kB -Shared_Clean: 352 kB -Shared_Dirty: 0 kB -Private_Clean: 8 kB -Private_Dirty: 0 kB -Referenced: 360 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 138 kB -VmFlags: rd ex mr mw me -7007f83b7000-7007f83b8000 rw-p 0008c000 fe:00 1152 /system/lib64/libvintf.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f83b8000-7007f83bd000 r--p 0008d000 fe:00 1152 /system/lib64/libvintf.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 20 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007f83bd000-7007f83bf000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007f83bf000-7007f83c2000 r--s 00000000 fe:00 287 /system/fonts/NotoSansTaiLe-Regular.ttf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f83c2000-7007f85b0000 r--p 00000000 fe:00 1537 /system/lib64/libhwui.so -Size: 1976 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 632 kB -Pss: 196 kB -Shared_Clean: 632 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 632 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 196 kB -VmFlags: rd mr mw me -7007f85b0000-7007f8b9b000 r-xp 001ee000 fe:00 1537 /system/lib64/libhwui.so -Size: 6060 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4132 kB -Pss: 1274 kB -Shared_Clean: 4132 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4132 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1274 kB -VmFlags: rd ex mr mw me -7007f8b9b000-7007f8b9c000 rw-p 007d9000 fe:00 1537 /system/lib64/libhwui.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f8b9c000-7007f8bd5000 r--p 007da000 fe:00 1537 /system/lib64/libhwui.so -Size: 228 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 228 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 228 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 160 kB -Anonymous: 228 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me ac -7007f8bd5000-7007f8bda000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 16 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 16 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd wr mr mw me ac -7007f8bda000-7007f8bde000 r--s 00000000 fe:00 126 /system/fonts/NotoSansNewTaiLue-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8bde000-7007f8bf3000 r--s 00000000 fe:00 90 /system/fonts/NotoSansKannada-Regular.ttf -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8bf3000-7007f8c0e000 r--s 00000000 fe:00 118 /system/fonts/NotoSansTelugu-Bold.ttf -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8c0e000-7007f8cfe000 r--p 00000000 fe:00 1538 /system/lib64/libicui18n.so -Size: 960 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 192 kB -Pss: 21 kB -Shared_Clean: 192 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 192 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 21 kB -VmFlags: rd mr mw me -7007f8cfe000-7007f8e8a000 r-xp 000f0000 fe:00 1538 /system/lib64/libicui18n.so -Size: 1584 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 1276 kB -Pss: 318 kB -Shared_Clean: 1276 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 1276 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 318 kB -VmFlags: rd ex mr mw me -7007f8e8a000-7007f8e8b000 rw-p 0027c000 fe:00 1538 /system/lib64/libicui18n.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f8e8b000-7007f8e9e000 r--p 0027d000 fe:00 1538 /system/lib64/libicui18n.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 76 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 76 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 76 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f8e9e000-7007f8e9f000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f8e9f000-7007f8ea7000 r--s 00000000 fe:00 95 /system/fonts/NotoSerifLao-Bold.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8ea7000-7007f8ec3000 r--s 00000000 fe:00 221 /system/fonts/NotoSansTelugu-Regular.ttf -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8ec3000-7007f8edd000 r--s 00000000 fe:00 64 /system/fonts/NotoSansBengaliUI-Bold.ttf -Size: 104 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8edd000-7007f8edf000 r--p 00000000 fe:00 1743 /system/lib64/libstagefright_codecbase.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 1 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007f8edf000-7007f8ee2000 r-xp 00002000 fe:00 1743 /system/lib64/libstagefright_codecbase.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 6 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd ex mr mw me -7007f8ee2000-7007f8ee3000 rw-p 00005000 fe:00 1743 /system/lib64/libstagefright_codecbase.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f8ee3000-7007f8ee4000 r--p 00006000 fe:00 1743 /system/lib64/libstagefright_codecbase.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f8ee4000-7007f8ee7000 r--s 00000000 fe:00 176 /system/fonts/NotoSansSundanese-Regular.ttf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8ee7000-7007f8f04000 r--s 00000000 fe:00 197 /system/fonts/NotoSerifBengali-Bold.ttf -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8f04000-7007f8f05000 r--p 00000000 fe:00 1151 /system/lib64/libion.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f8f05000-7007f8f06000 r-xp 00001000 fe:00 1151 /system/lib64/libion.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f8f06000-7007f8f07000 rw-p 00002000 fe:00 1151 /system/lib64/libion.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f8f07000-7007f8f08000 r--p 00003000 fe:00 1151 /system/lib64/libion.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f8f08000-7007f8f09000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f8f09000-7007f8f0a000 r--s 00000000 fe:00 996 /system/usr/hyphen-data/hyph-und-ethi.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8f0a000-7007f8f55000 r--s 00000000 fe:00 237 /system/fonts/Roboto-Light.ttf -Size: 300 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f8f55000-7007f9019000 r--p 00000000 fe:00 1195 /system/lib64/libandroid_runtime.so -Size: 784 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 448 kB -Pss: 78 kB -Shared_Clean: 448 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 448 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 78 kB -VmFlags: rd mr mw me -7007f9019000-7007f910c000 r-xp 000c4000 fe:00 1195 /system/lib64/libandroid_runtime.so -Size: 972 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 772 kB -Pss: 68 kB -Shared_Clean: 772 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 772 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 68 kB -VmFlags: rd ex mr mw me -7007f910c000-7007f910d000 rw-p 001b7000 fe:00 1195 /system/lib64/libandroid_runtime.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f910d000-7007f912a000 r--p 001b8000 fe:00 1195 /system/lib64/libandroid_runtime.so -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 116 kB -Pss: 6 kB -Shared_Clean: 0 kB -Shared_Dirty: 116 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 72 kB -Anonymous: 116 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me ac -7007f912a000-7007f912d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me ac -7007f912d000-7007f9148000 r--s 00000000 fe:00 67 /system/fonts/NotoSansBengaliUI-Regular.ttf -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9148000-7007f9158000 r--p 00000000 fe:00 1761 /system/lib64/android.hardware.configstore@1.0.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 6 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -7007f9158000-7007f916c000 r-xp 00010000 fe:00 1761 /system/lib64/android.hardware.configstore@1.0.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 80 kB -Pss: 10 kB -Shared_Clean: 80 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 80 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd ex mr mw me -7007f916c000-7007f916d000 rw-p 00024000 fe:00 1761 /system/lib64/android.hardware.configstore@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f916d000-7007f9170000 r--p 00025000 fe:00 1761 /system/lib64/android.hardware.configstore@1.0.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9170000-7007f9172000 r--s 00000000 fe:00 79 /system/fonts/NotoSansBassaVah-Regular.otf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9172000-7007f918f000 r--s 00000000 fe:00 246 /system/fonts/NotoSerifBengali-Regular.ttf -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f918f000-7007f91b2000 r--p 00000000 fe:00 1581 /system/lib64/libsqlite.so -Size: 140 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 7 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd mr mw me -7007f91b2000-7007f92b8000 r-xp 00023000 fe:00 1581 /system/lib64/libsqlite.so -Size: 1048 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 916 kB -Pss: 111 kB -Shared_Clean: 916 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 916 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 111 kB -VmFlags: rd ex mr mw me -7007f92b8000-7007f92ba000 rw-p 00129000 fe:00 1581 /system/lib64/libsqlite.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f92ba000-7007f92bd000 r--p 0012b000 fe:00 1581 /system/lib64/libsqlite.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f92bd000-7007f92be000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f92be000-7007f92c1000 r--s 00000000 fe:00 65 /system/fonts/NotoSansSamaritan-Regular.ttf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f92c1000-7007f92cb000 r--s 00000000 fe:00 174 /system/fonts/NotoSerifKhmer-Regular.otf -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f92cb000-7007f92ed000 r--p 00000000 fe:00 1127 /system/lib64/libm.so -Size: 136 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 136 kB -Pss: 7 kB -Shared_Clean: 136 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 136 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd mr mw me -7007f92ed000-7007f9319000 r-xp 00022000 fe:00 1127 /system/lib64/libm.so -Size: 176 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 100 kB -Pss: 4 kB -Shared_Clean: 100 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 100 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd ex mr mw me -7007f9319000-7007f931a000 rw-p 0004e000 fe:00 1127 /system/lib64/libm.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f931a000-7007f931b000 r--p 0004f000 fe:00 1127 /system/lib64/libm.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f931b000-7007f931c000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f931c000-7007f9366000 r--s 00000000 fe:00 175 /system/fonts/RobotoCondensed-Light.ttf -Size: 296 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9366000-7007f936e000 r--p 00000000 fe:00 1260 /system/lib64/libcutils.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 0 kB -Shared_Clean: 32 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 32 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f936e000-7007f9377000 r-xp 00008000 fe:00 1260 /system/lib64/libcutils.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 0 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9377000-7007f9378000 rw-p 00011000 fe:00 1260 /system/lib64/libcutils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f9378000-7007f937a000 r--p 00012000 fe:00 1260 /system/lib64/libcutils.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f937a000-7007f937b000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f937b000-7007f937c000 r--s 00000000 fe:00 1018 /system/usr/hyphen-data/hyph-tk.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f937c000-7007f9384000 r--s 00000000 fe:00 117 /system/fonts/NotoSerifLao-Regular.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9384000-7007f93b3000 r--p 00000000 fe:00 1598 /system/lib64/libft2.so -Size: 188 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 26 kB -Shared_Clean: 128 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 128 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 26 kB -VmFlags: rd mr mw me -7007f93b3000-7007f9422000 r-xp 0002f000 fe:00 1598 /system/lib64/libft2.so -Size: 444 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 376 kB -Pss: 94 kB -Shared_Clean: 376 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 376 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 94 kB -VmFlags: rd ex mr mw me -7007f9422000-7007f9423000 rw-p 0009e000 fe:00 1598 /system/lib64/libft2.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9423000-7007f9428000 r--p 0009f000 fe:00 1598 /system/lib64/libft2.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 20 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007f9428000-7007f942c000 r--s 00000000 fe:00 217 /system/fonts/NotoSansMeeteiMayek-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f942c000-7007f9445000 r--s 00000000 fe:00 127 /system/fonts/NotoSansBengali-Bold.ttf -Size: 100 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9445000-7007f9452000 r--p 00000000 fe:00 1520 /system/lib64/libhidl-gen-utils.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 5 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -7007f9452000-7007f9467000 r-xp 0000d000 fe:00 1520 /system/lib64/libhidl-gen-utils.so -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 84 kB -Pss: 11 kB -Shared_Clean: 84 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 84 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 11 kB -VmFlags: rd ex mr mw me -7007f9467000-7007f9468000 rw-p 00022000 fe:00 1520 /system/lib64/libhidl-gen-utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9468000-7007f9469000 r--p 00023000 fe:00 1520 /system/lib64/libhidl-gen-utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9469000-7007f946a000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f946a000-7007f946c000 r--s 00000000 fe:00 272 /system/fonts/NotoSansUgaritic-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f946c000-7007f9485000 r--s 00000000 fe:00 183 /system/fonts/NotoSansBengali-Regular.ttf -Size: 100 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9485000-7007f9493000 r--s 00000000 fe:00 94 /system/fonts/NotoSansMalayalamUI-Bold.ttf -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9493000-7007f9495000 r--p 00000000 fe:00 1189 /system/lib64/libnativebridge.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f9495000-7007f9497000 r-xp 00002000 fe:00 1189 /system/lib64/libnativebridge.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9497000-7007f9498000 rw-p 00004000 fe:00 1189 /system/lib64/libnativebridge.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9498000-7007f9499000 r--p 00005000 fe:00 1189 /system/lib64/libnativebridge.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9499000-7007f949a000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f949a000-7007f949e000 r--s 00000000 fe:00 145 /system/fonts/NotoSansMandaic-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f949e000-7007f94ac000 r--s 00000000 fe:00 133 /system/fonts/NotoSansMalayalamUI-Regular.ttf -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f94ac000-7007f94b9000 r--s 00000000 fe:00 232 /system/fonts/NotoSerifMalayalam-Bold.ttf -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f94b9000-7007f94c7000 r--s 00000000 fe:00 273 /system/fonts/NotoSansMalayalam-Bold.ttf -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f94c7000-7007f94f3000 r--p 00000000 fe:00 1702 /system/lib64/libharfbuzz_ng.so -Size: 176 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 156 kB -Pss: 33 kB -Shared_Clean: 156 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 156 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 33 kB -VmFlags: rd mr mw me -7007f94f3000-7007f9570000 r-xp 0002c000 fe:00 1702 /system/lib64/libharfbuzz_ng.so -Size: 500 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 488 kB -Pss: 122 kB -Shared_Clean: 488 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 488 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 122 kB -VmFlags: rd ex mr mw me -7007f9570000-7007f9571000 rw-p 000a9000 fe:00 1702 /system/lib64/libharfbuzz_ng.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9571000-7007f9572000 r--p 000aa000 fe:00 1702 /system/lib64/libharfbuzz_ng.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9572000-7007f9575000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9575000-7007f957e000 r--s 00000000 fe:00 212 /system/fonts/NotoSansKhmerUI-Bold.ttf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f957e000-7007f958c000 r--s 00000000 fe:00 150 /system/fonts/NotoSansMalayalam-Regular.ttf -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f958c000-7007f958e000 r--p 00000000 fe:00 1640 /system/lib64/libmemtrack.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007f958e000-7007f958f000 r-xp 00002000 fe:00 1640 /system/lib64/libmemtrack.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd ex mr mw me -7007f958f000-7007f9590000 rw-p 00003000 fe:00 1640 /system/lib64/libmemtrack.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9590000-7007f9591000 r--p 00004000 fe:00 1640 /system/lib64/libmemtrack.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9591000-7007f9592000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f9592000-7007f959f000 r--s 00000000 fe:00 109 /system/fonts/NotoSerifMalayalam-Regular.ttf -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f959f000-7007f95a8000 r--s 00000000 fe:00 163 /system/fonts/NotoSansTamilUI-Bold.ttf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f95a8000-7007f95f4000 r--s 00000000 fe:00 251 /system/fonts/Roboto-Thin.ttf -Size: 304 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f95f4000-7007f95f6000 r--p 00000000 fe:00 1657 /system/lib64/libdebuggerd_client.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 1 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007f95f6000-7007f95f8000 r-xp 00002000 fe:00 1657 /system/lib64/libdebuggerd_client.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f95f8000-7007f95f9000 rw-p 00004000 fe:00 1657 /system/lib64/libdebuggerd_client.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f95f9000-7007f95fa000 r--p 00005000 fe:00 1657 /system/lib64/libdebuggerd_client.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f95fa000-7007f95fe000 r--s 00000000 fe:00 201 /system/fonts/NotoSansGlagolitic-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f95fe000-7007f961a000 r--s 00000000 fe:00 69 /system/fonts/NotoSansGujaratiUI-Bold.ttf -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f961a000-7007f961b000 r--p 00000000 fe:00 1652 /system/lib64/libdl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f961b000-7007f961c000 r-xp 00001000 fe:00 1652 /system/lib64/libdl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f961c000-7007f961d000 r--p 00002000 fe:00 1652 /system/lib64/libdl.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f961d000-7007f961e000 r--p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f961e000-7007f9624000 r--s 00000000 fe:00 173 /system/fonts/NotoSansCham-Regular.ttf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9624000-7007f9642000 r--s 00000000 fe:00 271 /system/fonts/NotoSansGujarati-Regular.ttf -Size: 120 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9642000-7007f9648000 r--p 00000000 fe:00 1769 /system/lib64/libbpf_android.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 4 kB -Shared_Clean: 24 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007f9648000-7007f9652000 r-xp 00006000 fe:00 1769 /system/lib64/libbpf_android.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 2 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd ex mr mw me -7007f9652000-7007f9653000 rw-p 00010000 fe:00 1769 /system/lib64/libbpf_android.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9653000-7007f9654000 r--p 00011000 fe:00 1769 /system/lib64/libbpf_android.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9654000-7007f9655000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9655000-7007f9657000 r--s 00000000 fe:00 177 /system/fonts/NotoSansTagbanwa-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9657000-7007f9660000 r--s 00000000 fe:00 75 /system/fonts/NotoSansTamilUI-Regular.ttf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9660000-7007f969d000 r--s 00000000 fe:00 140 /system/fonts/NotoSerif-Italic.ttf -Size: 244 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f969d000-7007f969f000 r--p 00000000 fe:00 1718 /system/lib64/libstdc++.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f969f000-7007f96a1000 r-xp 00002000 fe:00 1718 /system/lib64/libstdc++.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f96a1000-7007f96a2000 rw-p 00004000 fe:00 1718 /system/lib64/libstdc++.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f96a2000-7007f96a3000 r--p 00005000 fe:00 1718 /system/lib64/libstdc++.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f96a3000-7007f96c0000 r--s 00000000 fe:00 256 /system/fonts/NotoSansGujaratiUI-Regular.ttf -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f96c0000-7007f96de000 r--s 00000000 fe:00 93 /system/fonts/NotoSansDevanagariUI-Bold.ttf -Size: 120 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f96de000-7007f9717000 r--p 00000000 fe:00 1547 /system/lib64/libhidltransport.so -Size: 228 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 200 kB -Pss: 9 kB -Shared_Clean: 200 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 200 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007f9717000-7007f9772000 r-xp 00039000 fe:00 1547 /system/lib64/libhidltransport.so -Size: 364 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 364 kB -Pss: 16 kB -Shared_Clean: 364 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 364 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 16 kB -VmFlags: rd ex mr mw me -7007f9772000-7007f9773000 rw-p 00094000 fe:00 1547 /system/lib64/libhidltransport.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9773000-7007f977d000 r--p 00095000 fe:00 1547 /system/lib64/libhidltransport.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 40 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 40 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me ac -7007f977d000-7007f977e000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f977e000-7007f9786000 r--s 00000000 fe:00 185 /system/fonts/NotoSansLao-Bold.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9786000-7007f978f000 r--s 00000000 fe:00 245 /system/fonts/NotoSerifTamil-Bold.ttf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f978f000-7007f9798000 r--s 00000000 fe:00 191 /system/fonts/NotoSerifTamil-Regular.ttf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9798000-7007f97b7000 r--s 00000000 fe:00 248 /system/fonts/NotoSansDevanagariUI-Regular.ttf -Size: 124 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f97b7000-7007f986a000 r--p 00000000 fe:00 1267 /system/lib64/libicuuc.so -Size: 716 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 440 kB -Pss: 45 kB -Shared_Clean: 440 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 440 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 45 kB -VmFlags: rd mr mw me -7007f986a000-7007f9966000 r-xp 000b3000 fe:00 1267 /system/lib64/libicuuc.so -Size: 1008 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 992 kB -Pss: 73 kB -Shared_Clean: 992 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 992 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 73 kB -VmFlags: rd ex mr mw me -7007f9966000-7007f9967000 rw-p 001af000 fe:00 1267 /system/lib64/libicuuc.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9967000-7007f997b000 r--p 001b0000 fe:00 1267 /system/lib64/libicuuc.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 80 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 80 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 80 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007f997b000-7007f997d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007f997d000-7007f997e000 r--s 00000000 fe:00 977 /system/usr/hyphen-data/hyph-te.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f997e000-7007f9987000 r--s 00000000 fe:00 70 /system/fonts/NotoSansTamil-Bold.ttf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9987000-7007f99a8000 r--s 00000000 fe:00 124 /system/fonts/NotoSansDevanagari-Bold.ttf -Size: 132 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f99a8000-7007f99ac000 r--p 00000000 fe:00 1542 /system/lib64/libstagefright_xmlparser.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 3 kB -Shared_Clean: 16 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007f99ac000-7007f99b4000 r-xp 00004000 fe:00 1542 /system/lib64/libstagefright_xmlparser.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f99b4000-7007f99b5000 rw-p 0000c000 fe:00 1542 /system/lib64/libstagefright_xmlparser.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f99b5000-7007f99b6000 r--p 0000d000 fe:00 1542 /system/lib64/libstagefright_xmlparser.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f99b6000-7007f99b8000 r--s 00000000 fe:00 234 /system/fonts/NotoSansTagalog-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f99b8000-7007f99da000 r--s 00000000 fe:00 235 /system/fonts/NotoSansDevanagari-Regular.ttf -Size: 136 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f99da000-7007f99e1000 r--p 00000000 fe:00 1555 /system/lib64/libstatslog.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 5 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd mr mw me -7007f99e1000-7007f99ef000 r-xp 00007000 fe:00 1555 /system/lib64/libstatslog.so -Size: 56 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 56 kB -Pss: 10 kB -Shared_Clean: 56 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 56 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd ex mr mw me -7007f99ef000-7007f99f0000 rw-p 00015000 fe:00 1555 /system/lib64/libstatslog.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f99f0000-7007f99f1000 r--p 00016000 fe:00 1555 /system/lib64/libstatslog.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f99f1000-7007f99f2000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f99f2000-7007f99fa000 r--s 00000000 fe:00 73 /system/fonts/NotoSansLao-Regular.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f99fa000-7007f9a03000 r--s 00000000 fe:00 205 /system/fonts/NotoSansTamil-Regular.ttf -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9a03000-7007f9a13000 r--p 00000000 fe:00 1224 /system/lib64/android.hidl.memory@1.0.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 10 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007f9a13000-7007f9a27000 r-xp 00010000 fe:00 1224 /system/lib64/android.hidl.memory@1.0.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 80 kB -Pss: 20 kB -Shared_Clean: 80 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 80 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 20 kB -VmFlags: rd ex mr mw me -7007f9a27000-7007f9a28000 rw-p 00024000 fe:00 1224 /system/lib64/android.hidl.memory@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9a28000-7007f9a2b000 r--p 00025000 fe:00 1224 /system/lib64/android.hidl.memory@1.0.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9a2b000-7007f9a48000 r--s 00000000 fe:00 171 /system/fonts/NotoSansGujarati-Bold.ttf -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9a48000-7007f9a51000 r--p 00000000 fe:00 1723 /system/lib64/libbase.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 0 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f9a51000-7007f9a5a000 r-xp 00009000 fe:00 1723 /system/lib64/libbase.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 0 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9a5a000-7007f9a5b000 rw-p 00012000 fe:00 1723 /system/lib64/libbase.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9a5b000-7007f9a5c000 r--p 00013000 fe:00 1723 /system/lib64/libbase.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9a5c000-7007f9a5d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f9a5d000-7007f9a5f000 r--s 00000000 fe:00 66 /system/fonts/NotoSansShavian-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9a5f000-7007f9a73000 r--s 00000000 fe:00 264 /system/fonts/NotoSerifDevanagari-Bold.ttf -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9a73000-7007f9a93000 r--s 00000000 fe:00 266 /system/fonts/NotoSerifEthiopic-Bold.otf -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9a93000-7007f9a96000 r--p 00000000 fe:00 1519 /system/lib64/libnativeloader.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f9a96000-7007f9a9a000 r-xp 00003000 fe:00 1519 /system/lib64/libnativeloader.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 16 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9a9a000-7007f9a9b000 rw-p 00007000 fe:00 1519 /system/lib64/libnativeloader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9a9b000-7007f9a9c000 r--p 00008000 fe:00 1519 /system/lib64/libnativeloader.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9a9c000-7007f9a9d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f9a9d000-7007f9aa0000 r--s 00000000 fe:00 136 /system/fonts/NotoSansRunic-Regular.ttf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9aa0000-7007f9aa8000 r--s 00000000 fe:00 143 /system/fonts/NotoSansGurmukhiUI-Bold.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9aa8000-7007f9abc000 r--s 00000000 fe:00 260 /system/fonts/NotoSerifDevanagari-Regular.ttf -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9abc000-7007f9ad8000 r--s 00000000 fe:00 215 /system/fonts/NotoSerifEthiopic-Regular.otf -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9ad8000-7007f9b30000 r--p 00000000 fe:00 1656 /system/lib64/libc++.so -Size: 352 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 224 kB -Pss: 3 kB -Shared_Clean: 224 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 224 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007f9b30000-7007f9ba4000 r-xp 00058000 fe:00 1656 /system/lib64/libc++.so -Size: 464 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 388 kB -Pss: 6 kB -Shared_Clean: 388 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 388 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd ex mr mw me -7007f9ba4000-7007f9ba5000 rw-p 000cc000 fe:00 1656 /system/lib64/libc++.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9ba5000-7007f9bad000 r--p 000cd000 fe:00 1656 /system/lib64/libc++.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 32 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 32 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007f9bad000-7007f9bb1000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 16 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me ac -7007f9bb1000-7007f9bb3000 r--s 00000000 fe:00 146 /system/fonts/NotoSansRejang-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9bb3000-7007f9bf0000 r--s 00000000 fe:00 113 /system/fonts/NotoSerif-Bold.ttf -Size: 244 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9bf0000-7007f9bf1000 r--p 00000000 fe:00 1614 /system/lib64/libhardware.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f9bf1000-7007f9bf2000 r-xp 00001000 fe:00 1614 /system/lib64/libhardware.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9bf2000-7007f9bf3000 rw-p 00002000 fe:00 1614 /system/lib64/libhardware.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9bf3000-7007f9bf4000 r--p 00003000 fe:00 1614 /system/lib64/libhardware.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9bf4000-7007f9bfc000 r--s 00000000 fe:00 97 /system/fonts/NotoSansGurmukhiUI-Regular.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9bfc000-7007f9c04000 r--s 00000000 fe:00 250 /system/fonts/NotoSerifGurmukhi-Bold.otf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9c04000-7007f9c26000 r--p 00000000 fe:00 1714 /system/lib64/libartbase.so -Size: 136 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 108 kB -Pss: 7 kB -Shared_Clean: 108 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 108 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd mr mw me -7007f9c26000-7007f9c72000 r-xp 00022000 fe:00 1714 /system/lib64/libartbase.so -Size: 304 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 164 kB -Pss: 7 kB -Shared_Clean: 164 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 164 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd ex mr mw me -7007f9c72000-7007f9c73000 rw-p 0006e000 fe:00 1714 /system/lib64/libartbase.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9c73000-7007f9c75000 r--p 0006f000 fe:00 1714 /system/lib64/libartbase.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9c75000-7007f9c7c000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007f9c7c000-7007f9c84000 r--s 00000000 fe:00 78 /system/fonts/NotoSansGurmukhi-Bold.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9c84000-7007f9ca8000 r--s 00000000 fe:00 218 /system/fonts/NotoSansEthiopic-Bold.ttf -Size: 144 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9ca8000-7007f9caa000 r--p 00000000 fe:00 1258 /system/lib64/libdexfile_external.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f9caa000-7007f9cad000 r-xp 00002000 fe:00 1258 /system/lib64/libdexfile_external.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9cad000-7007f9cae000 rw-p 00005000 fe:00 1258 /system/lib64/libdexfile_external.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9cae000-7007f9caf000 r--p 00006000 fe:00 1258 /system/lib64/libdexfile_external.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9caf000-7007f9cb0000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9cb0000-7007f9cb7000 r--s 00000000 fe:00 179 /system/fonts/NotoSerifGurmukhi-Regular.otf -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9cb7000-7007f9cda000 r--s 00000000 fe:00 77 /system/fonts/NotoSansEthiopic-Regular.ttf -Size: 140 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9cda000-7007f9ce3000 r--p 00000000 fe:00 1571 /system/lib64/libtinyxml2.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 7 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd mr mw me -7007f9ce3000-7007f9cef000 r-xp 00009000 fe:00 1571 /system/lib64/libtinyxml2.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 24 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd ex mr mw me -7007f9cef000-7007f9cf0000 rw-p 00015000 fe:00 1571 /system/lib64/libtinyxml2.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9cf0000-7007f9cf1000 r--p 00016000 fe:00 1571 /system/lib64/libtinyxml2.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9cf1000-7007f9cf2000 r--s 00000000 fe:00 974 /system/usr/hyphen-data/hyph-ta.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9cf2000-7007f9cf6000 r--s 00000000 fe:00 247 /system/fonts/NotoSansBatak-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9cf6000-7007f9d14000 r--s 00000000 fe:00 253 /system/fonts/NotoNaskhArabicUI-Bold.ttf -Size: 120 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9d14000-7007f9d16000 r--p 00000000 fe:00 1256 /system/lib64/libusbhost.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 2 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -7007f9d16000-7007f9d18000 r-xp 00002000 fe:00 1256 /system/lib64/libusbhost.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9d18000-7007f9d19000 rw-p 00004000 fe:00 1256 /system/lib64/libusbhost.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9d19000-7007f9d1a000 r--p 00005000 fe:00 1256 /system/lib64/libusbhost.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9d1a000-7007f9d1e000 r--s 00000000 fe:00 240 /system/fonts/NotoSansAhom-Regular.otf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9d1e000-7007f9d26000 r--s 00000000 fe:00 224 /system/fonts/NotoSansGurmukhi-Regular.ttf -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9d26000-7007f9d63000 r--s 00000000 fe:00 91 /system/fonts/NotoSerif-Regular.ttf -Size: 244 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9d63000-7007f9dae000 r--p 00000000 fe:00 1681 /system/lib64/libdng_sdk.so -Size: 300 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 116 kB -Pss: 33 kB -Shared_Clean: 116 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 116 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 33 kB -VmFlags: rd mr mw me -7007f9dae000-7007f9e37000 r-xp 0004b000 fe:00 1681 /system/lib64/libdng_sdk.so -Size: 548 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9e37000-7007f9e38000 rw-p 000d4000 fe:00 1681 /system/lib64/libdng_sdk.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9e38000-7007f9e3e000 r--p 000d5000 fe:00 1681 /system/lib64/libdng_sdk.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 24 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007f9e3e000-7007f9e3f000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9e3f000-7007f9e40000 r--s 00000000 fe:00 1016 /system/usr/hyphen-data/hyph-pt.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9e40000-7007f9e50000 r--s 00000000 fe:00 152 /system/fonts/NotoSerifGujarati-Bold.ttf -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9e50000-7007f9e82000 r--p 00000000 fe:00 1221 /system/lib64/libcamera_client.so -Size: 200 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 10 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007f9e82000-7007f9ea4000 r-xp 00032000 fe:00 1221 /system/lib64/libcamera_client.so -Size: 136 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9ea4000-7007f9ea5000 rw-p 00054000 fe:00 1221 /system/lib64/libcamera_client.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9ea5000-7007f9eb1000 r--p 00055000 fe:00 1221 /system/lib64/libcamera_client.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 48 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 48 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me ac -7007f9eb1000-7007f9eb2000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9eb2000-7007f9eb3000 r--s 00000000 fe:00 1002 /system/usr/hyphen-data/hyph-pa.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9eb3000-7007f9ec3000 r--s 00000000 fe:00 238 /system/fonts/NotoSerifGujarati-Regular.ttf -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9ec3000-7007f9ed6000 r--p 00000000 fe:00 1528 /system/lib64/libGLESv2.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 7 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd mr mw me -7007f9ed6000-7007f9edd000 r-xp 00013000 fe:00 1528 /system/lib64/libGLESv2.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 7 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd ex mr mw me -7007f9edd000-7007f9ede000 rw-p 0001a000 fe:00 1528 /system/lib64/libGLESv2.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9ede000-7007f9edf000 r--p 0001b000 fe:00 1528 /system/lib64/libGLESv2.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9edf000-7007f9ee0000 r--s 00000000 fe:00 975 /system/usr/hyphen-data/hyph-or.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9ee0000-7007f9efe000 r--s 00000000 fe:00 63 /system/fonts/NotoNaskhArabicUI-Regular.ttf -Size: 120 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9efe000-7007f9f1b000 r--s 00000000 fe:00 202 /system/fonts/NotoNaskhArabic-Bold.ttf -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f1b000-7007f9f20000 r--p 00000000 fe:00 1104 /system/lib64/libziparchive.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 0 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007f9f20000-7007f9f26000 r-xp 00005000 fe:00 1104 /system/lib64/libziparchive.so -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 1 kB -Shared_Clean: 24 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd ex mr mw me -7007f9f26000-7007f9f27000 rw-p 0000b000 fe:00 1104 /system/lib64/libziparchive.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9f27000-7007f9f28000 r--p 0000c000 fe:00 1104 /system/lib64/libziparchive.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9f28000-7007f9f2c000 r--s 00000000 fe:00 280 /system/fonts/NotoSansThaana-Bold.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f2c000-7007f9f32000 r--s 00000000 fe:00 74 /system/fonts/NotoSerifGeorgian-Bold.ttf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f32000-7007f9f4f000 r--s 00000000 fe:00 122 /system/fonts/NotoNaskhArabic-Regular.ttf -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f4f000-7007f9f50000 r--p 00000000 fe:00 1709 /system/lib64/libETC1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007f9f50000-7007f9f52000 r-xp 00001000 fe:00 1709 /system/lib64/libETC1.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9f52000-7007f9f53000 rw-p 00003000 fe:00 1709 /system/lib64/libETC1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9f53000-7007f9f54000 r--p 00004000 fe:00 1709 /system/lib64/libETC1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9f54000-7007f9f5a000 r--s 00000000 fe:00 262 /system/fonts/NotoSerifGeorgian-Regular.ttf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f5a000-7007f9f5f000 r--s 00000000 fe:00 170 /system/fonts/NotoSansGeorgian-Bold.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f5f000-7007f9f64000 r--s 00000000 fe:00 290 /system/fonts/NotoSansGeorgian-Regular.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f64000-7007f9f69000 r--s 00000000 fe:00 68 /system/fonts/NotoSansThaiUI-Bold.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f69000-7007f9f6f000 r--s 00000000 fe:00 134 /system/fonts/NotoSansThaiUI-Regular.ttf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f6f000-7007f9f8c000 r--s 00000000 fe:00 222 /system/fonts/DancingScript-Bold.ttf -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f8c000-7007f9f8d000 r--p 00000000 fe:00 1663 /system/lib64/libstagefright_http_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007f9f8d000-7007f9f8f000 r-xp 00001000 fe:00 1663 /system/lib64/libstagefright_http_support.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007f9f8f000-7007f9f90000 rw-p 00003000 fe:00 1663 /system/lib64/libstagefright_http_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007f9f90000-7007f9f91000 r--p 00004000 fe:00 1663 /system/lib64/libstagefright_http_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007f9f91000-7007f9f92000 r--s 00000000 fe:00 1031 /system/usr/hyphen-data/hyph-mr.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f92000-7007f9f94000 r--s 00000000 fe:00 123 /system/fonts/NotoSansPhoenician-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9f94000-7007f9fb1000 r--s 00000000 fe:00 103 /system/fonts/DancingScript-Regular.ttf -Size: 116 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9fb1000-7007f9fcc000 r--s 00000000 fe:00 135 /system/fonts/DroidSansMono.ttf -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007f9fcc000-7007f9fe7000 r--p 00000000 fe:00 1230 /system/lib64/libdexfile.so -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 80 kB -Pss: 4 kB -Shared_Clean: 80 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 80 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007f9fe7000-7007fa014000 r-xp 0001b000 fe:00 1230 /system/lib64/libdexfile.so -Size: 180 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 176 kB -Pss: 9 kB -Shared_Clean: 176 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 176 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd ex mr mw me -7007fa014000-7007fa015000 rw-p 00048000 fe:00 1230 /system/lib64/libdexfile.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa015000-7007fa017000 r--p 00049000 fe:00 1230 /system/lib64/libdexfile.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa017000-7007fa01b000 r--s 00000000 fe:00 263 /system/fonts/NotoSansThaana-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa01b000-7007fa03b000 r--s 00000000 00:13 6728 /dev/__properties__/u:object_r:persist_debug_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr me ms -7007fa03b000-7007fa075000 r--s 00000000 07:08 18 /apex/com.android.tzdata/etc/icu/icu_tzdata.dat -Size: 232 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 204 kB -Pss: 24 kB -Shared_Clean: 204 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 204 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 24 kB -VmFlags: rd mr me ms -7007fa075000-7007fa077000 r--p 00000000 fe:00 1575 /system/lib64/libspeexresampler.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fa077000-7007fa07a000 r-xp 00002000 fe:00 1575 /system/lib64/libspeexresampler.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa07a000-7007fa07b000 rw-p 00005000 fe:00 1575 /system/lib64/libspeexresampler.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa07b000-7007fa07c000 r--p 00006000 fe:00 1575 /system/lib64/libspeexresampler.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa07c000-7007fa081000 r--s 00000000 fe:00 249 /system/fonts/NotoSerifThai-Bold.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa081000-7007fa09f000 r--s 001db000 fe:00 3224 /system/framework/ext.jar -Size: 120 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa09f000-7007fa0a7000 r--p 00000000 fe:00 1624 /system/lib64/libz.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 1 kB -Shared_Clean: 32 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 32 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007fa0a7000-7007fa0b7000 r-xp 00008000 fe:00 1624 /system/lib64/libz.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 5 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 5 kB -VmFlags: rd ex mr mw me -7007fa0b7000-7007fa0b8000 rw-p 00018000 fe:00 1624 /system/lib64/libz.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa0b8000-7007fa0b9000 r--p 00019000 fe:00 1624 /system/lib64/libz.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa0b9000-7007fa0ba000 r--s 00000000 fe:00 1015 /system/usr/hyphen-data/hyph-ml.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa0ba000-7007fa0bf000 r--s 00000000 fe:00 278 /system/fonts/NotoSerifThai-Regular.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa0bf000-7007fa0c4000 r--s 00000000 fe:00 243 /system/fonts/NotoSansThai-Bold.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa0c4000-7007fa0ca000 r--s 00000000 fe:00 128 /system/fonts/NotoSansThai-Regular.ttf -Size: 24 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa0ca000-7007fa0cf000 r--s 00000000 fe:00 279 /system/fonts/NotoSerifHebrew-Bold.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa0cf000-7007fa0ef000 r--s 00000000 00:13 6707 /dev/__properties__/u:object_r:exported2_default_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa0ef000-7007fa0f0000 r--p 00000000 fe:00 1574 /system/lib64/libpackagelistparser.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fa0f0000-7007fa0f1000 r-xp 00001000 fe:00 1574 /system/lib64/libpackagelistparser.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa0f1000-7007fa0f2000 rw-p 00002000 fe:00 1574 /system/lib64/libpackagelistparser.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa0f2000-7007fa0f3000 r--p 00003000 fe:00 1574 /system/lib64/libpackagelistparser.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa0f3000-7007fa0f6000 r--s 00000000 fe:00 207 /system/fonts/NotoSansOsage-Regular.ttf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa0f6000-7007fa100000 r--s 00000000 fe:00 164 /system/fonts/CarroisGothicSC-Regular.ttf -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa100000-7007fa101000 r--p 00000000 fe:00 1120 /system/lib64/android.hardware.media@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fa101000-7007fa102000 r-xp 00001000 fe:00 1120 /system/lib64/android.hardware.media@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa102000-7007fa103000 rw-p 00002000 fe:00 1120 /system/lib64/android.hardware.media@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa103000-7007fa104000 r--p 00003000 fe:00 1120 /system/lib64/android.hardware.media@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa104000-7007fa108000 r--s 00000000 fe:00 167 /system/fonts/NotoSerifArmenian-Bold.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa108000-7007fa10d000 r--s 00000000 fe:00 223 /system/fonts/NotoSerifHebrew-Regular.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa10d000-7007fa147000 r--s 00000000 07:08 18 /apex/com.android.tzdata/etc/icu/icu_tzdata.dat -Size: 232 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 2 kB -Shared_Clean: 44 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr me ms rr -7007fa147000-7007fa18a000 r--p 00000000 fe:00 1222 /system/lib64/libsonivox.so -Size: 268 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 10 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007fa18a000-7007fa19f000 r-xp 00043000 fe:00 1222 /system/lib64/libsonivox.so -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa19f000-7007fa1a0000 rw-p 00058000 fe:00 1222 /system/lib64/libsonivox.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa1a0000-7007fa1a1000 r--p 00059000 fe:00 1222 /system/lib64/libsonivox.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa1a1000-7007fa1a9000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa1a9000-7007fa1ad000 r--s 00000000 fe:00 148 /system/fonts/NotoSerifArmenian-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa1ad000-7007fa1b2000 r--s 00000000 fe:00 138 /system/fonts/NotoSansHebrew-Bold.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa1b2000-7007fa1d2000 r--s 00000000 00:13 6732 /dev/__properties__/u:object_r:radio_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa1d2000-7007fa1d3000 r--p 00000000 fe:00 1629 /system/lib64/libdexfile_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fa1d3000-7007fa1d4000 r-xp 00001000 fe:00 1629 /system/lib64/libdexfile_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa1d4000-7007fa1d5000 rw-p 00002000 fe:00 1629 /system/lib64/libdexfile_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa1d5000-7007fa1d6000 r--p 00003000 fe:00 1629 /system/lib64/libdexfile_support.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa1d6000-7007fa1da000 r--s 00000000 fe:00 104 /system/fonts/NotoSansArmenian-Bold.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa1da000-7007fa1df000 r--s 00000000 fe:00 158 /system/fonts/NotoSansHebrew-Regular.ttf -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa1df000-7007fa1ee000 r--s 00000000 fe:00 192 /system/fonts/ComingSoon.ttf -Size: 60 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa1ee000-7007fa20e000 rw-p 00000000 00:00 0 [anon:dalvik-LinearAlloc] -Name: [anon:dalvik-LinearAlloc] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 80 kB -Pss: 76 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 76 kB -Referenced: 76 kB -Anonymous: 80 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 76 kB -VmFlags: rd wr mr mw me ac -7007fa20e000-7007fa21e000 r--p 00000000 fe:00 1535 /system/lib64/libmemunreachable.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 56 kB -Pss: 9 kB -Shared_Clean: 56 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 56 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007fa21e000-7007fa239000 r-xp 00010000 fe:00 1535 /system/lib64/libmemunreachable.so -Size: 108 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 100 kB -Pss: 21 kB -Shared_Clean: 100 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 100 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 21 kB -VmFlags: rd ex mr mw me -7007fa239000-7007fa23a000 rw-p 0002b000 fe:00 1535 /system/lib64/libmemunreachable.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa23a000-7007fa23c000 r--p 0002c000 fe:00 1535 /system/lib64/libmemunreachable.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa23c000-7007fa23d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa23d000-7007fa24e000 r--s 00000000 fe:00 200 /system/fonts/CutiveMono.ttf -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa24e000-7007fa255000 r--p 00000000 fe:00 1174 /system/lib64/libmediaextractor.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 4 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007fa255000-7007fa25c000 r-xp 00007000 fe:00 1174 /system/lib64/libmediaextractor.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 9 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd ex mr mw me -7007fa25c000-7007fa25d000 rw-p 0000e000 fe:00 1174 /system/lib64/libmediaextractor.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa25d000-7007fa25e000 r--p 0000f000 fe:00 1174 /system/lib64/libmediaextractor.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa25e000-7007fa25f000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa25f000-7007fa263000 r--s 00000000 fe:00 255 /system/fonts/NotoSansArmenian-Regular.ttf -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa263000-7007fa264000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa264000-7007fa267000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa267000-7007fa268000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa269000-7007fa26b000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa26b000-7007fa26c000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa26c000-7007fa26f000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa26f000-7007fa270000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa270000-7007fa271000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007fa271000-7007fa279000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa279000-7007fa27a000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa27a000-7007fa27d000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa27d000-7007fa27e000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa27e000-7007fa27f000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007fa27f000-7007fa287000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa287000-7007fa292000 r--p 00000000 fe:00 1524 /system/lib64/android.hardware.graphics.allocator@2.0.so -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 4 kB -Shared_Clean: 44 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 44 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007fa292000-7007fa29c000 r-xp 0000b000 fe:00 1524 /system/lib64/android.hardware.graphics.allocator@2.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa29c000-7007fa29d000 rw-p 00015000 fe:00 1524 /system/lib64/android.hardware.graphics.allocator@2.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa29d000-7007fa29f000 r--p 00016000 fe:00 1524 /system/lib64/android.hardware.graphics.allocator@2.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa29f000-7007fa2a0000 r--s 00000000 fe:00 995 /system/usr/hyphen-data/hyph-la.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa2a0000-7007fa2a1000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa2a1000-7007fa2a3000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa2a4000-7007fa2a6000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa2a6000-7007fa2a7000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa2a7000-7007fa2aa000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa2aa000-7007fa2ab000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa2ab000-7007fa2ac000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007fa2ac000-7007fa2b4000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa2b4000-7007fa2b5000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa2b5000-7007fa2b8000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa2b8000-7007fa2b9000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fa2b9000-7007fa2ba000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007fa2ba000-7007fa2c2000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa2c2000-7007fa2ee000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 176 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa2ee000-7007fa2f2000 r--p 00000000 fe:00 1525 /system/lib64/libheif.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 4 kB -Shared_Clean: 16 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007fa2f2000-7007fa2f4000 r-xp 00004000 fe:00 1525 /system/lib64/libheif.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa2f4000-7007fa2f5000 rw-p 00006000 fe:00 1525 /system/lib64/libheif.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa2f5000-7007fa2f6000 r--p 00007000 fe:00 1525 /system/lib64/libheif.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa2f6000-7007fa2f7000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fa2f7000-7007fa317000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa317000-7007fa32a000 r--p 00000000 fe:00 1186 /system/lib64/libhwbinder.so -Size: 76 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 2 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -7007fa32a000-7007fa33b000 r-xp 00013000 fe:00 1186 /system/lib64/libhwbinder.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 68 kB -Pss: 2 kB -Shared_Clean: 68 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 68 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd ex mr mw me -7007fa33b000-7007fa33c000 rw-p 00024000 fe:00 1186 /system/lib64/libhwbinder.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa33c000-7007fa33e000 r--p 00025000 fe:00 1186 /system/lib64/libhwbinder.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa33e000-7007fa33f000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa33f000-7007fa340000 r--s 00000000 fe:00 968 /system/usr/hyphen-data/hyph-kn.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa340000-7007fa348000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa348000-7007fa36b000 r--p 00000000 fe:00 1698 /system/lib64/libunwindstack.so -Size: 140 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 6 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -7007fa36b000-7007fa39c000 r-xp 00023000 fe:00 1698 /system/lib64/libunwindstack.so -Size: 196 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa39c000-7007fa39d000 rw-p 00054000 fe:00 1698 /system/lib64/libunwindstack.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa39d000-7007fa3a4000 r--p 00055000 fe:00 1698 /system/lib64/libunwindstack.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 28 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 28 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007fa3a4000-7007fa3a5000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa3a5000-7007fa3a6000 r--s 00000000 fe:00 999 /system/usr/hyphen-data/hyph-hy.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa3a6000-7007fa3e2000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 240 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa3e2000-7007fa3e4000 r--p 00000000 fe:00 1236 /system/lib64/libaudiomanager.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 1 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007fa3e4000-7007fa3e5000 r-xp 00002000 fe:00 1236 /system/lib64/libaudiomanager.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa3e5000-7007fa3e6000 rw-p 00003000 fe:00 1236 /system/lib64/libaudiomanager.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa3e6000-7007fa3e7000 r--p 00004000 fe:00 1236 /system/lib64/libaudiomanager.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa3e7000-7007fa3e8000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa3e8000-7007fa420000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 224 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa420000-7007fa42d000 r--p 00000000 fe:00 1241 /system/lib64/libsensor.so -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 10 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007fa42d000-7007fa434000 r-xp 0000d000 fe:00 1241 /system/lib64/libsensor.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 9 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd ex mr mw me -7007fa434000-7007fa435000 rw-p 00014000 fe:00 1241 /system/lib64/libsensor.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa435000-7007fa438000 r--p 00015000 fe:00 1241 /system/lib64/libsensor.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa438000-7007fa439000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa439000-7007fa43b000 r--s 00000000 fe:00 82 /system/fonts/NotoSansOsmanya-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa43b000-7007fa477000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 240 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa477000-7007fa478000 r--p 00000000 fe:00 1182 /system/lib64/libgraphicsenv.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fa478000-7007fa479000 r-xp 00001000 fe:00 1182 /system/lib64/libgraphicsenv.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa479000-7007fa47a000 rw-p 00002000 fe:00 1182 /system/lib64/libgraphicsenv.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa47a000-7007fa47b000 r--p 00003000 fe:00 1182 /system/lib64/libgraphicsenv.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa47b000-7007fa47c000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd wr mr mw me ac -7007fa47c000-7007fa47d000 r--s 00000000 fe:00 993 /system/usr/hyphen-data/hyph-hr.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa47d000-7007fa485000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa485000-7007fa48c000 r--p 00000000 fe:00 1132 /system/lib64/liblog.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 0 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fa48c000-7007fa49d000 r-xp 00007000 fe:00 1132 /system/lib64/liblog.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 68 kB -Pss: 1 kB -Shared_Clean: 68 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 68 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd ex mr mw me -7007fa49d000-7007fa49e000 rw-p 00018000 fe:00 1132 /system/lib64/liblog.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa49e000-7007fa49f000 r--p 00019000 fe:00 1132 /system/lib64/liblog.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa49f000-7007fa4a0000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa4a0000-7007fa4d8000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 224 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa4d8000-7007fa4ec000 r--p 00000000 fe:00 1108 /system/lib64/libdrmframework.so -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 11 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 11 kB -VmFlags: rd mr mw me -7007fa4ec000-7007fa4f8000 r-xp 00014000 fe:00 1108 /system/lib64/libdrmframework.so -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 48 kB -Pss: 12 kB -Shared_Clean: 48 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd ex mr mw me -7007fa4f8000-7007fa4f9000 rw-p 00020000 fe:00 1108 /system/lib64/libdrmframework.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa4f9000-7007fa4fe000 r--p 00021000 fe:00 1108 /system/lib64/libdrmframework.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 20 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 20 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007fa4fe000-7007fa4ff000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa4ff000-7007fa527000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 160 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa527000-7007fa540000 r--p 00000000 fe:00 1577 /system/lib64/android.hardware.graphics.bufferqueue@1.0.so -Size: 100 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 9 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007fa540000-7007fa568000 r-xp 00019000 fe:00 1577 /system/lib64/android.hardware.graphics.bufferqueue@1.0.so -Size: 160 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa568000-7007fa569000 rw-p 00041000 fe:00 1577 /system/lib64/android.hardware.graphics.bufferqueue@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa569000-7007fa56d000 r--p 00042000 fe:00 1577 /system/lib64/android.hardware.graphics.bufferqueue@1.0.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa56d000-7007fa56f000 r--s 00000000 fe:00 58 /system/fonts/NotoSansOldTurkic-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa56f000-7007fa597000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 160 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa597000-7007fa59b000 r--p 00000000 fe:00 1619 /system/lib64/libnativehelper.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 3 kB -Shared_Clean: 16 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007fa59b000-7007fa59e000 r-xp 00004000 fe:00 1619 /system/lib64/libnativehelper.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa59e000-7007fa59f000 rw-p 00007000 fe:00 1619 /system/lib64/libnativehelper.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa59f000-7007fa5a0000 r--p 00008000 fe:00 1619 /system/lib64/libnativehelper.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa5a0000-7007fa5a1000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa5a1000-7007fa5a3000 r--s 00000000 fe:00 208 /system/fonts/NotoSansOldSouthArabian-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa5a3000-7007fa5c3000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa5c3000-7007fa5cc000 r--p 00000000 fe:00 1181 /system/lib64/libimg_utils.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 9 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 9 kB -VmFlags: rd mr mw me -7007fa5cc000-7007fa5d4000 r-xp 00009000 fe:00 1181 /system/lib64/libimg_utils.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa5d4000-7007fa5d5000 rw-p 00011000 fe:00 1181 /system/lib64/libimg_utils.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa5d5000-7007fa5d7000 r--p 00012000 fe:00 1181 /system/lib64/libimg_utils.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa5d7000-7007fa5d8000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa5d8000-7007fa5da000 r--s 00000000 fe:00 193 /system/fonts/NotoSansOldItalic-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa5da000-7007fa62e000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 336 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa62e000-7007fa630000 r--p 00000000 fe:00 1251 /system/lib64/libnetd_client.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fa630000-7007fa632000 r-xp 00002000 fe:00 1251 /system/lib64/libnetd_client.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa632000-7007fa633000 rw-p 00004000 fe:00 1251 /system/lib64/libnetd_client.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa633000-7007fa634000 r--p 00005000 fe:00 1251 /system/lib64/libnetd_client.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa634000-7007fa635000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa635000-7007fa636000 r--s 00000000 fe:00 1005 /system/usr/hyphen-data/hyph-hi.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa636000-7007fa64a000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa64a000-7007fa64b000 r--p 00000000 fe:00 1628 /system/lib64/android.hardware.graphics.common@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fa64b000-7007fa64c000 r-xp 00001000 fe:00 1628 /system/lib64/android.hardware.graphics.common@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa64c000-7007fa64d000 rw-p 00002000 fe:00 1628 /system/lib64/android.hardware.graphics.common@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa64d000-7007fa64e000 r--p 00003000 fe:00 1628 /system/lib64/android.hardware.graphics.common@1.1.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa64e000-7007fa696000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 288 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa696000-7007fa6e4000 r--p 00000000 fe:00 1194 /system/lib64/libgui.so -Size: 312 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 232 kB -Pss: 39 kB -Shared_Clean: 232 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 232 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 39 kB -VmFlags: rd mr mw me -7007fa6e4000-7007fa72c000 r-xp 0004e000 fe:00 1194 /system/lib64/libgui.so -Size: 288 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 288 kB -Pss: 49 kB -Shared_Clean: 288 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 288 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 49 kB -VmFlags: rd ex mr mw me -7007fa72c000-7007fa72d000 rw-p 00096000 fe:00 1194 /system/lib64/libgui.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa72d000-7007fa73e000 r--p 00097000 fe:00 1194 /system/lib64/libgui.so -Size: 68 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 68 kB -Pss: 3 kB -Shared_Clean: 0 kB -Shared_Dirty: 68 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 48 kB -Anonymous: 68 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me ac -7007fa73e000-7007fa73f000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa73f000-7007fa740000 r--s 00000000 fe:00 1004 /system/usr/hyphen-data/hyph-gu.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa740000-7007fa742000 r--s 00000000 fe:00 166 /system/fonts/NotoSansOlChiki-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa742000-7007fa74e000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa74e000-7007fa755000 r--p 00000000 fe:00 1726 /system/lib64/libGLESv1_CM.so -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 28 kB -Pss: 4 kB -Shared_Clean: 28 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 28 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me -7007fa755000-7007fa758000 r-xp 00007000 fe:00 1726 /system/lib64/libGLESv1_CM.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 3 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd ex mr mw me -7007fa758000-7007fa759000 rw-p 0000a000 fe:00 1726 /system/lib64/libGLESv1_CM.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa759000-7007fa75a000 r--p 0000b000 fe:00 1726 /system/lib64/libGLESv1_CM.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa75a000-7007fa75b000 r--s 00000000 fe:00 1011 /system/usr/hyphen-data/hyph-eu.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa75b000-7007fa75d000 r--s 00000000 fe:00 71 /system/fonts/NotoSansOgham-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa75d000-7007fa785000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 160 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa785000-7007fa78a000 r--p 00000000 fe:00 1207 /system/lib64/libcamera_metadata.so -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 2 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -7007fa78a000-7007fa78d000 r-xp 00005000 fe:00 1207 /system/lib64/libcamera_metadata.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa78d000-7007fa78f000 rw-p 00008000 fe:00 1207 /system/lib64/libcamera_metadata.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa78f000-7007fa790000 r--p 0000a000 fe:00 1207 /system/lib64/libcamera_metadata.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa790000-7007fa791000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa791000-7007fa793000 r--s 00000000 fe:00 88 /system/fonts/NotoSansLydian-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa793000-7007fa7db000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 288 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa7db000-7007fa806000 r--p 00000000 fe:00 1248 /system/lib64/libandroidfw.so -Size: 172 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 128 kB -Pss: 19 kB -Shared_Clean: 128 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 128 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 19 kB -VmFlags: rd mr mw me -7007fa806000-7007fa839000 r-xp 0002b000 fe:00 1248 /system/lib64/libandroidfw.so -Size: 204 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 200 kB -Pss: 11 kB -Shared_Clean: 200 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 200 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 11 kB -VmFlags: rd ex mr mw me -7007fa839000-7007fa83a000 rw-p 0005e000 fe:00 1248 /system/lib64/libandroidfw.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa83a000-7007fa83c000 r--p 0005f000 fe:00 1248 /system/lib64/libandroidfw.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa83c000-7007fa83d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa83d000-7007fa83e000 r--s 00000000 fe:00 1027 /system/usr/hyphen-data/hyph-bn.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa83e000-7007fa840000 r--s 00000000 fe:00 87 /system/fonts/NotoSansLycian-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa840000-7007fa85c000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa85c000-7007fa88b000 r--p 00000000 fe:00 1556 /system/lib64/android.hardware.media.omx@1.0.so -Size: 188 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 124 kB -Pss: 23 kB -Shared_Clean: 124 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 124 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 23 kB -VmFlags: rd mr mw me -7007fa88b000-7007fa8dd000 r-xp 0002f000 fe:00 1556 /system/lib64/android.hardware.media.omx@1.0.so -Size: 328 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 292 kB -Pss: 60 kB -Shared_Clean: 292 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 292 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 60 kB -VmFlags: rd ex mr mw me -7007fa8dd000-7007fa8de000 rw-p 00081000 fe:00 1556 /system/lib64/android.hardware.media.omx@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa8de000-7007fa8e6000 r--p 00082000 fe:00 1556 /system/lib64/android.hardware.media.omx@1.0.so -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 32 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 32 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 32 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me ac -7007fa8e6000-7007fa8e9000 r--s 00000000 fe:00 216 /system/fonts/NotoSansLimbu-Regular.ttf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa8e9000-7007fa919000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 192 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa919000-7007fa92b000 r--p 00000000 fe:00 1466 /system/lib64/libui.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 6 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd mr mw me -7007fa92b000-7007fa93d000 r-xp 00012000 fe:00 1466 /system/lib64/libui.so -Size: 72 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 6 kB -Shared_Clean: 52 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 52 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 6 kB -VmFlags: rd ex mr mw me -7007fa93d000-7007fa93e000 rw-p 00024000 fe:00 1466 /system/lib64/libui.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa93e000-7007fa93f000 r--p 00025000 fe:00 1466 /system/lib64/libui.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa93f000-7007fa940000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fa940000-7007fa94a000 r--p 00000000 fe:00 1667 /system/lib64/android.hardware.memtrack@1.0.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 10 kB -Shared_Clean: 40 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 10 kB -VmFlags: rd mr mw me -7007fa94a000-7007fa953000 r-xp 0000a000 fe:00 1667 /system/lib64/android.hardware.memtrack@1.0.so -Size: 36 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 36 kB -Pss: 18 kB -Shared_Clean: 36 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 36 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 18 kB -VmFlags: rd ex mr mw me -7007fa953000-7007fa954000 rw-p 00013000 fe:00 1667 /system/lib64/android.hardware.memtrack@1.0.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa954000-7007fa956000 r--p 00014000 fe:00 1667 /system/lib64/android.hardware.memtrack@1.0.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa956000-7007fa958000 r--s 00000000 fe:00 81 /system/fonts/NotoSansLisu-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa958000-7007fa9a0000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 288 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa9a0000-7007fa9aa000 r--p 00000000 fe:00 1654 /system/lib64/libbacktrace.so -Size: 40 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 3 kB -Shared_Clean: 40 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 40 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007fa9aa000-7007fa9ba000 r-xp 0000a000 fe:00 1654 /system/lib64/libbacktrace.so -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa9ba000-7007fa9bb000 rw-p 0001a000 fe:00 1654 /system/lib64/libbacktrace.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa9bb000-7007fa9bc000 r--p 0001b000 fe:00 1654 /system/lib64/libbacktrace.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa9bc000-7007fa9bd000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa9bd000-7007fa9d9000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa9d9000-7007fa9dd000 r--p 00000000 fe:00 1637 /system/lib64/libbpf.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 3 kB -Shared_Clean: 16 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 16 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007fa9dd000-7007fa9e1000 r-xp 00004000 fe:00 1637 /system/lib64/libbpf.so -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007fa9e1000-7007fa9e2000 rw-p 00008000 fe:00 1637 /system/lib64/libbpf.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fa9e2000-7007fa9e3000 r--p 00009000 fe:00 1637 /system/lib64/libbpf.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fa9e3000-7007fa9e4000 r--s 00000000 fe:00 966 /system/usr/hyphen-data/hyph-bg.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa9e4000-7007fa9e6000 r--s 00000000 fe:00 151 /system/fonts/NotoSansKayahLi-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fa9e6000-7007faa16000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 192 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faa16000-7007faa18000 r--p 00000000 fe:00 1465 /system/lib64/libbinderthreadstate.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007faa18000-7007faa1a000 r-xp 00002000 fe:00 1465 /system/lib64/libbinderthreadstate.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 0 kB -Shared_Clean: 8 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 8 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007faa1a000-7007faa1b000 rw-p 00004000 fe:00 1465 /system/lib64/libbinderthreadstate.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faa1b000-7007faa1c000 r--p 00005000 fe:00 1465 /system/lib64/libbinderthreadstate.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007faa1c000-7007faa1d000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007faa1d000-7007faa59000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 240 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faa59000-7007faa5c000 r--p 00000000 fe:00 1155 /system/lib64/libutilscallstack.so -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 1 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007faa5c000-7007faa5e000 r-xp 00003000 fe:00 1155 /system/lib64/libutilscallstack.so -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007faa5e000-7007faa5f000 rw-p 00005000 fe:00 1155 /system/lib64/libutilscallstack.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faa5f000-7007faa60000 r--p 00006000 fe:00 1155 /system/lib64/libutilscallstack.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007faa60000-7007faa61000 r--s 00000000 fe:00 990 /system/usr/hyphen-data/hyph-as.hyb -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faa61000-7007faa63000 r--s 00000000 fe:00 172 /system/fonts/NotoSansInscriptionalParthian-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faa63000-7007faa97000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 208 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faa97000-7007faaad000 r--p 00000000 fe:00 1540 /system/lib64/libRScpp.so -Size: 88 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 12 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd mr mw me -7007faaad000-7007faadb000 r-xp 00016000 fe:00 1540 /system/lib64/libRScpp.so -Size: 184 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me -7007faadb000-7007faadc000 rw-p 00044000 fe:00 1540 /system/lib64/libRScpp.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faadc000-7007faadd000 r--p 00045000 fe:00 1540 /system/lib64/libRScpp.so -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007faadd000-7007faade000 rw-p 00000000 00:00 0 [anon:.bss] -Name: [anon:.bss] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faade000-7007faaf2000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faaf2000-7007fab32000 rw-p 00000000 00:00 0 -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fab32000-7007fab33000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fab33000-7007fab36000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me ac -7007fab36000-7007fab37000 r--s 00046000 fe:00 1943 /system/priv-app/SettingsProvider/SettingsProvider.apk -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 4 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr me ms -7007fab37000-7007fab38000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fab38000-7007fab3a000 r--s 00000000 fe:00 286 /system/fonts/NotoSansInscriptionalPahlavi-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fab3a000-7007fab52000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 96 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fab52000-7007fab53000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fab53000-7007fab54000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fab54000-7007fab55000 rw-p 00000000 00:00 0 [anon:linker_alloc_lob] -Name: [anon:linker_alloc_lob] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fab55000-7007fab61000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fab61000-7007fab62000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fab62000-7007fab65000 r--s 00000000 fe:00 149 /system/fonts/NotoSansElbasan-Regular.otf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fab65000-7007fab8d000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 160 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fab8d000-7007fab8f000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fab8f000-7007fab93000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fab93000-7007fab94000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fab94000-7007fab95000 r--s 00000000 fe:30 18 /vendor/overlay/framework-res__auto_generated_rro.apk -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fab95000-7007fab99000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fab99000-7007fab9a000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fab9a000-7007fab9b000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fab9b000-7007fab9c000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fab9c000-7007fab9d000 r--s 00004000 fe:30 18 /vendor/overlay/framework-res__auto_generated_rro.apk -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fab9d000-7007fabad000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fabad000-7007fabae000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fabae000-7007fabd6000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 160 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fabd6000-7007fabd7000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fabd7000-7007fabda000 r--s 00000000 fe:00 229 /system/fonts/NotoSansDeseret-Regular.ttf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fabda000-7007fabee000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fabee000-7007fabef000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fabef000-7007fabf1000 r--s 00000000 fe:00 189 /system/fonts/NotoSansImperialAramaic-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fabf1000-7007fabfd000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fabfd000-7007fabfe000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fabfe000-7007fabff000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fabff000-7007fac37000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 224 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fac37000-7007fac39000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fac39000-7007fac3b000 r--s 00000000 fe:00 265 /system/fonts/NotoSansHanunoo-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fac3b000-7007fac57000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fac57000-7007fac58000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fac58000-7007fac5a000 r--s 00000000 fe:00 98 /system/fonts/NotoSansGothic-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fac5a000-7007fac8e000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 208 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fac8e000-7007fac8f000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fac8f000-7007fac91000 r--s 00000000 fe:00 114 /system/fonts/NotoSansCypriot-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fac91000-7007faca1000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faca1000-7007faca2000 r--p 00000000 00:00 0 [anon:atexit handlers] -Name: [anon:atexit handlers] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007faca2000-7007faca3000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007faca3000-7007faca4000 r--s 00000000 fe:10 237571 /data/resource-cache/vendor@overlay@framework-res__auto_generated_rro.apk@idmap -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faca4000-7007faca6000 r--s 00000000 fe:00 61 /system/fonts/NotoSansCarian-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faca6000-7007facb6000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007facb6000-7007facb7000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007facb7000-7007facc7000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007facc7000-7007facc8000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007facc8000-7007facca000 r--s 00000000 fe:00 102 /system/fonts/NotoSansBuhid-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007facca000-7007facce000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007facce000-7007faccf000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007faccf000-7007face3000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007face3000-7007face4000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007face4000-7007face6000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -7007face6000-7007face8000 r--s 00000000 fe:00 155 /system/fonts/NotoSansBuginese-Regular.ttf -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007face8000-7007fad3c000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 336 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fad3c000-7007fad3d000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fad3d000-7007fad6d000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 192 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fad6d000-7007fad6e000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fad6e000-7007fad8a000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fad8a000-7007fad8b000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fad8b000-7007fad8c000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fad8c000-7007fada8000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fada8000-7007fada9000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fada9000-7007fadac000 r--s 00000000 fe:00 276 /system/fonts/NotoSansAvestan-Regular.ttf -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fadac000-7007fadc0000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fadc0000-7007fadc1000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fadc1000-7007fadd1000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fadd1000-7007fadd2000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fadd2000-7007fadd3000 r--s 00000000 fe:00 3210 /system/framework/android.test.base.impl.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fadd3000-7007fade7000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fade7000-7007fade8000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fade8000-7007fade9000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fade9000-7007fadea000 r--s 00000000 fe:00 3394 /system/framework/framework-oahl-backward-compatibility.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fadea000-7007fae22000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 224 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fae22000-7007fae23000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fae23000-7007fae24000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fae24000-7007fae3c000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 96 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fae3c000-7007fae3d000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fae3d000-7007fae3e000 r--s 00000000 fe:00 3144 /system/framework/ims-common.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fae3e000-7007fae3f000 r--s 00000000 fe:00 3155 /system/framework/voip-common.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fae3f000-7007fae43000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fae43000-7007fae44000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fae44000-7007fae45000 r--s 00000000 fe:00 3395 /system/framework/telephony-common.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fae45000-7007fae46000 r--s 00000000 fe:00 3158 /system/framework/framework.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fae46000-7007fae47000 r--s 00004000 fe:00 3208 /system/framework/apache-xml.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fae47000-7007fae4b000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fae4b000-7007fae4c000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fae4c000-7007fae7c000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 192 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fae7c000-7007faebc000 rw-p 00000000 00:00 0 [anon:dalvik-mark stack] -Name: [anon:dalvik-mark stack] -Size: 256 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faebc000-7007faebd000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007faebd000-7007faebe000 r--s 00000000 fe:00 3153 /system/framework/bouncycastle.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faebe000-7007faeca000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faeca000-7007faecb000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faecb000-7007faecc000 r--s 00000000 fe:00 3151 /system/framework/okhttp.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faecc000-7007faecd000 r--s 00000000 fe:00 3349 /system/framework/conscrypt.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faecd000-7007faed5000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faed5000-7007faed6000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007faed6000-7007faeda000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faeda000-7007faefa000 rw-p 00000000 00:00 0 [anon:dalvik-large marked objects] -Name: [anon:dalvik-large marked objects] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007faefa000-7007faf1a000 rw-p 00000000 00:00 0 [anon:dalvik-large live objects] -Name: [anon:dalvik-large live objects] -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faf1a000-7007faf3a000 r--s 00000000 00:13 6709 /dev/__properties__/u:object_r:fingerprint_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 1 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr me ms -7007faf3a000-7007faf5a000 r--s 00000000 00:13 6747 /dev/__properties__/u:object_r:vold_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faf5a000-7007faf5b000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007faf5b000-7007faf5c000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faf5c000-7007faf78000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 112 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faf78000-7007faf98000 r--s 00000000 00:13 6678 /dev/__properties__/u:object_r:config_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faf98000-7007faf99000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faf99000-7007faf9a000 r--s 00000000 fe:00 3157 /system/framework/core-simple.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faf9a000-7007faf9c000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faf9c000-7007fafb0000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fafb0000-7007fafb1000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fafb1000-7007fafb3000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fafb3000-7007fafb7000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fafb7000-7007fafd7000 r--s 00000000 00:13 6696 /dev/__properties__/u:object_r:dalvik_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fafd7000-7007fafd8000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fafd8000-7007fafd9000 r--s 00004000 fe:00 3162 /system/framework/core-libart.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fafd9000-7007fafdb000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fafdb000-7007fafe7000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fafe7000-7007fafe8000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fafe8000-7007faff8000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faff8000-7007faff9000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faff9000-7007faffa000 r--s 00007000 fe:00 3215 /system/framework/core-oj.jar -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007faffa000-7007faffc000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007faffc000-7007fb014000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 96 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb014000-7007fb034000 r--s 00000000 00:13 6740 /dev/__properties__/u:object_r:system_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb034000-7007fb036000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -7007fb036000-7007fb042000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb042000-7007fb043000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb043000-7007fb044000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fb044000-7007fb045000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fb045000-7007fb046000 rw-p 00000000 00:00 0 [anon:dalvik-mod union bitmap] -Name: [anon:dalvik-mod union bitmap] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fb046000-7007fb05a000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 80 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb05a000-7007fb07a000 r--s 00000000 00:13 6717 /dev/__properties__/u:object_r:log_tag_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb07a000-7007fb07b000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb07b000-7007fb07c000 r--p 00000000 00:00 0 [anon:atexit handlers] -Name: [anon:atexit handlers] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fb07c000-7007fb07e000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fb07e000-7007fb093000 r--p 00af1000 fe:00 3165 /system/framework/x86_64/boot-framework.art -Size: 84 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 64 kB -Pss: 3 kB -Shared_Clean: 64 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 64 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 3 kB -VmFlags: rd mr mw me -7007fb093000-7007fb094000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fb094000-7007fb095000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fb095000-7007fb0a5000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 64 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb0a5000-7007fb0c5000 r--s 00000000 00:13 6718 /dev/__properties__/u:object_r:logd_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb0c5000-7007fb0c6000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb0c6000-7007fb0c7000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fb0c7000-7007fb0c9000 rw-p 00000000 00:00 0 [anon:dalvik-concurrent copying sweep array free buffer] -Name: [anon:dalvik-concurrent copying sweep array free buffer] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb0c9000-7007fb0d5000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 48 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb0d5000-7007fb0d6000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fb0d6000-7007fb0de000 rw-p 00000000 00:00 0 [anon:dalvik-thread local mark stack] -Name: [anon:dalvik-thread local mark stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb0de000-7007fb0fe000 r--s 00000000 00:13 6712 /dev/__properties__/u:object_r:heapprofd_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb0fe000-7007fb11e000 r--s 00000000 00:13 6699 /dev/__properties__/u:object_r:default_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 24 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 24 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 24 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb11e000-7007fb11f000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb11f000-7007fb121000 rw-p 00000000 00:00 0 [anon:dalvik-concurrent copying sweep array free buffer] -Name: [anon:dalvik-concurrent copying sweep array free buffer] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb121000-7007fb123000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -7007fb123000-7007fb124000 r--p 00006000 fe:00 3170 /system/framework/x86_64/boot-android.test.base.impl.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb124000-7007fb125000 r--p 00002000 fe:00 3201 /system/framework/x86_64/boot-framework-oahl-backward-compatibility.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb125000-7007fb126000 r--p 0001c000 fe:00 3176 /system/framework/x86_64/boot-ims-common.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb126000-7007fb127000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fb127000-7007fb128000 r--p 00011000 fe:00 3198 /system/framework/x86_64/boot-voip-common.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb128000-7007fb12b000 r--p 00116000 fe:00 3178 /system/framework/x86_64/boot-telephony-common.art -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb12b000-7007fb12c000 r--p 0004d000 fe:00 3196 /system/framework/x86_64/boot-ext.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb12c000-7007fb12e000 r--p 00067000 fe:00 3167 /system/framework/x86_64/boot-apache-xml.art -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb12e000-7007fb12f000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fb12f000-7007fb130000 r--p 00068000 fe:00 3175 /system/framework/x86_64/boot-bouncycastle.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb130000-7007fb131000 r--p 0003d000 fe:00 3166 /system/framework/x86_64/boot-okhttp.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 2 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me -7007fb131000-7007fb132000 r--p 00040000 fe:00 3168 /system/framework/x86_64/boot-conscrypt.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb132000-7007fb137000 r--p 002d1000 fe:00 3184 /system/framework/x86_64/boot.art -Size: 20 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 20 kB -Pss: 1 kB -Shared_Clean: 20 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 20 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me -7007fb137000-7007fb13e000 rw-p 00000000 fe:00 944 /system/etc/event-log-tags -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb13e000-7007fb140000 rw-p 00000000 00:00 0 [anon:dalvik-indirect ref table] -Name: [anon:dalvik-indirect ref table] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb140000-7007fb141000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fb141000-7007fb144000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb144000-7007fb145000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fb145000-7007fb165000 r--s 00000000 00:13 6697 /dev/__properties__/u:object_r:debug_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb165000-7007fb166000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb166000-7007fb167000 r--p 00001000 fe:00 3197 /system/framework/x86_64/boot-core-simple.art -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb167000-7007fb16a000 r--p 00132000 fe:00 3174 /system/framework/x86_64/boot-core-libart.art -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 12 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me -7007fb16a000-7007fb16b000 r--s 00000000 00:13 6990 /dev/event-log-tags -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb16b000-7007fb16c000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fb16c000-7007fb170000 r--p 00000000 00:00 0 [anon:atexit handlers] -Name: [anon:atexit handlers] -Size: 16 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 16 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 16 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fb170000-7007fb190000 r--s 00000000 00:13 6750 /dev/__properties__/properties_serial -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb190000-7007fb191000 rw-p 00000000 00:00 0 [anon:System property context nodes] -Name: [anon:System property context nodes] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fb191000-7007fb194000 r--s 00000000 00:13 6672 /dev/__properties__/property_info -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb194000-7007fb195000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fb195000-7007fb196000 rw-p 00000000 00:00 0 [anon:arc4random data] -Name: [anon:arc4random data] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb196000-7007fb197000 rw-p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb197000-7007fb198000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fb198000-7007fb1a5000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 52 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 52 kB -Pss: 36 kB -Shared_Clean: 0 kB -Shared_Dirty: 16 kB -Private_Clean: 0 kB -Private_Dirty: 36 kB -Referenced: 48 kB -Anonymous: 52 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 36 kB -VmFlags: rd wr mr mw me ac -7007fb1a5000-7007fb1c5000 r--s 00000000 00:13 6699 /dev/__properties__/u:object_r:default_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb1c5000-7007fb1c7000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd mr mw me ac -7007fb1c7000-7007fb1c8000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fb1c8000-7007fb1e8000 r--s 00000000 00:13 6697 /dev/__properties__/u:object_r:debug_prop:s0 -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb1e8000-7007fb1e9000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fb1e9000-7007fb1ea000 rw-p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb1ea000-7007fb1eb000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fb1eb000-7007fb20b000 r--s 00000000 00:13 6750 /dev/__properties__/properties_serial -Size: 128 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb20b000-7007fb20c000 rw-p 00000000 00:00 0 [anon:System property context nodes] -Name: [anon:System property context nodes] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb20c000-7007fb20f000 r--s 00000000 00:13 6672 /dev/__properties__/property_info -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 12 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr me ms -7007fb20f000-7007fb210000 r--p 00000000 00:00 0 [anon:linker_alloc] -Name: [anon:linker_alloc] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd mr mw me ac -7007fb210000-7007fb212000 rw-p 00000000 00:00 0 [anon:linker_alloc_small_objects] -Name: [anon:linker_alloc_small_objects] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 8 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 8 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007fb212000-7007fb213000 r--p 00000000 00:00 0 [anon:atexit handlers] -Name: [anon:atexit handlers] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fb213000-7007fb214000 ---p 00000000 00:00 0 [anon:thread signal stack guard] -Name: [anon:thread signal stack guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me ac -7007fb214000-7007fb21c000 rw-p 00000000 00:00 0 [anon:thread signal stack] -Name: [anon:thread signal stack] -Size: 32 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd wr mr mw me ac -7007fb21c000-7007fb21d000 rw-p 00000000 00:00 0 [anon:arc4random data] -Name: [anon:arc4random data] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me ac -7007fb21d000-7007fb21e000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fb21e000-7007fb221000 rw-p 00000000 00:00 0 [anon:bionic TLS] -Name: [anon:bionic TLS] -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007fb221000-7007fb222000 ---p 00000000 00:00 0 [anon:bionic TLS guard] -Name: [anon:bionic TLS guard] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me -7007fb222000-7007fb267000 r--p 00000000 fe:00 312 /system/bin/linker64 -Size: 276 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 116 kB -Pss: 1 kB -Shared_Clean: 116 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 116 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1 kB -VmFlags: rd mr mw me dw -7007fb267000-7007fb355000 r-xp 00045000 fe:00 312 /system/bin/linker64 -Size: 952 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 496 kB -Pss: 7 kB -Shared_Clean: 496 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 496 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 7 kB -VmFlags: rd ex mr mw me dw -7007fb355000-7007fb356000 rw-p 00133000 fe:00 312 /system/bin/linker64 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 4 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 4 kB -Referenced: 4 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 4 kB -VmFlags: rd wr mr mw me dw ac -7007fb356000-7007fb361000 r--p 00134000 fe:00 312 /system/bin/linker64 -Size: 44 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 44 kB -Pss: 2 kB -Shared_Clean: 0 kB -Shared_Dirty: 44 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 12 kB -Anonymous: 44 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2 kB -VmFlags: rd mr mw me dw ac -7007fb361000-7007fb368000 rw-p 00000000 00:00 0 -Size: 28 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 8 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 8 kB -Referenced: 8 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 8 kB -VmFlags: rd wr mr mw me ac -7007fb368000-7007fb369000 r--p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 4 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 4 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr mw me ac -7007fb369000-7007fb36c000 rw-p 00000000 00:00 0 -Size: 12 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 12 kB -Pss: 12 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 12 kB -Referenced: 12 kB -Anonymous: 12 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 12 kB -VmFlags: rd wr mr mw me ac -7ffde4f08000-7ffde4f09000 ---p 00000000 00:00 0 -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: mr mw me gd ac -7ffde4f09000-7ffde5708000 rw-p 00000000 00:00 0 [stack] -Size: 8188 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 40 kB -Pss: 32 kB -Shared_Clean: 0 kB -Shared_Dirty: 8 kB -Private_Clean: 0 kB -Private_Dirty: 32 kB -Referenced: 36 kB -Anonymous: 40 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 32 kB -VmFlags: rd wr mr mw me gd ac -7ffde5771000-7ffde5773000 r--p 00000000 00:00 0 [vvar] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd mr pf io de dd -7ffde5773000-7ffde5775000 r-xp 00000000 00:00 0 [vdso] -Size: 8 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4 kB -Pss: 0 kB -Shared_Clean: 4 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex mr mw me de -ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex diff --git a/libmeminfo/testdata1/smaps_short b/libmeminfo/testdata1/smaps_short deleted file mode 100644 index cee67b384..000000000 --- a/libmeminfo/testdata1/smaps_short +++ /dev/null @@ -1,122 +0,0 @@ -54c00000-56c00000 r-xp 00000000 00:00 0 [anon:dalvik-zygote-jit-code-cache] -Name: [anon:dalvik-zygote-jit-code-cache] -Size: 32768 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 2048 kB -Pss: 113 kB -Shared_Clean: 0 kB -Shared_Dirty: 2048 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 2048 kB -Anonymous: 2048 kB -AnonHugePages: 2048 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 113 kB -VmFlags: rd ex mr mw me ac -701ea000-70cdb000 rw-p 00000000 fe:00 3165 /system/framework/x86_64/boot-framework.art -Size: 11204 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 11188 kB -Pss: 2200 kB -Shared_Clean: 80 kB -Shared_Dirty: 9448 kB -Private_Clean: 0 kB -Private_Dirty: 1660 kB -Referenced: 9892 kB -Anonymous: 11108 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 2200 kB -VmFlags: rd wr mr mw me ac -70074dd8d000-70074ee0d000 rw-p 00000000 00:00 0 [anon:libc_malloc] -Name: [anon:libc_malloc] -Size: 16896 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 15272 kB -Pss: 15272 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 15272 kB -Referenced: 11156 kB -Anonymous: 15272 kB -AnonHugePages: 6144 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 15272 kB -VmFlags: rd wr mr mw me ac -700755a2d000-700755a6e000 r-xp 00016000 fe:00 1947 /system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex -Size: 260 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 260 kB -Pss: 260 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 260 kB -Private_Dirty: 0 kB -Referenced: 260 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 260 kB -VmFlags: rd ex mr mw me -7007f85b0000-7007f8b9b000 r-xp 001ee000 fe:00 1537 /system/lib64/libhwui.so -Size: 6060 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 4132 kB -Pss: 1274 kB -Shared_Clean: 4132 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 4132 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 1274 kB -VmFlags: rd ex mr mw me -ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] -Size: 4 kB -KernelPageSize: 4 kB -MMUPageSize: 4 kB -Rss: 0 kB -Pss: 0 kB -Shared_Clean: 0 kB -Shared_Dirty: 0 kB -Private_Clean: 0 kB -Private_Dirty: 0 kB -Referenced: 0 kB -Anonymous: 0 kB -AnonHugePages: 0 kB -ShmemPmdMapped: 0 kB -Shared_Hugetlb: 0 kB -Private_Hugetlb: 0 kB -Swap: 0 kB -SwapPss: 0 kB -Locked: 0 kB -VmFlags: rd ex diff --git a/libmeminfo/testdata1/vmallocinfo b/libmeminfo/testdata1/vmallocinfo deleted file mode 100644 index d48d8bf1b..000000000 --- a/libmeminfo/testdata1/vmallocinfo +++ /dev/null @@ -1,1774 +0,0 @@ -0x0000000000000000-0x0000000000000000 69632 of_iomap+0x78/0xb0 phys=17a00000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=b220000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17c90000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17ca0000 ioremap -0x0000000000000000-0x0000000000000000 266240 atomic_pool_init+0x0/0x200 user -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=146bf000 ioremap -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=146bf000 ioremap -0x0000000000000000-0x0000000000000000 28672 devm_ioremap_resource+0xd8/0x194 phys=8c0000 ioremap -0x0000000000000000-0x0000000000000000 28672 devm_ioremap_resource+0xd8/0x194 phys=ac0000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=146bf000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=c264000 ioremap -0x0000000000000000-0x0000000000000000 12288 devm_ioremap_resource+0xd8/0x194 phys=c440000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17980000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 glink_mailbox_probe+0x55c/0xac4 phys=1885000 ioremap -0x0000000000000000-0x0000000000000000 159744 devm_ioremap_resource+0xd8/0x194 phys=c40a000 ioremap -0x0000000000000000-0x0000000000000000 73728 msm_watchdog_probe+0x5b8/0xc24 user -0x0000000000000000-0x0000000000000000 73728 msm_watchdog_probe+0x5b8/0xc24 user -0x0000000000000000-0x0000000000000000 73728 msm_watchdog_probe+0x5b8/0xc24 user -0x0000000000000000-0x0000000000000000 73728 msm_watchdog_probe+0x5b8/0xc24 user -0x0000000000000000-0x0000000000000000 36864 remote_spinlock_init_address+0x1c8/0x224 phys=1f40000 ioremap -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 8192 glink_mailbox_probe+0x634/0xac4 phys=1886000 ioremap -0x0000000000000000-0x0000000000000000 1052672 of_iomap+0x78/0xb0 phys=17a60000 ioremap -0x0000000000000000-0x0000000000000000 73728 msm_watchdog_probe+0x5b8/0xc24 user -0x0000000000000000-0x0000000000000000 73728 msm_watchdog_probe+0x5b8/0xc24 user -0x0000000000000000-0x0000000000000000 73728 msm_watchdog_probe+0x5b8/0xc24 user -0x0000000000000000-0x0000000000000000 73728 msm_watchdog_probe+0x5b8/0xc24 user -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=17990000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=179e0000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=af20000 ioremap -0x0000000000000000-0x0000000000000000 32768 msm_smem_probe+0x56c/0xdf0 phys=778000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap_resource+0xd8/0x194 phys=179e0000 ioremap -0x0000000000000000-0x0000000000000000 8192 glink_smem_native_probe+0x42c/0x934 phys=17990000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap_resource+0xd8/0x194 phys=af21000 ioremap -0x0000000000000000-0x0000000000000000 8192 glink_smem_native_probe+0x42c/0x934 phys=17990000 ioremap -0x0000000000000000-0x0000000000000000 8192 glink_smem_native_probe+0x42c/0x934 phys=17990000 ioremap -0x0000000000000000-0x0000000000000000 8192 glink_smem_native_probe+0x42c/0x934 phys=17990000 ioremap -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=85fe0000 ioremap -0x0000000000000000-0x0000000000000000 40960 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 167936 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 69632 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 69632 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 40960 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 8192 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 8192 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 8192 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 8192 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 8192 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=ff1000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=16b000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=18d000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=175000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=177000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=10f000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=110000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d000 ioremap -0x0000000000000000-0x0000000000000000 1052672 devm_ioremap_resource+0xd8/0x194 phys=e600000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=ad06000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=ad09000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=ad0a000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=ad07000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=ad08000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=ad0b000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=af03000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=5091000 ioremap -0x0000000000000000-0x0000000000000000 8192 syscon_node_to_regmap+0x198/0x2dc phys=5091000 ioremap -0x0000000000000000-0x0000000000000000 8192 syscon_node_to_regmap+0x198/0x2dc phys=5091000 ioremap -0x0000000000000000-0x0000000000000000 8192 syscon_node_to_regmap+0x198/0x2dc phys=5091000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=ab00000 ioremap -0x0000000000000000-0x0000000000000000 135168 _persistent_ram_buffer_map+0x1ec/0x238 phys=a1810000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=ab00000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=ab00000 ioremap -0x0000000000000000-0x0000000000000000 12288 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=150c2000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c5000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c2000 ioremap -0x0000000000000000-0x0000000000000000 40960 devm_ioremap+0x84/0xd8 phys=5090000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c9000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c2000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150cd000 ioremap -0x0000000000000000-0x0000000000000000 135168 _persistent_ram_buffer_map+0x1ec/0x238 phys=a1830000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c2000 ioremap -0x0000000000000000-0x0000000000000000 20480 msm_bus_noc_qos_init+0x94/0x714 phys=10b8000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150d1000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c2000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150d5000 ioremap -0x0000000000000000-0x0000000000000000 40960 devm_ioremap_resource+0xd8/0x194 phys=5090000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c2000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150d9000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c2000 ioremap -0x0000000000000000-0x0000000000000000 135168 _persistent_ram_buffer_map+0x1ec/0x238 phys=a1850000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150dd000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c2000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150e1000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=150c2000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=c222000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=c263000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=c223000 ioremap -0x0000000000000000-0x0000000000000000 69632 devm_ioremap_resource+0xd8/0x194 phys=ad00000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=c265000 ioremap -0x0000000000000000-0x0000000000000000 12288 devm_ioremap+0x84/0xd8 phys=1c08000 ioremap -0x0000000000000000-0x0000000000000000 12288 devm_ioremap+0x84/0xd8 phys=1c0a000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=40000000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=40000000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=5091000 ioremap -0x0000000000000000-0x0000000000000000 12288 devm_ioremap+0x84/0xd8 phys=17d41000 ioremap -0x0000000000000000-0x0000000000000000 12288 devm_ioremap+0x84/0xd8 phys=17d43000 ioremap -0x0000000000000000-0x0000000000000000 12288 devm_ioremap+0x84/0xd8 phys=17d45000 ioremap -0x0000000000000000-0x0000000000000000 8192 syscon_node_to_regmap+0x198/0x2dc phys=17970000 ioremap -0x0000000000000000-0x0000000000000000 659456 devm_ioremap_resource+0xd8/0x194 phys=e700000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x208/0x77c phys=ae94000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x360/0x77c phys=ae94000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x4f0/0x77c phys=af03000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x208/0x77c phys=ae96000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x360/0x77c phys=ae96000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x4f0/0x77c phys=af03000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x208/0x77c phys=88ea000 ioremap -0x0000000000000000-0x0000000000000000 40960 syscon_node_to_regmap+0x198/0x2dc phys=5090000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x360/0x77c phys=88ea000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x428/0x77c phys=88ea000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x48c/0x77c phys=88ea000 ioremap -0x0000000000000000-0x0000000000000000 135168 _persistent_ram_buffer_map+0x1ec/0x238 phys=a1870000 ioremap -0x0000000000000000-0x0000000000000000 8192 mdss_pll_probe+0x4f0/0x77c phys=af03000 ioremap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=1d87000 ioremap -0x0000000000000000-0x0000000000000000 12288 pcpu_alloc+0x3e8/0x9e4 pages=2 vmalloc -0x0000000000000000-0x0000000000000000 12288 devm_ioremap_resource+0xd8/0x194 phys=88e0000 ioremap -0x0000000000000000-0x0000000000000000 8192 msm_smp2p_probe+0xb0/0x3b0 phys=17990000 ioremap -0x0000000000000000-0x0000000000000000 8192 msm_smp2p_probe+0xb0/0x3b0 phys=17990000 ioremap -0x0000000000000000-0x0000000000000000 8192 msm_smp2p_probe+0xb0/0x3b0 phys=17990000 ioremap -0x0000000000000000-0x0000000000000000 8192 msm_smp2p_probe+0xb0/0x3b0 phys=17990000 ioremap -0x0000000000000000-0x0000000000000000 8192 msm_pil_init+0xe4/0x250 phys=146bf000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=1881000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=1881000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=1881000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=1881000 ioremap -0x0000000000000000-0x0000000000000000 2101248 msm_smem_probe+0x23c/0xdf0 phys=86000000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=1882000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 69632 devm_ioremap_resource+0xd8/0x194 phys=af00000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=b221000 ioremap -0x0000000000000000-0x0000000000000000 8192 qsee_ipc_irq_bridge_probe+0x414/0xb0c phys=1888000 ioremap -0x0000000000000000-0x0000000000000000 8192 msm_rng_probe+0x90/0x4a8 phys=793000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=ae94000 ioremap -0x0000000000000000-0x0000000000000000 69632 devm_ioremap_resource+0xd8/0x194 phys=ab00000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=ae96000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap+0x84/0xd8 phys=898000 ioremap -0x0000000000000000-0x0000000000000000 24576 diag_dci_init+0x25c/0x35c pages=5 vmalloc -0x0000000000000000-0x0000000000000000 69632 devm_ioremap_resource+0xd8/0x194 phys=5040000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=ae94000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap+0x84/0xd8 phys=a84000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=af08000 ioremap -0x0000000000000000-0x0000000000000000 20480 msm_dss_ioremap_byname+0x84/0x134 phys=af30000 ioremap -0x0000000000000000-0x0000000000000000 12288 msm_dss_ioremap_byname+0x84/0x134 phys=af20000 ioremap -0x0000000000000000-0x0000000000000000 20480 alloc_and_map+0xb0/0x1cc user -0x0000000000000000-0x0000000000000000 20480 alloc_and_map+0xb0/0x1cc user -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=16e0000 ioremap -0x0000000000000000-0x0000000000000000 8192 kgsl_sharedmem_alloc_contig+0xc4/0x1f8 user -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 16384 devm_ioremap_resource+0xd8/0x194 phys=1d84000 ioremap -0x0000000000000000-0x0000000000000000 69632 syscon_node_to_regmap+0x198/0x2dc phys=af00000 ioremap -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 12288 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 16384 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 20480 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 dmam_alloc_coherent+0xb0/0x11c user -0x0000000000000000-0x0000000000000000 8192 dmam_alloc_coherent+0xb0/0x11c user -0x0000000000000000-0x0000000000000000 1052672 devm_ioremap_nocache+0x84/0xd8 phys=c300000 ioremap -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=5061000 ioremap -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 69632 syscon_node_to_regmap+0x198/0x2dc phys=ab00000 ioremap -0x0000000000000000-0x0000000000000000 65536 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1700000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 msm_slim_sps_mem_alloc+0xb8/0x130 user -0x0000000000000000-0x0000000000000000 8192 msm_slim_sps_mem_alloc+0xb8/0x130 user -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 16384 devm_ioremap_nocache+0x84/0xd8 phys=88e8000 ioremap -0x0000000000000000-0x0000000000000000 69632 syscon_node_to_regmap+0x198/0x2dc phys=ad00000 ioremap -0x0000000000000000-0x0000000000000000 8192 msm_slim_sps_mem_alloc+0xb8/0x130 user -0x0000000000000000-0x0000000000000000 8192 msm_slim_sps_mem_alloc+0xb8/0x130 user -0x0000000000000000-0x0000000000000000 65536 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 20480 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=88e2000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=780000 ioremap -0x0000000000000000-0x0000000000000000 217088 ipa3_pre_init+0x984/0x20c4 phys=1e40000 ioremap -0x0000000000000000-0x0000000000000000 20480 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=88e7000 ioremap -0x0000000000000000-0x0000000000000000 1052672 _persistent_ram_buffer_map+0x1ec/0x238 phys=a1890000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 msm_slim_sps_mem_alloc+0xb8/0x130 user -0x0000000000000000-0x0000000000000000 8192 msm_slim_sps_mem_alloc+0xb8/0x130 user -0x0000000000000000-0x0000000000000000 8192 msm_slim_sps_mem_alloc+0xb8/0x130 user -0x0000000000000000-0x0000000000000000 8192 msm_slim_sps_mem_alloc+0xb8/0x130 user -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 528384 _persistent_ram_buffer_map+0x1ec/0x238 phys=a1990000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 40960 qce_sps_init_ep_conn+0x168/0x348 user -0x0000000000000000-0x0000000000000000 77824 sps_bam_pipe_set_params+0x1e4/0x4c8 pages=18 vmalloc -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1620000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 40960 qce_sps_init_ep_conn+0x168/0x348 user -0x0000000000000000-0x0000000000000000 40960 qce_sps_init_ep_conn+0x168/0x348 user -0x0000000000000000-0x0000000000000000 20480 devm_ioremap+0x84/0xd8 phys=880000 ioremap -0x0000000000000000-0x0000000000000000 2035712 devm_ioremap_resource+0xd8/0x194 phys=100000 ioremap -0x0000000000000000-0x0000000000000000 40960 qce_sps_init_ep_conn+0x168/0x348 user -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=a6f8000 ioremap -0x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=146bf000 ioremap -0x0000000000000000-0x0000000000000000 12587008 devm_ioremap_resource+0xd8/0x194 phys=3400000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 77824 sps_bam_pipe_set_params+0x1e4/0x4c8 pages=18 vmalloc -0x0000000000000000-0x0000000000000000 36864 kgsl_sharedmem_alloc_contig+0xc4/0x1f8 user -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac40000 ioremap -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1500000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 77824 sps_bam_pipe_set_params+0x1e4/0x4c8 pages=18 vmalloc -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac48000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap+0x84/0xd8 phys=890000 ioremap -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=acb3000 ioremap -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=14e0000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 77824 sps_bam_pipe_set_params+0x1e4/0x4c8 pages=18 vmalloc -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=acba000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap+0x84/0xd8 phys=89c000 ioremap -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=acc8000 ioremap -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=17900000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac65000 ioremap -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac66000 ioremap -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac67000 ioremap -0x0000000000000000-0x0000000000000000 36864 devm_ioremap_resource+0xd8/0x194 phys=1d90000 ioremap -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac68000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap+0x84/0xd8 phys=a8c000 ioremap -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac5a000 ioremap -0x0000000000000000-0x0000000000000000 16384 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac18000 ioremap -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1620000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 102400 dmam_alloc_coherent+0xb0/0x11c user -0x0000000000000000-0x0000000000000000 16384 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac87000 ioremap -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1380000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac5b000 ioremap -0x0000000000000000-0x0000000000000000 16384 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac91000 ioremap -0x0000000000000000-0x0000000000000000 36864 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac6b000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap_resource+0xd8/0x194 phys=888000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d78000 ioremap -0x0000000000000000-0x0000000000000000 16384 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac6f000 ioremap -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1380000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d43000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d78000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d70000 ioremap -0x0000000000000000-0x0000000000000000 36864 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d45000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap_resource+0xd8/0x194 phys=88c000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=17d70000 ioremap -0x0000000000000000-0x0000000000000000 12288 devm_ioremap_nocache+0x84/0xd8 phys=858b2000 ioremap -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1740000 ioremap -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 135168 crypto_scomp_alloc_scratches+0x74/0xdc pages=32 vmalloc -0x0000000000000000-0x0000000000000000 20480 devm_ioremap_resource+0xd8/0x194 phys=894000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=1436000 ioremap -0x0000000000000000-0x0000000000000000 16384 devm_ioremap_nocache+0x84/0xd8 phys=14693000 ioremap -0x0000000000000000-0x0000000000000000 69632 kgsl_iommu_init+0x154/0x5a0 phys=5040000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=1436000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=114a000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=170f7000 ioremap -0x0000000000000000-0x0000000000000000 36864 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=170f7000 ioremap -0x0000000000000000-0x0000000000000000 8192 ebt_register_table+0xc4/0x3d4 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 ebt_register_table+0xd4/0x3d4 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 24576 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac42000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=4080000 ioremap -0x0000000000000000-0x0000000000000000 33558528 devm_ioremap_resource+0xd8/0x194 phys=c600000 ioremap -0x0000000000000000-0x0000000000000000 33558528 mem_dump_probe+0x1d4/0x464 user -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=1f63000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=1f65000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=1f64000 ioremap -0x0000000000000000-0x0000000000000000 36864 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=4180000 ioremap -0x0000000000000000-0x0000000000000000 20480 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=acaf000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=c2b0000 ioremap -0x0000000000000000-0x0000000000000000 20480 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=acb6000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=b2e0000 ioremap -0x0000000000000000-0x0000000000000000 20480 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=acc4000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap+0x84/0xd8 phys=4180000 ioremap -0x0000000000000000-0x0000000000000000 20480 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac4a000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 28672 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac00000 ioremap -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1620000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 36864 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac10000 ioremap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 20480 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac4e000 ioremap -0x0000000000000000-0x0000000000000000 20480 cam_soc_util_request_platform_resource+0xd4/0x5e8 phys=ac52000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap_resource+0xd8/0x194 phys=a88000 ioremap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap_resource+0xd8/0x194 phys=a90000 ioremap -0x0000000000000000-0x0000000000000000 20480 devm_ioremap_nocache+0x84/0xd8 phys=146bf000 ioremap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1380000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 16384 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=88ee000 ioremap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_resource+0xd8/0x194 phys=a60c000 ioremap -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init+0x15c/0x5c0 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init+0x1d0/0x5c0 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init+0x2a0/0x5c0 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1380000 ioremap -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 __ipa_commit_hdr_v3_0+0x19c/0xefc user -0x0000000000000000-0x0000000000000000 20480 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=1740000 ioremap -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 dwc3_gadget_init_hw_endpoints+0x2a4/0x368 user -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 98304 sps_register_bam_device+0x884/0xd9c phys=a704000 ioremap -0x0000000000000000-0x0000000000000000 8192 dwc3_core_pre_init+0x438/0x480 user -0x0000000000000000-0x0000000000000000 8192 dwc3_msm_notify_event+0x704/0xee0 user -0x0000000000000000-0x0000000000000000 8192 dwc3_msm_notify_event+0x704/0xee0 user -0x0000000000000000-0x0000000000000000 8192 dwc3_msm_notify_event+0x704/0xee0 user -0x0000000000000000-0x0000000000000000 200704 devm_ioremap+0x84/0xd8 phys=506a000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 devm_ioremap_nocache+0x84/0xd8 phys=aeac000 ioremap -0x0000000000000000-0x0000000000000000 16384 devm_ioremap_nocache+0x84/0xd8 phys=aeb0000 ioremap -0x0000000000000000-0x0000000000000000 528384 devm_ioremap_resource+0xd8/0x194 phys=15000000 ioremap -0x0000000000000000-0x0000000000000000 24576 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 20480 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 gpi_alloc_ring+0x238/0x2e0 user -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 135168 qce_open+0x360/0x1760 phys=1de0000 ioremap -0x0000000000000000-0x0000000000000000 36864 drm_ht_create+0x50/0x84 pages=8 vmalloc -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 12288 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 45056 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 12288 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 45056 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 12288 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 397312 devm_ioremap_nocache+0x84/0xd8 phys=800000 ioremap -0x0000000000000000-0x0000000000000000 45056 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 12288 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 45056 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 gpi_alloc_ring+0x238/0x2e0 user -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 139264 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 106496 mnh_alloc_coherent+0x94/0xd0 user -0x0000000000000000-0x0000000000000000 8192 firmware_data_write+0xe8/0x228 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 firmware_loading_store+0x1b8/0x244 -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 firmware_data_write+0xe8/0x228 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 firmware_loading_store+0x1b8/0x244 -0x0000000000000000-0x0000000000000000 12288 gpi_alloc_ring+0x238/0x2e0 user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 SyS_swapon+0x720/0xd20 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 swap_cgroup_swapon+0x38/0x140 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 528384 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 12288 disksize_store+0x9c/0x154 pages=2 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 24576 lz4_init+0x1c/0x48 pages=5 vmalloc -0x0000000000000000-0x0000000000000000 24576 lz4_init+0x1c/0x48 pages=5 vmalloc -0x0000000000000000-0x0000000000000000 24576 lz4_init+0x1c/0x48 pages=5 vmalloc -0x0000000000000000-0x0000000000000000 24576 lz4_init+0x1c/0x48 pages=5 vmalloc -0x0000000000000000-0x0000000000000000 24576 lz4_init+0x1c/0x48 pages=5 vmalloc -0x0000000000000000-0x0000000000000000 24576 lz4_init+0x1c/0x48 pages=5 vmalloc -0x0000000000000000-0x0000000000000000 24576 lz4_init+0x1c/0x48 pages=5 vmalloc -0x0000000000000000-0x0000000000000000 24576 lz4_init+0x1c/0x48 pages=5 vmalloc -0x0000000000000000-0x0000000000000000 8192 ipa3_uc_event_handler+0x378/0x6c8 phys=1e47000 ioremap -0x0000000000000000-0x0000000000000000 8192 ipa3_uc_wdi_event_log_info_handler+0x1bc/0x350 phys=1e47000 ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 110592 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 ipahal_fltrt_allocate_hw_sys_tbl+0x1cc/0x34c user -0x0000000000000000-0x0000000000000000 8192 ipahal_fltrt_allocate_hw_sys_tbl+0x1cc/0x34c user -0x0000000000000000-0x0000000000000000 8192 ipahal_fltrt_allocate_hw_sys_tbl+0x1cc/0x34c user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 ipahal_fltrt_allocate_hw_sys_tbl+0x1cc/0x34c user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 16384 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 40960 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 40960 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 16384 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 16384 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 16384 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 249856 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 266240 SyS_swapon+0x650/0xd20 pages=64 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_multi_pages_alloc+0x388/0x64c [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 20480 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 139264 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 20480 pcpu_alloc+0x3e8/0x9e4 pages=4 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 1052672 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 20975616 memremap+0x188/0x200 phys=8ab00000 ioremap -0x0000000000000000-0x0000000000000000 372736 qce_open+0x68c/0x1760 user -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 397312 devm_ioremap_nocache+0x84/0xd8 phys=a00000 ioremap -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 12288 lpm_probe+0x194/0x2e4 user -0x0000000000000000-0x0000000000000000 1052672 devm_ioremap+0x84/0xd8 phys=40100000 ioremap -0x0000000000000000-0x0000000000000000 1052672 msm_rtb_probe+0x114/0x268 user -0x0000000000000000-0x0000000000000000 8192 pci_ioremap_bar+0x80/0xb4 phys=41c00000 ioremap -0x0000000000000000-0x0000000000000000 16384 sde_rot_ioremap_byname+0x84/0x144 phys=aeb8000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 dm_create+0x78/0x490 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_table_create+0x84/0xf0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_create+0x78/0x490 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_table_create+0x84/0xf0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_create+0x78/0x490 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_table_create+0x84/0xf0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_create+0x78/0x490 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_table_create+0x84/0xf0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 61440 verity_ctr+0x6c4/0x8c4 pages=14 vmalloc -0x0000000000000000-0x0000000000000000 8192 alloc_buffer+0x16c/0x208 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 alloc_buffer+0x16c/0x208 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 266240 devm_ioremap+0x84/0xd8 phys=5000000 ioremap -0x0000000000000000-0x0000000000000000 8192 alloc_buffer+0x16c/0x208 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_create+0x78/0x490 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_table_create+0x84/0xf0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 20480 verity_ctr+0x6c4/0x8c4 pages=4 vmalloc -0x0000000000000000-0x0000000000000000 8192 alloc_buffer+0x16c/0x208 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 alloc_buffer+0x16c/0x208 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 alloc_buffer+0x16c/0x208 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_create+0x78/0x490 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_table_create+0x84/0xf0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 32768 verity_ctr+0x6c4/0x8c4 pages=7 vmalloc -0x0000000000000000-0x0000000000000000 8192 alloc_buffer+0x16c/0x208 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 alloc_buffer+0x16c/0x208 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 alloc_buffer+0x16c/0x208 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 151552 qce_open+0xc08/0x1760 phys=1dc4000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 20480 load_module+0x24ac/0x3408 pages=4 vmalloc -0x0000000000000000-0x0000000000000000 8192 gpi_alloc_ring+0x238/0x2e0 user -0x0000000000000000-0x0000000000000000 8192 gpi_alloc_ring+0x238/0x2e0 user -0x0000000000000000-0x0000000000000000 12288 gpi_alloc_ring+0x238/0x2e0 user -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 dm_create+0x78/0x490 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 4198400 disksize_store+0x9c/0x154 pages=1024 vmalloc vpages -0x0000000000000000-0x0000000000000000 1052672 devm_ioremap+0x84/0xd8 phys=40200000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 dm_table_create+0x84/0xf0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 135168 qce_open+0x360/0x1760 phys=1de0000 ioremap -0x0000000000000000-0x0000000000000000 372736 qce_open+0x68c/0x1760 user -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 200704 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 kgsl_sharedmem_alloc_contig+0xc4/0x1f8 user -0x0000000000000000-0x0000000000000000 2035712 syscon_node_to_regmap+0x198/0x2dc phys=100000 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 16384 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 2428928 syscon_node_to_regmap+0x198/0x2dc phys=1100000 ioremap -0x0000000000000000-0x0000000000000000 1052672 dmam_alloc_coherent+0xb0/0x11c user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 266240 usbpd_create+0x3c/0x824 pages=64 vmalloc -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 36864 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 36864 alloc_and_map+0xb0/0x1cc user -0x0000000000000000-0x0000000000000000 12288 kgsl_sharedmem_page_alloc_user+0x114/0x4ec pages=2 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 12288 kgsl_sharedmem_page_alloc_user+0x114/0x4ec pages=2 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 12288 kgsl_sharedmem_page_alloc_user+0x114/0x4ec pages=2 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 3149824 devm_ioremap+0x84/0xd8 phys=b200000 ioremap -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 12288 kgsl_sharedmem_page_alloc_user+0x114/0x4ec pages=2 vmalloc -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 36864 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 20480 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 qdf_mem_alloc_consistent_debug+0xd4/0x148 [wlan] user -0x0000000000000000-0x0000000000000000 8192 ipa3_setup_sys_pipe+0x131c/0x2794 user -0x0000000000000000-0x0000000000000000 8192 ipa3_setup_sys_pipe+0x14cc/0x2794 user -0x0000000000000000-0x0000000000000000 8192 ipa3_setup_sys_pipe+0x131c/0x2794 user -0x0000000000000000-0x0000000000000000 8192 ipa3_setup_sys_pipe+0x14cc/0x2794 user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 184320 ngd_slim_probe+0x334/0x9b0 phys=171c0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 176128 ngd_slim_probe+0x378/0x9b0 phys=17184000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 184320 ngd_slim_probe+0x334/0x9b0 phys=17240000 ioremap -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 8192 ipahal_fltrt_allocate_hw_sys_tbl+0x1cc/0x34c user -0x0000000000000000-0x0000000000000000 16384 n_tty_open+0x1c/0xac pages=3 vmalloc -0x0000000000000000-0x0000000000000000 8192 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 12288 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 8392704 devm_ioremap+0x84/0xd8 phys=18800000 ioremap -0x0000000000000000-0x0000000000000000 2109440 msm_sharedmem_probe+0x1dc/0x354 user -0x0000000000000000-0x0000000000000000 16384 fastrpc_internal_invoke+0xab8/0x1c50 user -0x0000000000000000-0x0000000000000000 8192 ipahal_fltrt_allocate_hw_sys_tbl+0x1cc/0x34c user -0x0000000000000000-0x0000000000000000 28672 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=6 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc -0x0000000000000000-0x0000000000000000 135168 ngd_slim_probe+0x378/0x9b0 phys=17204000 ioremap -0x0000000000000000-0x0000000000000000 12288 pcpu_alloc+0x3e8/0x9e4 pages=2 vmalloc -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 rpmstats_show+0x78/0x2b0 phys=c3f0000 ioremap -0x0000000000000000-0x0000000000000000 12288 drm_property_create_blob+0x44/0xec pages=2 vmalloc -0x0000000000000000-0x0000000000000000 8192 msm_gem_get_vaddr+0xb0/0xf0 vmap -0x0000000000000000-0x0000000000000000 8192 wlan_logging_sock_init_svc+0xf8/0x4f0 [wlan] pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 gpi_alloc_ring+0x238/0x2e0 user -0x0000000000000000-0x0000000000000000 8192 gpi_alloc_ring+0x238/0x2e0 user -0x0000000000000000-0x0000000000000000 1052672 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 2101248 devm_ioremap_nocache+0x84/0xd8 phys=aa00000 ioremap -0x0000000000000000-0x0000000000000000 45056 drm_property_create_blob+0x44/0xec pages=10 vmalloc -0x0000000000000000-0x0000000000000000 135168 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 135168 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 12288 gpi_alloc_ring+0x238/0x2e0 user -0x0000000000000000-0x0000000000000000 1052672 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 8192 ipahal_fltrt_init+0x9e4/0xc7c user -0x0000000000000000-0x0000000000000000 1024000 devm_ioremap_nocache+0x84/0xd8 phys=a600000 ioremap -0x0000000000000000-0x0000000000000000 8192 ipa3_allocate_dma_task_for_gsi+0xfc/0x318 user -0x0000000000000000-0x0000000000000000 8192 ipa3_nat_ipv6ct_init_devices+0x160/0x438 user -0x0000000000000000-0x0000000000000000 536576 devm_ioremap_nocache+0x84/0xd8 phys=ae00000 ioremap -0x0000000000000000-0x0000000000000000 708608 sde_rot_ioremap_byname+0x84/0x144 phys=ae00000 ioremap -0x0000000000000000-0x0000000000000000 33558528 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 8392704 pci_ioremap_bar+0x80/0xb4 phys=40800000 ioremap -0x0000000000000000-0x0000000000000000 8192 ipa3_post_init+0x7fc/0x2c98 user -0x0000000000000000-0x0000000000000000 442368 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 4198400 pci_ioremap_bar+0x80/0xb4 phys=41800000 ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1052672 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 36864 ipa3_alloc_common_event_ring+0x178/0x24c user -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 2166784 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 ipa3_setup_sys_pipe+0x131c/0x2794 user -0x0000000000000000-0x0000000000000000 12288 ipa3_setup_sys_pipe+0x14cc/0x2794 user -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 2166784 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 ipa3_setup_sys_pipe+0x131c/0x2794 user -0x0000000000000000-0x0000000000000000 2166784 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 8192 ipa3_setup_sys_pipe+0x14cc/0x2794 user -0x0000000000000000-0x0000000000000000 20480 ipa3_setup_sys_pipe+0x14cc/0x2794 user -0x0000000000000000-0x0000000000000000 8192 ipa3_uc_interface_init+0x104/0x390 phys=1e47000 ioremap -0x0000000000000000-0x0000000000000000 8192 ipahal_fltrt_allocate_hw_sys_tbl+0x1cc/0x34c user -0x0000000000000000-0x0000000000000000 8192 ipahal_fltrt_allocate_hw_sys_tbl+0x1cc/0x34c user -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 184320 devm_ioremap_nocache+0x84/0xd8 phys=1e04000 ioremap -0x0000000000000000-0x0000000000000000 266240 bpf_map_area_alloc+0x74/0x94 pages=64 vmalloc -0x0000000000000000-0x0000000000000000 266240 bpf_map_area_alloc+0x74/0x94 pages=64 vmalloc -0x0000000000000000-0x0000000000000000 266240 bpf_map_area_alloc+0x74/0x94 pages=64 vmalloc -0x0000000000000000-0x0000000000000000 2166784 kgsl_page_alloc_map_kernel+0x70/0x108 ioremap -0x0000000000000000-0x0000000000000000 266240 bpf_map_area_alloc+0x74/0x94 pages=64 vmalloc -0x0000000000000000-0x0000000000000000 700416 ipa3_qmi_service_init_worker+0x78/0x55c pages=170 vmalloc -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 8192 bpf_prog_alloc+0x70/0xd0 pages=1 vmalloc -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 5246976 removed_alloc+0x2f8/0x3ac phys=8bf00000 ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1052672 removed_alloc+0x2f8/0x3ac phys=98500000 ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 3141632 ion_heap_map_kernel+0x108/0x158 vmap -0x0000000000000000-0x0000000000000000 533729280 devm_ioremap+0x84/0xd8 phys=40300000 ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 1044480 binder_alloc_mmap_handler+0x60/0x1cc ioremap -0x0000000000000000-0x0000000000000000 10498048 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=2562 vmalloc vpages -0x0000000000000000-0x0000000000000000 18350080 setup_arch+0x20c/0x668 phys=80080000 vmap -0x0000000000000000-0x0000000000000000 8388608 setup_arch+0x20c/0x668 phys=81200000 vmap -0x0000000000000000-0x0000000000000000 6291456 setup_arch+0x20c/0x668 phys=81a00000 vmap -0x0000000000000000-0x0000000000000000 11005952 setup_arch+0x20c/0x668 phys=82000000 vmap -0x0000000000000000-0x0000000000000000 8073216 load_module+0x24ac/0x3408 pages=1970 vmalloc vpages -0x0000000000000000-0x0000000000000000 20480 load_module+0x24ac/0x3408 pages=4 vmalloc -0x0000000000000000-0x0000000000000000 151552 load_module+0x24ac/0x3408 pages=36 vmalloc -0x0000000000000000-0x0000000000000000 28672 load_module+0x24ac/0x3408 pages=6 vmalloc -0x0000000000000000-0x0000000000000000 94208 load_module+0x24ac/0x3408 pages=22 vmalloc -0x0000000000000000-0x0000000000000000 409600 load_module+0x24ac/0x3408 pages=99 vmalloc -0x0000000000000000-0x0000000000000000 36864 load_module+0x24ac/0x3408 pages=8 vmalloc -0x0000000000000000-0x0000000000000000 303104 load_module+0x24ac/0x3408 pages=73 vmalloc -0x0000000000000000-0x0000000000000000 172032 load_module+0x24ac/0x3408 pages=41 vmalloc -0x0000000000000000-0x0000000000000000 20480 load_module+0x24ac/0x3408 pages=4 vmalloc -0x0000000000000000-0x0000000000000000 20480 load_module+0x24ac/0x3408 pages=4 vmalloc -0x0000000000000000-0x0000000000000000 20480 load_module+0x24ac/0x3408 pages=4 vmalloc -0x0000000000000000-0x0000000000000000 245760 load_module+0x24ac/0x3408 pages=59 vmalloc -0x0000000000000000-0x0000000000000000 786432 pcpu_get_vm_areas+0x0/0x800 vmalloc -0x0000000000000000-0x0000000000000000 786432 pcpu_get_vm_areas+0x0/0x800 vmalloc diff --git a/libmeminfo/testdata2/mem_used_total b/libmeminfo/testdata2/mem_used_total deleted file mode 100644 index 97fcf41bd..000000000 --- a/libmeminfo/testdata2/mem_used_total +++ /dev/null @@ -1 +0,0 @@ -31236096 diff --git a/libmeminfo/tools/Android.bp b/libmeminfo/tools/Android.bp deleted file mode 100644 index 3968c09dc..000000000 --- a/libmeminfo/tools/Android.bp +++ /dev/null @@ -1,90 +0,0 @@ -// 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: "librank", - cflags: [ - "-Wall", - "-Werror", - ], - - srcs: ["librank.cpp"], - shared_libs: [ - "libbase", - "libmeminfo", - ], -} - -cc_binary { - name: "procmem", - cflags: [ - "-Wall", - "-Werror", - ], - - srcs: ["procmem.cpp"], - shared_libs: [ - "libbase", - "libmeminfo", - ], -} - -cc_binary { - name: "procrank", - cflags: [ - "-Wall", - "-Werror", - ], - - srcs: ["procrank.cpp"], - shared_libs: [ - "libbase", - "libmeminfo", - ], -} - -cc_binary { - name: "showmap", - host_supported: true, - cflags: [ - "-Wall", - "-Werror", - ], - - srcs: ["showmap.cpp"], - shared_libs: [ - "libbase", - "libmeminfo", - ], - - target: { - darwin: { - enabled: false, - }, - }, -} - -cc_binary { - name: "wsstop", - cflags: [ - "-Wall", - "-Werror", - ], - srcs: ["wsstop.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libmeminfo", - ], -} diff --git a/libmeminfo/tools/librank.cpp b/libmeminfo/tools/librank.cpp deleted file mode 100644 index e53c74610..000000000 --- a/libmeminfo/tools/librank.cpp +++ /dev/null @@ -1,351 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -using ::android::meminfo::MemUsage; -using ::android::meminfo::ProcMemInfo; -using ::android::meminfo::Vma; - -[[noreturn]] static void usage(int exit_status) { - fprintf(stderr, - "Usage: %s [ -P | -L ] [ -v | -r | -p | -u | -s | -h ]\n" - "\n" - "Sort options:\n" - " -v Sort processes by VSS.\n" - " -r Sort processes by RSS.\n" - " -p Sort processes by PSS.\n" - " -u Sort processes by USS.\n" - " -s Sort processes by swap.\n" - " (Default sort order is PSS.)\n" - " -a Show all mappings, including stack, heap and anon.\n" - " -P /path Limit libraries displayed to those in path.\n" - " -R Reverse sort order (default is descending).\n" - " -m [r][w][x] Only list pages that exactly match permissions\n" - " -c Only show cached (storage backed) pages\n" - " -C Only show non-cached (ram/swap backed) pages\n" - " -k Only show pages collapsed by KSM\n" - " -h Display this help screen.\n", - getprogname()); - exit(exit_status); -} - -static void add_mem_usage(MemUsage* to, const MemUsage& from) { - to->vss += from.vss; - to->rss += from.rss; - to->pss += from.pss; - to->uss += from.uss; - - to->swap += from.swap; - - to->private_clean += from.private_clean; - to->private_dirty += from.private_dirty; - - to->shared_clean += from.shared_clean; - to->shared_dirty += from.shared_dirty; -} - -struct ProcessRecord { - public: - ProcessRecord(pid_t pid) : pid_(-1), cmdline_("") { - std::string fname = ::android::base::StringPrintf("/proc/%d/cmdline", pid); - std::string cmdline; - if (!::android::base::ReadFileToString(fname, &cmdline)) { - fprintf(stderr, "Failed to read cmdline from: %s\n", fname.c_str()); - return; - } - // We deliberately don't read the proc/cmdline file directly into 'cmdline_' - // because of some processes showing up cmdlines that end with "0x00 0x0A 0x00" - // e.g. xtra-daemon, lowi-server - // The .c_str() assignment below then takes care of trimming the cmdline at the first - // 0x00. This is how original procrank worked (luckily) - cmdline_ = cmdline.c_str(); - pid_ = pid; - usage_.clear(); - } - - ~ProcessRecord() = default; - - bool valid() const { return pid_ != -1; } - - // Getters - pid_t pid() const { return pid_; } - const std::string& cmdline() const { return cmdline_; } - const MemUsage& usage() const { return usage_; } - - // Add to the usage - void AddUsage(const MemUsage& mem_usage) { add_mem_usage(&usage_, mem_usage); } - - private: - pid_t pid_; - std::string cmdline_; - MemUsage usage_; -}; - -struct LibRecord { - public: - LibRecord(const std::string& name) : name_(name) {} - ~LibRecord() = default; - - const std::string& name() const { return name_; } - const MemUsage& usage() const { return usage_; } - const std::map& processes() const { return procs_; } - uint64_t pss() const { return usage_.pss; } - void AddUsage(const ProcessRecord& proc, const MemUsage& mem_usage) { - auto [it, inserted] = procs_.insert(std::pair(proc.pid(), proc)); - it->second.AddUsage(mem_usage); - add_mem_usage(&usage_, mem_usage); - } - - private: - std::string name_; - MemUsage usage_; - std::map procs_; -}; - -// List of every library / map -static std::map g_libs; - -// List of library/map names that we don't want to show by default -static const std::vector g_blacklisted_libs = {"[heap]", "[stack]"}; - -// Global flags affected by command line -static uint64_t g_pgflags = 0; -static uint64_t g_pgflags_mask = 0; -static uint16_t g_mapflags_mask = 0; -static bool g_all_libs = false; -static bool g_has_swap = false; -static bool g_reverse_sort = false; -static std::string g_prefix_filter = ""; - -static bool read_all_pids(std::function for_each_pid) { - std::unique_ptr procdir(opendir("/proc"), closedir); - if (!procdir) return false; - - struct dirent* dir; - pid_t pid; - while ((dir = readdir(procdir.get()))) { - if (!::android::base::ParseInt(dir->d_name, &pid)) continue; - if (!for_each_pid(pid)) return false; - } - - return true; -} - -static bool scan_libs_per_process(pid_t pid) { - ProcMemInfo pmem(pid, false, g_pgflags, g_pgflags_mask); - const std::vector maps = pmem.Maps(); - if (maps.size() == 0) { - // nothing to do here, continue - return true; - } - - ProcessRecord proc(pid); - if (!proc.valid()) { - fprintf(stderr, "Failed to create process record for process: %d\n", pid); - return false; - } - - for (auto& map : maps) { - // skip library / map if prefix for the path doesn't match - if (!g_prefix_filter.empty() && !::android::base::StartsWith(map.name, g_prefix_filter)) { - continue; - } - // Skip maps based on map permissions - if (g_mapflags_mask && - ((map.flags & (PROT_READ | PROT_WRITE | PROT_EXEC)) != g_mapflags_mask)) { - continue; - } - - // skip blacklisted library / map names - if (!g_all_libs && (std::find(g_blacklisted_libs.begin(), g_blacklisted_libs.end(), - map.name) != g_blacklisted_libs.end())) { - continue; - } - - auto [it, inserted] = - g_libs.insert(std::pair(map.name, LibRecord(map.name))); - it->second.AddUsage(proc, map.usage); - - if (!g_has_swap && map.usage.swap) { - g_has_swap = true; - } - } - - return true; -} - -static uint16_t parse_mapflags(const char* mapflags) { - uint16_t ret = 0; - for (const char* p = mapflags; *p; p++) { - switch (*p) { - case 'r': - ret |= PROT_READ; - break; - case 'w': - ret |= PROT_WRITE; - break; - case 'x': - ret |= PROT_EXEC; - break; - default: - error(EXIT_FAILURE, 0, "Invalid permissions string: %s, %s", mapflags, p); - } - } - - return ret; -} - -int main(int argc, char* argv[]) { - int opt; - - auto pss_sort = [](const ProcessRecord& a, const ProcessRecord& b) { - return g_reverse_sort ? a.usage().pss < b.usage().pss : a.usage().pss > b.usage().pss; - }; - - auto uss_sort = [](const ProcessRecord& a, const ProcessRecord& b) { - return g_reverse_sort ? a.usage().uss < b.usage().uss : a.usage().uss > b.usage().uss; - }; - - auto vss_sort = [](const ProcessRecord& a, const ProcessRecord& b) { - return g_reverse_sort ? a.usage().vss < b.usage().vss : a.usage().vss > b.usage().vss; - }; - - auto rss_sort = [](const ProcessRecord& a, const ProcessRecord& b) { - return g_reverse_sort ? a.usage().rss < b.usage().rss : a.usage().rss > b.usage().rss; - }; - - auto swap_sort = [](const ProcessRecord& a, const ProcessRecord& b) { - return g_reverse_sort ? a.usage().swap < b.usage().swap : a.usage().swap > b.usage().swap; - }; - - std::function sort_func = pss_sort; - - while ((opt = getopt(argc, argv, "acChkm:pP:uvrsR")) != -1) { - switch (opt) { - case 'a': - g_all_libs = true; - break; - case 'c': - g_pgflags = 0; - g_pgflags_mask = (1 << KPF_SWAPBACKED); - break; - case 'C': - g_pgflags = g_pgflags_mask = (1 << KPF_SWAPBACKED); - break; - case 'h': - usage(EXIT_SUCCESS); - case 'k': - g_pgflags = g_pgflags_mask = (1 << KPF_KSM); - break; - case 'm': - g_mapflags_mask = parse_mapflags(optarg); - break; - case 'p': - sort_func = pss_sort; - break; - case 'P': - g_prefix_filter = optarg; - break; - case 'u': - sort_func = uss_sort; - break; - case 'v': - sort_func = vss_sort; - break; - case 'r': - sort_func = rss_sort; - break; - case 's': - sort_func = swap_sort; - break; - case 'R': - g_reverse_sort = true; - break; - default: - usage(EXIT_FAILURE); - } - } - - if (!read_all_pids(scan_libs_per_process)) { - error(EXIT_FAILURE, 0, "Failed to read all pids from the system"); - } - - printf(" %6s %7s %6s %6s %6s ", "RSStot", "VSS", "RSS", "PSS", "USS"); - if (g_has_swap) { - printf(" %6s ", "Swap"); - } - printf("Name/PID\n"); - - std::vector v_libs; - v_libs.reserve(g_libs.size()); - std::transform(g_libs.begin(), g_libs.end(), std::back_inserter(v_libs), - [] (std::pair const& pair) { return pair.second; }); - - // sort the libraries by their pss - std::sort(v_libs.begin(), v_libs.end(), - [](const LibRecord& l1, const LibRecord& l2) { return l1.pss() > l2.pss(); }); - - for (auto& lib : v_libs) { - printf("%6" PRIu64 "K %7s %6s %6s %6s ", lib.pss() / 1024, "", "", "", ""); - if (g_has_swap) { - printf(" %6s ", ""); - } - printf("%s\n", lib.name().c_str()); - - // sort all mappings first - - std::vector procs; - procs.reserve(lib.processes().size()); - std::transform(lib.processes().begin(), lib.processes().end(), std::back_inserter(procs), - [] (std::pair const& pair) { return pair.second; }); - - std::sort(procs.begin(), procs.end(), sort_func); - - for (auto& p : procs) { - const MemUsage& usage = p.usage(); - printf(" %6s %7" PRIu64 "K %6" PRIu64 "K %6" PRIu64 "K %6" PRIu64 "K ", "", - usage.vss / 1024, usage.rss / 1024, usage.pss / 1024, usage.uss / 1024); - if (g_has_swap) { - printf("%6" PRIu64 "K ", usage.swap / 1024); - } - printf(" %s [%d]\n", p.cmdline().c_str(), p.pid()); - } - } - - return 0; -} diff --git a/libmeminfo/tools/procmem.cpp b/libmeminfo/tools/procmem.cpp deleted file mode 100644 index b245f2af9..000000000 --- a/libmeminfo/tools/procmem.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* - * 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 -#include - -#include -#include -#include -#include - -#include -#include - -using Vma = ::android::meminfo::Vma; -using ProcMemInfo = ::android::meminfo::ProcMemInfo; -using MemUsage = ::android::meminfo::MemUsage; - -// Global flags to control procmem output - -// Set to use page idle bits for working set detection -bool use_pageidle = false; -// hides map entries with zero rss -bool hide_zeroes = false; -// Reset working set and exit -bool reset_wss = false; -// Show working set, mutually exclusive with reset_wss; -bool show_wss = false; - -[[noreturn]] static void usage(int exit_status) { - fprintf(stderr, - "Usage: %s [-i] [ -w | -W ] [ -p | -m ] [ -h ] pid\n" - " -i Uses idle page tracking for working set statistics.\n" - " -w Displays statistics for the working set only.\n" - " -W Resets the working set of the process.\n" - " -p Sort by PSS.\n" - " -u Sort by USS.\n" - " -m Sort by mapping order (as read from /proc).\n" - " -h Hide maps with no RSS.\n", - getprogname()); - - exit(exit_status); -} - -static void print_separator(std::stringstream& ss) { - if (show_wss) { - ss << ::android::base::StringPrintf("%7s %7s %7s %7s %7s %7s %7s %7s %s\n", - "-------", "-------", "-------", "-------", "-------", - "-------", "-------", "-------", ""); - return; - } - ss << ::android::base::StringPrintf("%7s %7s %7s %7s %7s %7s %7s %7s %7s %s\n", - "-------", "-------", "-------", "-------", "-------", - "-------", "-------", "-------", "-------", ""); -} - -static void print_header(std::stringstream& ss) { - if (show_wss) { - ss << ::android::base::StringPrintf("%7s %7s %7s %7s %7s %7s %7s %7s %s\n", "WRss", - "WPss", "WUss", "WShCl", "WShDi", "WPrCl", "WPrDi", - "Flags", "Name"); - } else { - ss << ::android::base::StringPrintf("%7s %7s %7s %7s %7s %7s %7s %7s %7s %s\n", - "Vss", "Rss", "Pss", "Uss", "ShCl", "ShDi", "PrCl", - "PrDi", "Flags", "Name"); - } - print_separator(ss); -} - -static void print_stats(std::stringstream& ss, const MemUsage& stats) { - if (!show_wss) { - ss << ::android::base::StringPrintf("%6" PRIu64 "K ", stats.vss / 1024); - } - - ss << ::android::base::StringPrintf("%6" PRIu64 "K %6" PRIu64 "K %6" PRIu64 "K %6" PRIu64 - "K %6" PRIu64 "K %6" PRIu64 "K %6" PRIu64 "K ", - stats.rss / 1024, stats.pss / 1024, stats.uss / 1024, - stats.shared_clean / 1024, stats.shared_dirty / 1024, - stats.private_clean / 1024, stats.private_dirty / 1024); -} - -static int show(const MemUsage& proc_stats, const std::vector& maps) { - std::stringstream ss; - print_header(ss); - for (auto& vma : maps) { - const MemUsage& vma_stats = vma.usage; - if (hide_zeroes && vma_stats.rss == 0) { - continue; - } - print_stats(ss, vma_stats); - - // TODO: b/141711064 fix libprocinfo to record (p)rivate or (s)hared flag - // for now always report as private - std::string flags_str("---p"); - if (vma.flags & PROT_READ) flags_str[0] = 'r'; - if (vma.flags & PROT_WRITE) flags_str[1] = 'w'; - if (vma.flags & PROT_EXEC) flags_str[2] = 'x'; - - ss << ::android::base::StringPrintf("%7s ", flags_str.c_str()) << vma.name << std::endl; - } - print_separator(ss); - print_stats(ss, proc_stats); - ss << "TOTAL" << std::endl; - std::cout << ss.str(); - - return 0; -} - -int main(int argc, char* argv[]) { - int opt; - auto pss_sort = [](const Vma& a, const Vma& b) { - uint64_t pss_a = a.usage.pss; - uint64_t pss_b = b.usage.pss; - return pss_a > pss_b; - }; - - auto uss_sort = [](const Vma& a, const Vma& b) { - uint64_t uss_a = a.usage.uss; - uint64_t uss_b = b.usage.uss; - return uss_a > uss_b; - }; - - std::function sort_func = nullptr; - while ((opt = getopt(argc, argv, "himpuWw")) != -1) { - switch (opt) { - case 'h': - hide_zeroes = true; - break; - case 'i': - // TODO: libmeminfo doesn't support the flag to chose - // between idle page tracking vs clear_refs. So for now, - // this flag is unused and the library defaults to using - // /proc//clear_refs for finding the working set. - use_pageidle = true; - break; - case 'm': - // this is the default - break; - case 'p': - sort_func = pss_sort; - break; - case 'u': - sort_func = uss_sort; - break; - case 'W': - reset_wss = true; - break; - case 'w': - show_wss = true; - break; - case '?': - usage(EXIT_SUCCESS); - default: - usage(EXIT_FAILURE); - } - } - - if (optind != (argc - 1)) { - fprintf(stderr, "Need exactly one pid at the end\n"); - usage(EXIT_FAILURE); - } - - pid_t pid = atoi(argv[optind]); - if (pid == 0) { - std::cerr << "Invalid process id" << std::endl; - exit(EXIT_FAILURE); - } - - if (reset_wss) { - if (!ProcMemInfo::ResetWorkingSet(pid)) { - std::cerr << "Failed to reset working set of pid : " << pid << std::endl; - exit(EXIT_FAILURE); - } - return 0; - } - - ProcMemInfo proc(pid, show_wss); - const MemUsage& proc_stats = proc.Usage(); - std::vector maps(proc.Maps()); - if (sort_func != nullptr) { - std::sort(maps.begin(), maps.end(), sort_func); - } - - return show(proc_stats, maps); -} diff --git a/libmeminfo/tools/procrank.cpp b/libmeminfo/tools/procrank.cpp deleted file mode 100644 index 1e44ff9bd..000000000 --- a/libmeminfo/tools/procrank.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -using ::android::meminfo::MemUsage; -using ::android::meminfo::ProcMemInfo; - -struct ProcessRecord { - public: - ProcessRecord(pid_t pid, bool get_wss = false, uint64_t pgflags = 0, uint64_t pgflags_mask = 0) - : pid_(-1), - oomadj_(OOM_SCORE_ADJ_MAX + 1), - cmdline_(""), - proportional_swap_(0), - unique_swap_(0), - zswap_(0) { - std::unique_ptr procmem = - std::make_unique(pid, get_wss, pgflags, pgflags_mask); - if (procmem == nullptr) { - std::cerr << "Failed to create ProcMemInfo for: " << pid << std::endl; - return; - } - - std::string fname = ::android::base::StringPrintf("/proc/%d/oom_score_adj", pid); - auto oomscore_fp = - std::unique_ptr{fopen(fname.c_str(), "re"), fclose}; - if (oomscore_fp == nullptr) { - std::cerr << "Failed to open oom_score_adj file: " << fname << std::endl; - return; - } - - if (fscanf(oomscore_fp.get(), "%d\n", &oomadj_) != 1) { - std::cerr << "Failed to read oomadj from: " << fname << std::endl; - return; - } - - fname = ::android::base::StringPrintf("/proc/%d/cmdline", pid); - if (!::android::base::ReadFileToString(fname, &cmdline_)) { - std::cerr << "Failed to read cmdline from: " << fname << std::endl; - cmdline_ = ""; - } - // We deliberately don't read the proc/cmdline file directly into 'cmdline_' - // because of some processes showing up cmdlines that end with "0x00 0x0A 0x00" - // e.g. xtra-daemon, lowi-server - // The .c_str() assignment below then takes care of trimming the cmdline at the first - // 0x00. This is how original procrank worked (luckily) - cmdline_.resize(strlen(cmdline_.c_str())); - usage_or_wss_ = get_wss ? procmem->Wss() : procmem->Usage(); - swap_offsets_ = procmem->SwapOffsets(); - pid_ = pid; - } - - bool valid() const { return pid_ != -1; } - - void CalculateSwap(const uint16_t* swap_offset_array, float zram_compression_ratio) { - for (auto& off : swap_offsets_) { - proportional_swap_ += getpagesize() / swap_offset_array[off]; - unique_swap_ += swap_offset_array[off] == 1 ? getpagesize() : 0; - zswap_ = proportional_swap_ * zram_compression_ratio; - } - } - - // Getters - pid_t pid() const { return pid_; } - const std::string& cmdline() const { return cmdline_; } - int32_t oomadj() const { return oomadj_; } - uint64_t proportional_swap() const { return proportional_swap_; } - uint64_t unique_swap() const { return unique_swap_; } - uint64_t zswap() const { return zswap_; } - - // Wrappers to ProcMemInfo - const std::vector& SwapOffsets() const { return swap_offsets_; } - const MemUsage& Usage() const { return usage_or_wss_; } - const MemUsage& Wss() const { return usage_or_wss_; } - - private: - pid_t pid_; - int32_t oomadj_; - std::string cmdline_; - uint64_t proportional_swap_; - uint64_t unique_swap_; - uint64_t zswap_; - MemUsage usage_or_wss_; - std::vector swap_offsets_; -}; - -// Show working set instead of memory consumption -bool show_wss = false; -// Reset working set of each process -bool reset_wss = false; -// Show per-process oom_score_adj column -bool show_oomadj = false; -// True if the device has swap enabled -bool has_swap = false; -// True, if device has zram enabled -bool has_zram = false; -// If zram is enabled, the compression ratio is zram used / swap used. -float zram_compression_ratio = 0.0; -// Sort process in reverse, default is descending -bool reverse_sort = false; - -// Calculated total memory usage across all processes in the system -uint64_t total_pss = 0; -uint64_t total_uss = 0; -uint64_t total_swap = 0; -uint64_t total_pswap = 0; -uint64_t total_uswap = 0; -uint64_t total_zswap = 0; - -[[noreturn]] static void usage(int exit_status) { - std::cerr << "Usage: " << getprogname() << " [ -W ] [ -v | -r | -p | -u | -s | -h ]" - << std::endl - << " -v Sort by VSS." << std::endl - << " -r Sort by RSS." << std::endl - << " -p Sort by PSS." << std::endl - << " -u Sort by USS." << std::endl - << " -s Sort by swap." << std::endl - << " (Default sort order is PSS.)" << std::endl - << " -R Reverse sort order (default is descending)." << std::endl - << " -c Only show cached (storage backed) pages" << std::endl - << " -C Only show non-cached (ram/swap backed) pages" << std::endl - << " -k Only show pages collapsed by KSM" << std::endl - << " -w Display statistics for working set only." << std::endl - << " -W Reset working set of all processes." << std::endl - << " -o Show and sort by oom score against lowmemorykiller thresholds." - << std::endl - << " -h Display this help screen." << std::endl; - exit(exit_status); -} - -static bool read_all_pids(std::vector* pids, std::function for_each_pid) { - pids->clear(); - std::unique_ptr procdir(opendir("/proc"), closedir); - if (!procdir) return false; - - struct dirent* dir; - pid_t pid; - while ((dir = readdir(procdir.get()))) { - if (!::android::base::ParseInt(dir->d_name, &pid)) continue; - if (!for_each_pid(pid)) return false; - pids->emplace_back(pid); - } - - return true; -} - -static bool count_swap_offsets(const ProcessRecord& proc, uint16_t* swap_offset_array, - uint32_t size) { - const std::vector& swp_offs = proc.SwapOffsets(); - for (auto& off : swp_offs) { - if (off >= size) { - std::cerr << "swap offset " << off << " is out of bounds for process: " << proc.pid() - << std::endl; - return false; - } - - if (swap_offset_array[off] == USHRT_MAX) { - std::cerr << "swap offset " << off << " ref count overflow in process: " << proc.pid() - << std::endl; - return false; - } - - swap_offset_array[off]++; - } - - return true; -} - -static void print_header(std::stringstream& ss) { - ss.str(""); - ss << ::android::base::StringPrintf("%5s ", "PID"); - if (show_oomadj) { - ss << ::android::base::StringPrintf("%5s ", "oom"); - } - - if (show_wss) { - ss << ::android::base::StringPrintf("%7s %7s %7s ", "WRss", "WPss", "WUss"); - // now swap statistics here, working set pages by definition shouldn't end up in swap. - } else { - ss << ::android::base::StringPrintf("%8s %7s %7s %7s ", "Vss", "Rss", "Pss", "Uss"); - if (has_swap) { - ss << ::android::base::StringPrintf("%7s %7s %7s ", "Swap", "PSwap", "USwap"); - if (has_zram) { - ss << ::android::base::StringPrintf("%7s ", "ZSwap"); - } - } - } - - ss << "cmdline"; -} - -static void print_process_record(std::stringstream& ss, ProcessRecord& proc) { - ss << ::android::base::StringPrintf("%5d ", proc.pid()); - if (show_oomadj) { - ss << ::android::base::StringPrintf("%5d ", proc.oomadj()); - } - - if (show_wss) { - ss << ::android::base::StringPrintf("%6" PRIu64 "K %6" PRIu64 "K %6" PRIu64 "K ", - proc.Wss().rss / 1024, proc.Wss().pss / 1024, - proc.Wss().uss / 1024); - } else { - ss << ::android::base::StringPrintf("%7" PRIu64 "K %6" PRIu64 "K %6" PRIu64 "K %6" PRIu64 - "K ", - proc.Usage().vss / 1024, proc.Usage().rss / 1024, - proc.Usage().pss / 1024, proc.Usage().uss / 1024); - if (has_swap) { - ss << ::android::base::StringPrintf("%6" PRIu64 "K ", proc.Usage().swap / 1024); - ss << ::android::base::StringPrintf("%6" PRIu64 "K ", proc.proportional_swap() / 1024); - ss << ::android::base::StringPrintf("%6" PRIu64 "K ", proc.unique_swap() / 1024); - if (has_zram) { - ss << ::android::base::StringPrintf("%6" PRIu64 "K ", (proc.zswap() / 1024)); - } - } - } -} - -static void print_processes(std::stringstream& ss, std::vector& procs, - uint16_t* swap_offset_array) { - for (auto& proc : procs) { - total_pss += show_wss ? proc.Wss().pss : proc.Usage().pss; - total_uss += show_wss ? proc.Wss().uss : proc.Usage().uss; - if (!show_wss && has_swap) { - proc.CalculateSwap(swap_offset_array, zram_compression_ratio); - total_swap += proc.Usage().swap; - total_pswap += proc.proportional_swap(); - total_uswap += proc.unique_swap(); - if (has_zram) { - total_zswap += proc.zswap(); - } - } - - print_process_record(ss, proc); - ss << proc.cmdline() << std::endl; - } -} - -static void print_separator(std::stringstream& ss) { - ss << ::android::base::StringPrintf("%5s ", ""); - if (show_oomadj) { - ss << ::android::base::StringPrintf("%5s ", ""); - } - - if (show_wss) { - ss << ::android::base::StringPrintf("%7s %7s %7s ", "", "------", "------"); - } else { - ss << ::android::base::StringPrintf("%8s %7s %7s %7s ", "", "", "------", "------"); - if (has_swap) { - ss << ::android::base::StringPrintf("%7s %7s %7s ", "------", "------", "------"); - if (has_zram) { - ss << ::android::base::StringPrintf("%7s ", "------"); - } - } - } - - ss << ::android::base::StringPrintf("%s", "------"); -} - -static void print_totals(std::stringstream& ss) { - ss << ::android::base::StringPrintf("%5s ", ""); - if (show_oomadj) { - ss << ::android::base::StringPrintf("%5s ", ""); - } - - if (show_wss) { - ss << ::android::base::StringPrintf("%7s %6" PRIu64 "K %6" PRIu64 "K ", "", - total_pss / 1024, total_uss / 1024); - } else { - ss << ::android::base::StringPrintf("%8s %7s %6" PRIu64 "K %6" PRIu64 "K ", "", "", - total_pss / 1024, total_uss / 1024); - if (has_swap) { - ss << ::android::base::StringPrintf("%6" PRIu64 "K ", total_swap / 1024); - ss << ::android::base::StringPrintf("%6" PRIu64 "K ", total_pswap / 1024); - ss << ::android::base::StringPrintf("%6" PRIu64 "K ", total_uswap / 1024); - if (has_zram) { - ss << ::android::base::StringPrintf("%6" PRIu64 "K ", total_zswap / 1024); - } - } - } - ss << "TOTAL"; -} - -static void print_sysmeminfo(std::stringstream& ss, ::android::meminfo::SysMemInfo& smi) { - if (has_swap) { - ss << ::android::base::StringPrintf("ZRAM: %" PRIu64 "K physical used for %" PRIu64 - "K in swap " - "(%" PRIu64 "K total swap)", - smi.mem_zram_kb(), - (smi.mem_swap_kb() - smi.mem_swap_free_kb()), - smi.mem_swap_kb()) - << std::endl; - } - - ss << ::android::base::StringPrintf(" RAM: %" PRIu64 "K total, %" PRIu64 "K free, %" PRIu64 - "K buffers, " - "%" PRIu64 "K cached, %" PRIu64 "K shmem, %" PRIu64 - "K slab", - smi.mem_total_kb(), smi.mem_free_kb(), smi.mem_buffers_kb(), - smi.mem_cached_kb(), smi.mem_shmem_kb(), smi.mem_slab_kb()); -} - -int main(int argc, char* argv[]) { - auto pss_sort = [](ProcessRecord& a, ProcessRecord& b) { - MemUsage stats_a = show_wss ? a.Wss() : a.Usage(); - MemUsage stats_b = show_wss ? b.Wss() : b.Usage(); - return reverse_sort ? stats_a.pss < stats_b.pss : stats_a.pss > stats_b.pss; - }; - - auto uss_sort = [](ProcessRecord& a, ProcessRecord& b) { - MemUsage stats_a = show_wss ? a.Wss() : a.Usage(); - MemUsage stats_b = show_wss ? b.Wss() : b.Usage(); - return reverse_sort ? stats_a.uss < stats_b.uss : stats_a.uss > stats_b.uss; - }; - - auto rss_sort = [](ProcessRecord& a, ProcessRecord& b) { - MemUsage stats_a = show_wss ? a.Wss() : a.Usage(); - MemUsage stats_b = show_wss ? b.Wss() : b.Usage(); - return reverse_sort ? stats_a.rss < stats_b.rss : stats_a.rss > stats_b.rss; - }; - - auto vss_sort = [](ProcessRecord& a, ProcessRecord& b) { - MemUsage stats_a = show_wss ? a.Wss() : a.Usage(); - MemUsage stats_b = show_wss ? b.Wss() : b.Usage(); - return reverse_sort ? stats_a.vss < stats_b.vss : stats_a.vss > stats_b.vss; - }; - - auto swap_sort = [](ProcessRecord& a, ProcessRecord& b) { - MemUsage stats_a = show_wss ? a.Wss() : a.Usage(); - MemUsage stats_b = show_wss ? b.Wss() : b.Usage(); - return reverse_sort ? stats_a.swap < stats_b.swap : stats_a.swap > stats_b.swap; - }; - - auto oomadj_sort = [](ProcessRecord& a, ProcessRecord& b) { - return reverse_sort ? a.oomadj() < b.oomadj() : a.oomadj() > b.oomadj(); - }; - - // default PSS sort - std::function proc_sort = pss_sort; - - // count all pages by default - uint64_t pgflags = 0; - uint64_t pgflags_mask = 0; - - int opt; - while ((opt = getopt(argc, argv, "cChkoprRsuvwW")) != -1) { - switch (opt) { - case 'c': - pgflags = 0; - pgflags_mask = (1 << KPF_SWAPBACKED); - break; - case 'C': - pgflags = (1 << KPF_SWAPBACKED); - pgflags_mask = (1 << KPF_SWAPBACKED); - break; - case 'h': - usage(EXIT_SUCCESS); - case 'k': - pgflags = (1 << KPF_KSM); - pgflags_mask = (1 << KPF_KSM); - break; - case 'o': - proc_sort = oomadj_sort; - show_oomadj = true; - break; - case 'p': - proc_sort = pss_sort; - break; - case 'r': - proc_sort = rss_sort; - break; - case 'R': - reverse_sort = true; - break; - case 's': - proc_sort = swap_sort; - break; - case 'u': - proc_sort = uss_sort; - break; - case 'v': - proc_sort = vss_sort; - break; - case 'w': - show_wss = true; - break; - case 'W': - reset_wss = true; - break; - default: - usage(EXIT_FAILURE); - } - } - - std::vector pids; - std::vector procs; - if (reset_wss) { - if (!read_all_pids(&pids, - [&](pid_t pid) -> bool { return ProcMemInfo::ResetWorkingSet(pid); })) { - std::cerr << "Failed to reset working set of all processes" << std::endl; - exit(EXIT_FAILURE); - } - // we are done, all other options passed to procrank are ignored in the presence of '-W' - return 0; - } - - ::android::meminfo::SysMemInfo smi; - if (!smi.ReadMemInfo()) { - std::cerr << "Failed to get system memory info" << std::endl; - exit(EXIT_FAILURE); - } - - // Figure out swap and zram - uint64_t swap_total = smi.mem_swap_kb() * 1024; - has_swap = swap_total > 0; - // Allocate the swap array - auto swap_offset_array = std::make_unique(swap_total / getpagesize()); - if (has_swap) { - has_zram = smi.mem_zram_kb() > 0; - if (has_zram) { - zram_compression_ratio = static_cast(smi.mem_zram_kb()) / - (smi.mem_swap_kb() - smi.mem_swap_free_kb()); - } - } - - auto mark_swap_usage = [&](pid_t pid) -> bool { - ProcessRecord proc(pid, show_wss, pgflags, pgflags_mask); - if (!proc.valid()) { - // Check to see if the process is still around, skip the process if the proc - // directory is inaccessible. It was most likely killed while creating the process - // record - std::string procdir = ::android::base::StringPrintf("/proc/%d", pid); - if (access(procdir.c_str(), F_OK | R_OK)) return true; - - // Warn if we failed to gather process stats even while it is still alive. - // Return success here, so we continue to print stats for other processes. - std::cerr << "warning: failed to create process record for: " << pid << std::endl; - return true; - } - - // Skip processes with no memory mappings - uint64_t vss = show_wss ? proc.Wss().vss : proc.Usage().vss; - if (vss == 0) return true; - - // collect swap_offset counts from all processes in 1st pass - if (!show_wss && has_swap && - !count_swap_offsets(proc, swap_offset_array.get(), swap_total / getpagesize())) { - std::cerr << "Failed to count swap offsets for process: " << pid << std::endl; - return false; - } - - procs.emplace_back(std::move(proc)); - return true; - }; - - // Get a list of all pids currently running in the system in 1st pass through all processes. - // Mark each swap offset used by the process as we find them for calculating proportional - // swap usage later. - if (!read_all_pids(&pids, mark_swap_usage)) { - std::cerr << "Failed to read all pids from the system" << std::endl; - exit(EXIT_FAILURE); - } - - std::stringstream ss; - if (procs.empty()) { - // This would happen in corner cases where procrank is being run to find KSM usage on a - // system with no KSM and combined with working set determination as follows - // procrank -w -u -k - // procrank -w -s -k - // procrank -w -o -k - ss << "" << std::endl << std::endl; - print_sysmeminfo(ss, smi); - ss << std::endl; - std::cout << ss.str(); - return 0; - } - - // Sort all process records, default is PSS descending - std::sort(procs.begin(), procs.end(), proc_sort); - - // start dumping output in string stream - print_header(ss); - ss << std::endl; - - // 2nd pass to calculate and get per process stats to add them up - print_processes(ss, procs, swap_offset_array.get()); - - // Add separator to output - print_separator(ss); - ss << std::endl; - - // Add totals to output - print_totals(ss); - ss << std::endl << std::endl; - - // Add system information at the end - print_sysmeminfo(ss, smi); - ss << std::endl; - - // dump on the screen - std::cout << ss.str(); - - return 0; -} diff --git a/libmeminfo/tools/showmap.cpp b/libmeminfo/tools/showmap.cpp deleted file mode 100644 index 72ab0f390..000000000 --- a/libmeminfo/tools/showmap.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -using ::android::meminfo::Vma; - -struct VmaInfo { - Vma vma; - bool is_bss; - uint32_t count; - - VmaInfo() = default; - VmaInfo(const Vma& v) : vma(v), is_bss(false), count(1) {} - VmaInfo(const Vma& v, bool bss) : vma(v), is_bss(bss), count(1) {} - VmaInfo(const Vma& v, const std::string& name, bool bss) : vma(v), is_bss(bss), count(1) { - vma.name = name; - } -}; - -// Global options -static std::string g_filename = ""; -static bool g_merge_by_names = false; -static bool g_terse = false; -static bool g_verbose = false; -static bool g_show_addr = false; -static bool g_quiet = false; -static pid_t g_pid = -1; - -static VmaInfo g_total; -static std::vector g_vmas; - -[[noreturn]] static void usage(const char* progname, int exit_status) { - fprintf(stderr, - "%s [-aqtv] [-f FILE] PID\n" - "-a\taddresses (show virtual memory map)\n" - "-q\tquiet (don't show error if map could not be read)\n" - "-t\tterse (show only items with private pages)\n" - "-v\tverbose (don't coalesce maps with the same name)\n" - "-f\tFILE (read from input from FILE instead of PID)\n", - progname); - - exit(exit_status); -} - -static bool is_library(const std::string& name) { - return (name.size() > 4) && (name[0] == '/') && ::android::base::EndsWith(name, ".so"); -} - -static bool insert_before(const VmaInfo& a, const VmaInfo& b) { - if (g_show_addr) { - return (a.vma.start < b.vma.start || (a.vma.start == b.vma.start && a.vma.end < b.vma.end)); - } - - return strcmp(a.vma.name.c_str(), b.vma.name.c_str()) < 0; -} - -static void collect_vma(const Vma& vma) { - if (g_vmas.empty()) { - g_vmas.emplace_back(vma); - return; - } - - VmaInfo current(vma); - VmaInfo& last = g_vmas.back(); - // determine if this is bss; - if (vma.name.empty()) { - if (last.vma.end == current.vma.start && is_library(last.vma.name)) { - current.vma.name = last.vma.name; - current.is_bss = true; - } else { - current.vma.name = "[anon]"; - } - } - - std::vector::iterator it; - for (it = g_vmas.begin(); it != g_vmas.end(); it++) { - if (g_merge_by_names && (it->vma.name == current.vma.name)) { - it->vma.usage.vss += current.vma.usage.vss; - it->vma.usage.rss += current.vma.usage.rss; - it->vma.usage.pss += current.vma.usage.pss; - - it->vma.usage.shared_clean += current.vma.usage.shared_clean; - it->vma.usage.shared_dirty += current.vma.usage.shared_dirty; - it->vma.usage.private_clean += current.vma.usage.private_clean; - it->vma.usage.private_dirty += current.vma.usage.private_dirty; - it->vma.usage.swap += current.vma.usage.swap; - it->vma.usage.swap_pss += current.vma.usage.swap_pss; - it->is_bss &= current.is_bss; - it->count++; - break; - } - - if (insert_before(current, *it)) { - g_vmas.insert(it, current); - break; - } - } - - if (it == g_vmas.end()) { - g_vmas.emplace_back(current); - } -} - -static void print_header() { - const char* addr1 = g_show_addr ? " start end " : ""; - const char* addr2 = g_show_addr ? " addr addr " : ""; - - printf("%s virtual shared shared private private\n", addr1); - printf("%s size RSS PSS clean dirty clean dirty swap swapPSS", - addr2); - if (!g_verbose && !g_show_addr) { - printf(" # "); - } - if (g_verbose) { - printf(" flags "); - } - printf(" object\n"); -} - -static void print_divider() { - if (g_show_addr) { - printf("-------- -------- "); - } - printf("-------- -------- -------- -------- -------- -------- -------- -------- -------- "); - if (!g_verbose && !g_show_addr) { - printf("---- "); - } - if (g_verbose) { - printf("------ "); - } - printf("------------------------------\n"); -} - -static void print_vmainfo(const VmaInfo& v, bool total) { - if (g_show_addr) { - if (total) { - printf(" "); - } else { - printf("%16" PRIx64 " %16" PRIx64 " ", v.vma.start, v.vma.end); - } - } - printf("%8" PRIu64 " %8" PRIu64 " %8" PRIu64 " %8" PRIu64 " %8" PRIu64 " %8" PRIu64 " %8" PRIu64 - " %8" PRIu64 " %8" PRIu64 " ", - v.vma.usage.vss, v.vma.usage.rss, v.vma.usage.pss, v.vma.usage.shared_clean, - v.vma.usage.shared_dirty, v.vma.usage.private_clean, v.vma.usage.private_dirty, - v.vma.usage.swap, v.vma.usage.swap_pss); - if (!g_verbose && !g_show_addr) { - printf("%4" PRIu32 " ", v.count); - } - if (g_verbose) { - if (total) { - printf(" "); - } else { - std::string flags_str("---"); - if (v.vma.flags & PROT_READ) flags_str[0] = 'r'; - if (v.vma.flags & PROT_WRITE) flags_str[1] = 'w'; - if (v.vma.flags & PROT_EXEC) flags_str[2] = 'x'; - - printf("%6s ", flags_str.c_str()); - } - } -} - -static int showmap(void) { - if (!::android::meminfo::ForEachVmaFromFile(g_filename, collect_vma)) { - if (!g_quiet) { - fprintf(stderr, "Failed to parse file %s\n", g_filename.c_str()); - } - return 1; - } - - print_header(); - print_divider(); - - for (const auto& v : g_vmas) { - g_total.vma.usage.vss += v.vma.usage.vss; - g_total.vma.usage.rss += v.vma.usage.rss; - g_total.vma.usage.pss += v.vma.usage.pss; - - g_total.vma.usage.private_clean += v.vma.usage.private_clean; - g_total.vma.usage.private_dirty += v.vma.usage.private_dirty; - g_total.vma.usage.shared_clean += v.vma.usage.shared_clean; - g_total.vma.usage.shared_dirty += v.vma.usage.shared_dirty; - - g_total.vma.usage.swap += v.vma.usage.swap; - g_total.vma.usage.swap_pss += v.vma.usage.swap_pss; - g_total.count += v.count; - - if (g_terse && !(v.vma.usage.private_dirty || v.vma.usage.private_clean)) { - continue; - } - - print_vmainfo(v, false); - printf("%s%s\n", v.vma.name.c_str(), v.is_bss ? " [bss]" : ""); - } - - print_divider(); - print_header(); - print_divider(); - - print_vmainfo(g_total, true); - printf("TOTAL\n"); - - return 0; -} - -int main(int argc, char* argv[]) { - signal(SIGPIPE, SIG_IGN); - struct option longopts[] = { - {"help", no_argument, nullptr, 'h'}, - {0, 0, nullptr, 0}, - }; - - int opt; - while ((opt = getopt_long(argc, argv, "tvaqf:h", longopts, nullptr)) != -1) { - switch (opt) { - case 't': - g_terse = true; - break; - case 'a': - g_show_addr = true; - break; - case 'v': - g_verbose = true; - break; - case 'q': - g_quiet = true; - break; - case 'f': - g_filename = optarg; - break; - case 'h': - usage(argv[0], EXIT_SUCCESS); - default: - usage(argv[0], EXIT_FAILURE); - } - } - - if (g_filename.empty()) { - if ((argc - 1) < optind) { - fprintf(stderr, "Invalid arguments: Must provide at the end\n"); - usage(argv[0], EXIT_FAILURE); - } - - g_pid = atoi(argv[optind]); - if (g_pid <= 0) { - fprintf(stderr, "Invalid process id %s\n", argv[optind]); - usage(argv[0], EXIT_FAILURE); - } - - g_filename = ::android::base::StringPrintf("/proc/%d/smaps", g_pid); - } - - g_merge_by_names = !g_verbose && !g_show_addr; - return showmap(); -} diff --git a/libmeminfo/tools/wsstop.cpp b/libmeminfo/tools/wsstop.cpp deleted file mode 100644 index 368d04edf..000000000 --- a/libmeminfo/tools/wsstop.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -using ::android::meminfo::ProcMemInfo; -using ::android::meminfo::Vma; - -// Global options -static int32_t g_delay = 0; -static int32_t g_total = 2; -static pid_t g_pid = -1; - -[[noreturn]] static void usage(int exit_status) { - fprintf(stderr, - "%s [-d DELAY_BETWEEN_EACH_SAMPLE] [-n REFRESH_TOTAL] PID\n" - "-d\tdelay between each working set sample (default 0)\n" - "-n\ttotal number of refreshes before we exit (default 2)\n", - getprogname()); - - exit(exit_status); -} - -static void print_header() { - const char* addr1 = " start end "; - const char* addr2 = " addr addr "; - - printf("%s virtual shared shared private private\n", addr1); - printf("%s size RSS PSS clean dirty clean dirty swap " - "swapPSS", - addr2); - printf(" object\n"); -} - -static void print_divider() { - printf("---------------- ---------------- "); - printf("--------- --------- --------- --------- --------- --------- --------- --------- " - "--------- "); - printf("------------------------------\n"); -} - -static void print_vma(const Vma& v) { - printf("%16" PRIx64 " %16" PRIx64 " ", v.start, v.end); - printf("%8" PRIu64 "K %8" PRIu64 "K %8" PRIu64 "K %8" PRIu64 "K %8" PRIu64 "K %8" PRIu64 - "K %8" PRIu64 "K %8" PRIu64 "K %8" PRIu64 "K ", - v.usage.vss / 1024, v.usage.rss / 1024, v.usage.pss / 1024, v.usage.shared_clean / 1024, - v.usage.shared_dirty / 1024, v.usage.private_clean / 1024, v.usage.private_dirty / 1024, - v.usage.swap / 1024, v.usage.swap_pss / 1024); - printf("%s\n", v.name.c_str()); -} - -static bool same_vma(const Vma& cur, const Vma& last) { - return (cur.start == last.start && cur.end == last.end && cur.name == last.name && - cur.flags == last.flags && cur.offset == last.offset); -} - -static Vma diff_vma_params(const Vma& cur, const Vma& last) { - Vma res; - res.usage.shared_clean = cur.usage.shared_clean > last.usage.shared_clean - ? cur.usage.shared_clean - last.usage.shared_clean - : 0; - res.usage.shared_dirty = cur.usage.shared_dirty > last.usage.shared_dirty - ? cur.usage.shared_dirty - last.usage.shared_dirty - : 0; - res.usage.private_clean = cur.usage.private_clean > last.usage.private_clean - ? cur.usage.private_clean - last.usage.private_clean - : 0; - res.usage.private_dirty = cur.usage.private_dirty > last.usage.private_dirty - ? cur.usage.private_dirty - last.usage.private_dirty - : 0; - - res.usage.rss = cur.usage.rss > last.usage.rss ? cur.usage.rss - last.usage.rss : 0; - res.usage.pss = cur.usage.pss > last.usage.pss ? cur.usage.pss - last.usage.pss : 0; - res.usage.uss = cur.usage.uss > last.usage.uss ? cur.usage.uss - last.usage.uss : 0; - res.usage.swap = cur.usage.swap > last.usage.swap ? cur.usage.swap - last.usage.swap : 0; - res.usage.swap_pss = - cur.usage.swap_pss > last.usage.swap_pss ? cur.usage.swap_pss - last.usage.swap_pss : 0; - - // set vma properties to the same as the current one. - res.start = cur.start; - res.end = cur.end; - res.offset = cur.offset; - res.flags = cur.flags; - res.name = cur.name; - return res; -} - -static void diff_workingset(std::vector& wss, std::vector& old, std::vector* res) { - res->clear(); - auto vma_sorter = [](const Vma& a, const Vma& b) { return a.start < b.start; }; - std::sort(wss.begin(), wss.end(), vma_sorter); - std::sort(old.begin(), old.end(), vma_sorter); - if (old.empty()) { - *res = wss; - return; - } - - for (auto& i : wss) { - bool found_same_vma = false; - // TODO: This is highly inefficient, fix it if it takes - // too long. Worst case will be system_server - for (auto& j : old) { - if (same_vma(i, j)) { - res->emplace_back(diff_vma_params(i, j)); - found_same_vma = true; - break; - } - } - - if (!found_same_vma) { - res->emplace_back(i); - } - } - - std::sort(res->begin(), res->end(), vma_sorter); - return; -} - -static int workingset() { - std::vector last_wss = {}; - std::vector diff_wss = {}; - uint32_t nr_refresh = 0; - - while (true) { - std::unique_ptr proc_mem = std::make_unique(g_pid, true); - std::vector wss = proc_mem->MapsWithPageIdle(); - - diff_workingset(wss, last_wss, &diff_wss); - diff_wss.erase(std::remove_if(diff_wss.begin(), diff_wss.end(), - [](const auto& v) { return v.usage.rss == 0; }), - diff_wss.end()); - if ((nr_refresh % 5) == 0) { - print_header(); - print_divider(); - } - - for (const auto& v : diff_wss) { - print_vma(v); - } - - nr_refresh++; - if (nr_refresh == g_total) { - break; - } - - last_wss = wss; - sleep(g_delay); - print_divider(); - } - - return 0; -} - -int main(int argc, char* argv[]) { - struct option longopts[] = { - {"help", no_argument, nullptr, 'h'}, - {0, 0, nullptr, 0}, - }; - - int opt; - while ((opt = getopt_long(argc, argv, "d:n:h", longopts, nullptr)) != -1) { - switch (opt) { - case 'd': - g_delay = atoi(optarg); - break; - case 'n': - g_total = atoi(optarg); - break; - case 'h': - usage(EXIT_SUCCESS); - default: - usage(EXIT_FAILURE); - } - } - - if ((argc - 1) < optind) { - fprintf(stderr, "Invalid arguments: Must provide at the end\n"); - usage(EXIT_FAILURE); - } - - g_pid = atoi(argv[optind]); - if (g_pid <= 0) { - fprintf(stderr, "Invalid process id %s\n", argv[optind]); - usage(EXIT_FAILURE); - } - - if (!::android::meminfo::PageAcct::KernelHasPageIdle()) { - fprintf(stderr, "Missing support for Idle page tracking in the kernel\n"); - return 0; - } - - return workingset(); -} diff --git a/libmeminfo/vts/Android.bp b/libmeminfo/vts/Android.bp deleted file mode 100644 index a92f669b0..000000000 --- a/libmeminfo/vts/Android.bp +++ /dev/null @@ -1,33 +0,0 @@ -// 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_defaults { - name: "vts_meminfo_defaults", - defaults: ["libmeminfo_defaults"], - srcs: ["vts_meminfo_test.cpp"], - static_libs: ["libmeminfo"], -} - -cc_test { - name: "vts_meminfo_test", - defaults: ["vts_meminfo_defaults"], -} - -cc_test { - name: "vts_core_meminfo_test", - defaults: ["vts_meminfo_defaults"], - test_suites: ["vts-core"], - auto_gen_config: true, - test_min_api_level: 29, -} diff --git a/libmeminfo/vts/Android.mk b/libmeminfo/vts/Android.mk deleted file mode 100644 index 62d68d9c8..000000000 --- a/libmeminfo/vts/Android.mk +++ /dev/null @@ -1,22 +0,0 @@ -# -# 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. -# - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VtsKernelMemInfoTest --include test/vts/tools/build/Android.host_config.mk diff --git a/libmeminfo/vts/AndroidTest.xml b/libmeminfo/vts/AndroidTest.xml deleted file mode 100644 index 9614025ae..000000000 --- a/libmeminfo/vts/AndroidTest.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - diff --git a/libmeminfo/vts/vts_meminfo_test.cpp b/libmeminfo/vts/vts_meminfo_test.cpp deleted file mode 100644 index 3193c3195..000000000 --- a/libmeminfo/vts/vts_meminfo_test.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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 - -#include - -namespace android { -namespace meminfo { - -// /proc//smaps_rollup support is required. -TEST(SmapsRollup, IsSupported) { - // Use init's pid for this test since it's the only known pid. - ASSERT_TRUE(IsSmapsRollupSupported(1)); -} - -} // namespace meminfo -} // namespace android diff --git a/libmemtrack/.clang-format b/libmemtrack/.clang-format deleted file mode 120000 index 1af4f51dd..000000000 --- a/libmemtrack/.clang-format +++ /dev/null @@ -1 +0,0 @@ -../.clang-format-4 \ No newline at end of file diff --git a/libmemtrack/Android.bp b/libmemtrack/Android.bp deleted file mode 100644 index c7dff5a8c..000000000 --- a/libmemtrack/Android.bp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2013 The Android Open Source Project - -cc_library_shared { - name: "libmemtrack", - vendor_available: true, - vndk: { - enabled: true, - }, - srcs: ["memtrack.cpp"], - export_include_dirs: ["include"], - local_include_dirs: ["include"], - include_dirs: ["hardware/libhardware/include"], - shared_libs: [ - "libhardware", - "liblog", - "libbase", - "libhidlbase", - "libutils", - "android.hardware.memtrack@1.0", - ], - cflags: [ - "-Wall", - "-Werror", - ], -} - -cc_binary { - name: "memtrack_test", - srcs: ["memtrack_test.cpp"], - static_libs: ["libc++fs"], - shared_libs: [ - "libbase", - "libmemtrack", - ], - cflags: [ - "-Wall", - "-Werror", - ], -} diff --git a/libmemtrack/OWNERS b/libmemtrack/OWNERS deleted file mode 100644 index 70b375f99..000000000 --- a/libmemtrack/OWNERS +++ /dev/null @@ -1 +0,0 @@ -ccross@google.com diff --git a/libmemtrack/include/memtrack/memtrack.h b/libmemtrack/include/memtrack/memtrack.h deleted file mode 100644 index 2134a6ffe..000000000 --- a/libmemtrack/include/memtrack/memtrack.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2013 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 _LIBMEMTRACK_MEMTRACK_H_ -#define _LIBMEMTRACK_MEMTRACK_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * struct memtrack_proc - * - * an opaque handle to the memory stats on a process. - * Created with memtrack_proc_new, destroyed by - * memtrack_proc_destroy. Can be reused multiple times with - * memtrack_proc_get. - */ -struct memtrack_proc; - -/** - * memtrack_proc_new - * - * Return a new handle to hold process memory stats. - * - * Returns NULL on error. - */ -struct memtrack_proc *memtrack_proc_new(void); - -/** - * memtrack_proc_destroy - * - * Free all memory associated with a process memory stats handle. - */ -void memtrack_proc_destroy(struct memtrack_proc *p); - -/** - * memtrack_proc_get - * - * Fill a process memory stats handle with data about the given pid. Can be - * called on a handle that was just allocated with memtrack_proc_new, - * or on a handle that has been previously passed to memtrack_proc_get - * to replace the data with new data on the same or another process. It is - * expected that the second call on the same handle should not require - * allocating any new memory. - * - * Returns 0 on success, -errno on error. - */ -int memtrack_proc_get(struct memtrack_proc *p, pid_t pid); - -/** - * memtrack_proc_graphics_total - * - * Return total amount of memory that has been allocated for use as window - * buffers. Does not differentiate between memory that has already been - * accounted for by reading /proc/pid/smaps and memory that has not been - * accounted for. - * - * Returns non-negative size in bytes on success, -errno on error. - */ -ssize_t memtrack_proc_graphics_total(struct memtrack_proc *p); - -/** - * memtrack_proc_graphics_pss - * - * Return total amount of memory that has been allocated for use as window - * buffers, but has not already been accounted for by reading /proc/pid/smaps. - * Memory that is shared across processes may already be divided by the - * number of processes that share it (preferred), or may be charged in full to - * every process that shares it, depending on the capabilities of the driver. - * - * Returns non-negative size in bytes on success, -errno on error. - */ -ssize_t memtrack_proc_graphics_pss(struct memtrack_proc *p); - -/** - * memtrack_proc_gl_total - * - * Same as memtrack_proc_graphics_total, but counts GL memory (which - * should not overlap with graphics memory) instead of graphics memory. - * - * Returns non-negative size in bytes on success, -errno on error. - */ -ssize_t memtrack_proc_gl_total(struct memtrack_proc *p); - -/** - * memtrack_proc_gl_pss - * - * Same as memtrack_proc_graphics_total, but counts GL memory (which - * should not overlap with graphics memory) instead of graphics memory. - * - * Returns non-negative size in bytes on success, -errno on error. - */ -ssize_t memtrack_proc_gl_pss(struct memtrack_proc *p); - -/** - * memtrack_proc_other_total - * - * Same as memtrack_proc_graphics_total, but counts miscellaneous memory - * not tracked by gl or graphics calls above. - * - * Returns non-negative size in bytes on success, -errno on error. - */ -ssize_t memtrack_proc_other_total(struct memtrack_proc *p); - -/** - * memtrack_proc_other_pss - * - * Same as memtrack_proc_graphics_total, but counts miscellaneous memory - * not tracked by gl or graphics calls above. - * - * Returns non-negative size in bytes on success, -errno on error. - */ -ssize_t memtrack_proc_other_pss(struct memtrack_proc *p); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libmemtrack/memtrack.cpp b/libmemtrack/memtrack.cpp deleted file mode 100644 index c5e74c103..000000000 --- a/libmemtrack/memtrack.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2013 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 "memtrack" -#include -#include - -#include -#include -#include -#include -#include - -#include - -using android::hardware::memtrack::V1_0::IMemtrack; -using android::hardware::memtrack::V1_0::MemtrackType; -using android::hardware::memtrack::V1_0::MemtrackRecord; -using android::hardware::memtrack::V1_0::MemtrackFlag; -using android::hardware::memtrack::V1_0::MemtrackStatus; -using android::hardware::hidl_vec; -using android::hardware::Return; - -struct memtrack_proc_type { - MemtrackType type; - std::vector records; -}; - -struct memtrack_proc { - pid_t pid; - memtrack_proc_type types[static_cast(MemtrackType::NUM_TYPES)]; -}; - -//TODO(b/31632518) -static android::sp get_instance() { - static android::sp module = IMemtrack::getService(); - if (module == nullptr) { - ALOGE("Couldn't load memtrack module"); - } - return module; -} - -memtrack_proc *memtrack_proc_new(void) -{ - return new memtrack_proc(); -} - -void memtrack_proc_destroy(memtrack_proc *p) -{ - delete(p); -} - -static int memtrack_proc_get_type(memtrack_proc_type *t, - pid_t pid, MemtrackType type) -{ - int err = 0; - android::sp memtrack = get_instance(); - if (memtrack == nullptr) - return -1; - - Return ret = memtrack->getMemory(pid, type, - [&t, &err](MemtrackStatus status, hidl_vec records) { - if (status != MemtrackStatus::SUCCESS) { - err = -1; - t->records.resize(0); - } - t->records.resize(records.size()); - for (size_t i = 0; i < records.size(); i++) { - t->records[i].sizeInBytes = records[i].sizeInBytes; - t->records[i].flags = records[i].flags; - } - }); - return ret.isOk() ? err : -1; -} - -/* TODO: sanity checks on return values from HALs: - * make sure no records have invalid flags set - * - unknown flags - * - too many flags of a single category - * - missing ACCOUNTED/UNACCOUNTED - * make sure there are not overlapping SHARED and SHARED_PSS records - */ -static int memtrack_proc_sanity_check(memtrack_proc* /*p*/) -{ - return 0; -} - -int memtrack_proc_get(memtrack_proc *p, pid_t pid) -{ - if (!p) { - return -EINVAL; - } - - p->pid = pid; - for (uint32_t i = 0; i < (uint32_t)MemtrackType::NUM_TYPES; i++) { - int ret = memtrack_proc_get_type(&p->types[i], pid, (MemtrackType)i); - if (ret != 0) - return ret; - } - - return memtrack_proc_sanity_check(p); -} - -static ssize_t memtrack_proc_sum(memtrack_proc *p, - const std::vector& types, uint32_t flags) -{ - ssize_t sum = 0; - - for (size_t i = 0; i < types.size(); i++) { - memtrack_proc_type type = p->types[static_cast(types[i])]; - std::vector records = type.records; - for (size_t j = 0; j < records.size(); j++) { - if ((records[j].flags & flags) == flags) { - sum += records[j].sizeInBytes; - } - } - } - - return sum; -} - -ssize_t memtrack_proc_graphics_total(memtrack_proc *p) -{ - std::vector types = {MemtrackType::GRAPHICS}; - return memtrack_proc_sum(p, types, 0); -} - -ssize_t memtrack_proc_graphics_pss(memtrack_proc *p) -{ - std::vector types = { MemtrackType::GRAPHICS }; - return memtrack_proc_sum(p, types, - (uint32_t)MemtrackFlag::SMAPS_UNACCOUNTED); -} - -ssize_t memtrack_proc_gl_total(memtrack_proc *p) -{ - std::vector types = { MemtrackType::GL }; - return memtrack_proc_sum(p, types, 0); -} - -ssize_t memtrack_proc_gl_pss(memtrack_proc *p) -{ - std::vector types = { MemtrackType::GL }; - return memtrack_proc_sum(p, types, - (uint32_t)MemtrackFlag::SMAPS_UNACCOUNTED); -} - -ssize_t memtrack_proc_other_total(memtrack_proc *p) -{ - std::vector types = { MemtrackType::MULTIMEDIA, - MemtrackType::CAMERA, MemtrackType::OTHER }; - return memtrack_proc_sum(p, types, 0); -} - -ssize_t memtrack_proc_other_pss(memtrack_proc *p) -{ - std::vector types = { MemtrackType::MULTIMEDIA, - MemtrackType::CAMERA, MemtrackType::OTHER }; - return memtrack_proc_sum(p, types, - (uint32_t)MemtrackFlag::SMAPS_UNACCOUNTED); -} diff --git a/libmemtrack/memtrack_test.cpp b/libmemtrack/memtrack_test.cpp deleted file mode 100644 index aeeaf2467..000000000 --- a/libmemtrack/memtrack_test.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2013 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 - -#include -#include - -#include -#include -#include -#include - -#define DIV_ROUND_UP(x, y) (((x) + (y)-1) / (y)) - -static void getprocname(pid_t pid, std::string* name) { - std::string fname = ::android::base::StringPrintf("/proc/%d/cmdline", pid); - if (!::android::base::ReadFileToString(fname, name)) { - fprintf(stderr, "Failed to read cmdline from: %s\n", fname.c_str()); - *name = ""; - } -} - -int main(int /* argc */, char** /* argv */) { - int ret; - struct memtrack_proc* p; - std::vector pids; - - p = memtrack_proc_new(); - if (p == nullptr) { - fprintf(stderr, "failed to create memtrack process handle\n"); - exit(EXIT_FAILURE); - } - - for (auto& de : std::filesystem::directory_iterator("/proc")) { - if (!std::filesystem::is_directory(de.status())) { - continue; - } - - pid_t pid; - if (!::android::base::ParseInt(de.path().filename().string(), &pid)) { - continue; - } - pids.emplace_back(pid); - } - - for (auto& pid : pids) { - size_t v1; - size_t v2; - size_t v3; - size_t v4; - size_t v5; - size_t v6; - std::string cmdline; - - getprocname(pid, &cmdline); - - ret = memtrack_proc_get(p, pid); - if (ret) { - fprintf(stderr, "failed to get memory info for pid %d: %s (%d)\n", pid, strerror(-ret), - ret); - continue; - } - - v1 = DIV_ROUND_UP(memtrack_proc_graphics_total(p), 1024); - v2 = DIV_ROUND_UP(memtrack_proc_graphics_pss(p), 1024); - v3 = DIV_ROUND_UP(memtrack_proc_gl_total(p), 1024); - v4 = DIV_ROUND_UP(memtrack_proc_gl_pss(p), 1024); - v5 = DIV_ROUND_UP(memtrack_proc_other_total(p), 1024); - v6 = DIV_ROUND_UP(memtrack_proc_other_pss(p), 1024); - - if (v1 | v2 | v3 | v4 | v5 | v6) { - fprintf(stdout, "%5d %6zu %6zu %6zu %6zu %6zu %6zu %s\n", pid, v1, v2, v3, v4, v5, v6, - cmdline.c_str()); - } - } - - memtrack_proc_destroy(p); - - return ret; -} diff --git a/libmemunreachable/.clang-format b/libmemunreachable/.clang-format deleted file mode 120000 index fd0645fdf..000000000 --- a/libmemunreachable/.clang-format +++ /dev/null @@ -1 +0,0 @@ -../.clang-format-2 \ No newline at end of file diff --git a/libmemunreachable/Allocator.cpp b/libmemunreachable/Allocator.cpp deleted file mode 100644 index 1eb7e98c5..000000000 --- a/libmemunreachable/Allocator.cpp +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Copyright (C) 2016 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. - */ - -// Header page: -// -// For minimum allocation size (8 bytes), bitmap can store used allocations for -// up to 4032*8*8=258048, which is 256KiB minus the header page - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "android-base/macros.h" - -#include "Allocator.h" -#include "LinkedList.h" - -namespace android { - -// runtime interfaces used: -// abort -// assert - fprintf + mmap -// mmap -// munmap -// prctl - -constexpr size_t const_log2(size_t n, size_t p = 0) { - return (n <= 1) ? p : const_log2(n / 2, p + 1); -} - -constexpr unsigned int div_round_up(unsigned int x, unsigned int y) { - return (x + y - 1) / y; -} - -static constexpr size_t kPageSize = 4096; -static constexpr size_t kChunkSize = 256 * 1024; -static constexpr size_t kUsableChunkSize = kChunkSize - kPageSize; -static constexpr size_t kMaxBucketAllocationSize = kChunkSize / 4; -static constexpr size_t kMinBucketAllocationSize = 8; -static constexpr unsigned int kNumBuckets = - const_log2(kMaxBucketAllocationSize) - const_log2(kMinBucketAllocationSize) + 1; -static constexpr unsigned int kUsablePagesPerChunk = kUsableChunkSize / kPageSize; - -std::atomic heap_count; - -class Chunk; - -class HeapImpl { - public: - HeapImpl(); - ~HeapImpl(); - void* operator new(std::size_t count) noexcept; - void operator delete(void* ptr); - - void* Alloc(size_t size); - void Free(void* ptr); - bool Empty(); - - void MoveToFullList(Chunk* chunk, int bucket_); - void MoveToFreeList(Chunk* chunk, int bucket_); - - private: - DISALLOW_COPY_AND_ASSIGN(HeapImpl); - - LinkedList free_chunks_[kNumBuckets]; - LinkedList full_chunks_[kNumBuckets]; - - void MoveToList(Chunk* chunk, LinkedList* head); - void* MapAlloc(size_t size); - void MapFree(void* ptr); - void* AllocLocked(size_t size); - void FreeLocked(void* ptr); - - struct MapAllocation { - void* ptr; - size_t size; - MapAllocation* next; - }; - MapAllocation* map_allocation_list_; - std::mutex m_; -}; - -// Integer log 2, rounds down -static inline unsigned int log2(size_t n) { - return 8 * sizeof(unsigned long long) - __builtin_clzll(n) - 1; -} - -static inline unsigned int size_to_bucket(size_t size) { - if (size < kMinBucketAllocationSize) return kMinBucketAllocationSize; - return log2(size - 1) + 1 - const_log2(kMinBucketAllocationSize); -} - -static inline size_t bucket_to_size(unsigned int bucket) { - return kMinBucketAllocationSize << bucket; -} - -static void* MapAligned(size_t size, size_t align) { - const int prot = PROT_READ | PROT_WRITE; - const int flags = MAP_ANONYMOUS | MAP_PRIVATE; - - size = (size + kPageSize - 1) & ~(kPageSize - 1); - - // Over-allocate enough to align - size_t map_size = size + align - kPageSize; - if (map_size < size) { - return nullptr; - } - - void* ptr = mmap(NULL, map_size, prot, flags, -1, 0); - if (ptr == MAP_FAILED) { - return nullptr; - } - - size_t aligned_size = map_size; - void* aligned_ptr = ptr; - - std::align(align, size, aligned_ptr, aligned_size); - - // Trim beginning - if (aligned_ptr != ptr) { - ptrdiff_t extra = reinterpret_cast(aligned_ptr) - reinterpret_cast(ptr); - munmap(ptr, extra); - map_size -= extra; - ptr = aligned_ptr; - } - - // Trim end - if (map_size != size) { - assert(map_size > size); - assert(ptr != NULL); - munmap(reinterpret_cast(reinterpret_cast(ptr) + size), map_size - size); - } - -#if defined(PR_SET_VMA) - prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, reinterpret_cast(ptr), size, - "leak_detector_malloc"); -#endif - - return ptr; -} - -class Chunk { - public: - static void* operator new(std::size_t count) noexcept; - static void operator delete(void* ptr); - Chunk(HeapImpl* heap, int bucket); - ~Chunk() {} - - void* Alloc(); - void Free(void* ptr); - void Purge(); - bool Empty(); - - static Chunk* ptr_to_chunk(void* ptr) { - return reinterpret_cast(reinterpret_cast(ptr) & ~(kChunkSize - 1)); - } - static bool is_chunk(void* ptr) { - return (reinterpret_cast(ptr) & (kChunkSize - 1)) != 0; - } - - unsigned int free_count() { return free_count_; } - HeapImpl* heap() { return heap_; } - LinkedList node_; // linked list sorted by minimum free count - - private: - DISALLOW_COPY_AND_ASSIGN(Chunk); - HeapImpl* heap_; - unsigned int bucket_; - unsigned int allocation_size_; // size of allocations in chunk, min 8 bytes - unsigned int max_allocations_; // maximum number of allocations in the chunk - unsigned int first_free_bitmap_; // index into bitmap for first non-full entry - unsigned int free_count_; // number of available allocations - unsigned int frees_since_purge_; // number of calls to Free since last Purge - - // bitmap of pages that have been dirtied - uint32_t dirty_pages_[div_round_up(kUsablePagesPerChunk, 32)]; - - // bitmap of free allocations. - uint32_t free_bitmap_[kUsableChunkSize / kMinBucketAllocationSize / 32]; - - char data_[0]; - - unsigned int ptr_to_n(void* ptr) { - ptrdiff_t offset = reinterpret_cast(ptr) - reinterpret_cast(data_); - return offset / allocation_size_; - } - void* n_to_ptr(unsigned int n) { return data_ + n * allocation_size_; } -}; -static_assert(sizeof(Chunk) <= kPageSize, "header must fit in page"); - -// Override new operator on chunk to use mmap to allocate kChunkSize -void* Chunk::operator new(std::size_t count __attribute__((unused))) noexcept { - assert(count == sizeof(Chunk)); - void* mem = MapAligned(kChunkSize, kChunkSize); - if (!mem) { - abort(); // throw std::bad_alloc; - } - - return mem; -} - -// Override new operator on chunk to use mmap to allocate kChunkSize -void Chunk::operator delete(void* ptr) { - assert(reinterpret_cast(ptr) == ptr_to_chunk(ptr)); - munmap(ptr, kChunkSize); -} - -Chunk::Chunk(HeapImpl* heap, int bucket) - : node_(this), - heap_(heap), - bucket_(bucket), - allocation_size_(bucket_to_size(bucket)), - max_allocations_(kUsableChunkSize / allocation_size_), - first_free_bitmap_(0), - free_count_(max_allocations_), - frees_since_purge_(0) { - memset(dirty_pages_, 0, sizeof(dirty_pages_)); - memset(free_bitmap_, 0xff, sizeof(free_bitmap_)); -} - -bool Chunk::Empty() { - return free_count_ == max_allocations_; -} - -void* Chunk::Alloc() { - assert(free_count_ > 0); - - unsigned int i = first_free_bitmap_; - while (free_bitmap_[i] == 0) i++; - assert(i < arraysize(free_bitmap_)); - unsigned int bit = __builtin_ffs(free_bitmap_[i]) - 1; - assert(free_bitmap_[i] & (1U << bit)); - free_bitmap_[i] &= ~(1U << bit); - unsigned int n = i * 32 + bit; - assert(n < max_allocations_); - - unsigned int page = n * allocation_size_ / kPageSize; - assert(page / 32 < arraysize(dirty_pages_)); - dirty_pages_[page / 32] |= 1U << (page % 32); - - free_count_--; - if (free_count_ == 0) { - heap_->MoveToFullList(this, bucket_); - } - - return n_to_ptr(n); -} - -void Chunk::Free(void* ptr) { - assert(is_chunk(ptr)); - assert(ptr_to_chunk(ptr) == this); - - unsigned int n = ptr_to_n(ptr); - unsigned int i = n / 32; - unsigned int bit = n % 32; - - assert(i < arraysize(free_bitmap_)); - assert(!(free_bitmap_[i] & (1U << bit))); - free_bitmap_[i] |= 1U << bit; - free_count_++; - - if (i < first_free_bitmap_) { - first_free_bitmap_ = i; - } - - if (free_count_ == 1) { - heap_->MoveToFreeList(this, bucket_); - } else { - // TODO(ccross): move down free list if necessary - } - - if (frees_since_purge_++ * allocation_size_ > 16 * kPageSize) { - Purge(); - } -} - -void Chunk::Purge() { - frees_since_purge_ = 0; - - // unsigned int allocsPerPage = kPageSize / allocation_size_; -} - -// Override new operator on HeapImpl to use mmap to allocate a page -void* HeapImpl::operator new(std::size_t count __attribute__((unused))) noexcept { - assert(count == sizeof(HeapImpl)); - void* mem = MapAligned(kPageSize, kPageSize); - if (!mem) { - abort(); // throw std::bad_alloc; - } - - heap_count++; - return mem; -} - -void HeapImpl::operator delete(void* ptr) { - munmap(ptr, kPageSize); -} - -HeapImpl::HeapImpl() : free_chunks_(), full_chunks_(), map_allocation_list_(NULL) {} - -bool HeapImpl::Empty() { - for (unsigned int i = 0; i < kNumBuckets; i++) { - for (LinkedList* it = free_chunks_[i].next(); it->data() != NULL; it = it->next()) { - if (!it->data()->Empty()) { - return false; - } - } - for (LinkedList* it = full_chunks_[i].next(); it->data() != NULL; it = it->next()) { - if (!it->data()->Empty()) { - return false; - } - } - } - - return true; -} - -HeapImpl::~HeapImpl() { - for (unsigned int i = 0; i < kNumBuckets; i++) { - while (!free_chunks_[i].empty()) { - Chunk* chunk = free_chunks_[i].next()->data(); - chunk->node_.remove(); - delete chunk; - } - while (!full_chunks_[i].empty()) { - Chunk* chunk = full_chunks_[i].next()->data(); - chunk->node_.remove(); - delete chunk; - } - } -} - -void* HeapImpl::Alloc(size_t size) { - std::lock_guard lk(m_); - return AllocLocked(size); -} - -void* HeapImpl::AllocLocked(size_t size) { - if (size > kMaxBucketAllocationSize) { - return MapAlloc(size); - } - int bucket = size_to_bucket(size); - if (free_chunks_[bucket].empty()) { - Chunk* chunk = new Chunk(this, bucket); - free_chunks_[bucket].insert(chunk->node_); - } - return free_chunks_[bucket].next()->data()->Alloc(); -} - -void HeapImpl::Free(void* ptr) { - std::lock_guard lk(m_); - FreeLocked(ptr); -} - -void HeapImpl::FreeLocked(void* ptr) { - if (!Chunk::is_chunk(ptr)) { - HeapImpl::MapFree(ptr); - } else { - Chunk* chunk = Chunk::ptr_to_chunk(ptr); - assert(chunk->heap() == this); - chunk->Free(ptr); - } -} - -void* HeapImpl::MapAlloc(size_t size) { - size = (size + kPageSize - 1) & ~(kPageSize - 1); - - MapAllocation* allocation = reinterpret_cast(AllocLocked(sizeof(MapAllocation))); - void* ptr = MapAligned(size, kChunkSize); - if (!ptr) { - FreeLocked(allocation); - abort(); // throw std::bad_alloc; - } - allocation->ptr = ptr; - allocation->size = size; - allocation->next = map_allocation_list_; - map_allocation_list_ = allocation; - - return ptr; -} - -void HeapImpl::MapFree(void* ptr) { - MapAllocation** allocation = &map_allocation_list_; - while (*allocation && (*allocation)->ptr != ptr) allocation = &(*allocation)->next; - - assert(*allocation != nullptr); - - munmap((*allocation)->ptr, (*allocation)->size); - FreeLocked(*allocation); - - *allocation = (*allocation)->next; -} - -void HeapImpl::MoveToFreeList(Chunk* chunk, int bucket) { - MoveToList(chunk, &free_chunks_[bucket]); -} - -void HeapImpl::MoveToFullList(Chunk* chunk, int bucket) { - MoveToList(chunk, &full_chunks_[bucket]); -} - -void HeapImpl::MoveToList(Chunk* chunk, LinkedList* head) { - // Remove from old list - chunk->node_.remove(); - - LinkedList* node = head; - // Insert into new list, sorted by lowest free count - while (node->next() != head && node->data() != nullptr && - node->data()->free_count() < chunk->free_count()) - node = node->next(); - - node->insert(chunk->node_); -} - -Heap::Heap() { - // HeapImpl overloads the operator new in order to mmap itself instead of - // allocating with new. - // Can't use a shared_ptr to store the result because shared_ptr needs to - // allocate, and Allocator is still being constructed. - impl_ = new HeapImpl(); - owns_impl_ = true; -} - -Heap::~Heap() { - if (owns_impl_) { - delete impl_; - } -} - -void* Heap::allocate(size_t size) { - return impl_->Alloc(size); -} - -void Heap::deallocate(void* ptr) { - impl_->Free(ptr); -} - -void Heap::deallocate(HeapImpl* impl, void* ptr) { - impl->Free(ptr); -} - -bool Heap::empty() { - return impl_->Empty(); -} - -} // namespace android diff --git a/libmemunreachable/Allocator.h b/libmemunreachable/Allocator.h deleted file mode 100644 index 837a12b7b..000000000 --- a/libmemunreachable/Allocator.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_ALLOCATOR_H_ -#define LIBMEMUNREACHABLE_ALLOCATOR_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace android { - -extern std::atomic heap_count; - -class HeapImpl; - -template -class Allocator; - -// Non-templated class that implements wraps HeapImpl to keep -// implementation out of the header file -class Heap { - public: - Heap(); - ~Heap(); - - // Copy constructor that does not take ownership of impl_ - Heap(const Heap& other) : impl_(other.impl_), owns_impl_(false) {} - - // Assignment disabled - Heap& operator=(const Heap&) = delete; - - // Allocate size bytes - void* allocate(size_t size); - - // Deallocate allocation returned by allocate - void deallocate(void*); - - bool empty(); - - static void deallocate(HeapImpl* impl, void* ptr); - - // Allocate a class of type T - template - T* allocate() { - return reinterpret_cast(allocate(sizeof(T))); - } - - // Comparators, copied objects will be equal - bool operator==(const Heap& other) const { return impl_ == other.impl_; } - bool operator!=(const Heap& other) const { return !(*this == other); } - - // std::unique_ptr wrapper that allocates using allocate and deletes using - // deallocate - template - using unique_ptr = std::unique_ptr>; - - template - unique_ptr make_unique(Args&&... args) { - HeapImpl* impl = impl_; - return unique_ptr(new (allocate()) T(std::forward(args)...), [impl](void* ptr) { - reinterpret_cast(ptr)->~T(); - deallocate(impl, ptr); - }); - } - - // std::unique_ptr wrapper that allocates using allocate and deletes using - // deallocate - template - using shared_ptr = std::shared_ptr; - - template - shared_ptr make_shared(Args&&... args); - - protected: - HeapImpl* impl_; - bool owns_impl_; -}; - -// STLAllocator implements the std allocator interface on top of a Heap -template -class STLAllocator { - public: - using value_type = T; - ~STLAllocator() {} - - // Construct an STLAllocator on top of a Heap - STLAllocator(const Heap& heap) - : // NOLINT, implicit - heap_(heap) {} - - // Rebind an STLAllocator from an another STLAllocator - template - STLAllocator(const STLAllocator& other) - : // NOLINT, implicit - heap_(other.heap_) {} - - STLAllocator(const STLAllocator&) = default; - STLAllocator& operator=(const STLAllocator&) = default; - - T* allocate(std::size_t n) { return reinterpret_cast(heap_.allocate(n * sizeof(T))); } - - void deallocate(T* ptr, std::size_t) { heap_.deallocate(ptr); } - - template - bool operator==(const STLAllocator& other) const { - return heap_ == other.heap_; - } - template - inline bool operator!=(const STLAllocator& other) const { - return !(this == other); - } - - template - friend class STLAllocator; - - protected: - Heap heap_; -}; - -// Allocator extends STLAllocator with some convenience methods for allocating -// a single object and for constructing unique_ptr and shared_ptr objects with -// appropriate deleters. -template -class Allocator : public STLAllocator { - public: - ~Allocator() {} - - Allocator(const Heap& other) - : // NOLINT, implicit - STLAllocator(other) {} - - template - Allocator(const STLAllocator& other) - : // NOLINT, implicit - STLAllocator(other) {} - - Allocator(const Allocator&) = default; - Allocator& operator=(const Allocator&) = default; - - using STLAllocator::allocate; - using STLAllocator::deallocate; - using STLAllocator::heap_; - - T* allocate() { return STLAllocator::allocate(1); } - void deallocate(void* ptr) { heap_.deallocate(ptr); } - - using shared_ptr = Heap::shared_ptr; - - template - shared_ptr make_shared(Args&&... args) { - return heap_.template make_shared(std::forward(args)...); - } - - using unique_ptr = Heap::unique_ptr; - - template - unique_ptr make_unique(Args&&... args) { - return heap_.template make_unique(std::forward(args)...); - } -}; - -// std::unique_ptr wrapper that allocates using allocate and deletes using -// deallocate. Implemented outside class definition in order to pass -// Allocator to shared_ptr. -template -inline Heap::shared_ptr Heap::make_shared(Args&&... args) { - return std::allocate_shared, Args...>(Allocator(*this), - std::forward(args)...); -} - -namespace allocator { - -template -using vector = std::vector>; - -template -using list = std::list>; - -template > -using map = std::map>>; - -template , class KeyEqual = std::equal_to> -using unordered_map = - std::unordered_map>>; - -template , class KeyEqual = std::equal_to> -using unordered_set = std::unordered_set>; - -template > -using set = std::set>; - -using string = std::basic_string, Allocator>; -} - -} // namespace android - -#endif diff --git a/libmemunreachable/Android.bp b/libmemunreachable/Android.bp deleted file mode 100644 index f20df19e4..000000000 --- a/libmemunreachable/Android.bp +++ /dev/null @@ -1,120 +0,0 @@ -cc_defaults { - name: "libmemunreachable_defaults", - - cflags: [ - "-Wall", - "-Wextra", - "-Werror", - ], - shared_libs: [ - "libbase", - ], - - target: { - android: { - static_libs: ["libasync_safe"], - }, - host: { - shared_libs: ["liblog"], - }, - }, -} - -cc_library { - name: "libmemunreachable", - vendor_available: true, - defaults: ["libmemunreachable_defaults"], - srcs: [ - "Allocator.cpp", - "Binder.cpp", - "HeapWalker.cpp", - "LeakFolding.cpp", - "LeakPipe.cpp", - "MemUnreachable.cpp", - "ProcessMappings.cpp", - "PtracerThread.cpp", - "ThreadCapture.cpp", - ], - - static_libs: [ - "libc_malloc_debug_backtrace", - "libprocinfo", - ], - // Only need this for arm since libc++ uses its own unwind code that - // doesn't mix with the other default unwind code. - arch: { - arm: { - static_libs: ["libunwind_llvm"], - }, - }, - export_include_dirs: ["include"], - local_include_dirs: ["include"], - version_script: "libmemunreachable.map", -} - -// Integration test that runs against the public API of libmemunreachable -cc_test { - name: "memunreachable_test", - defaults: ["libmemunreachable_defaults"], - srcs: [ - "tests/MemUnreachable_test.cpp", - ], - shared_libs: ["libmemunreachable"], - - test_suites: ["device-tests"], -} - -cc_test { - name: "memunreachable_unit_test", - defaults: ["libmemunreachable_defaults"], - host_supported: true, - srcs: [ - "tests/Allocator_test.cpp", - "tests/HeapWalker_test.cpp", - "tests/LeakFolding_test.cpp", - ], - - target: { - android: { - srcs: [ - "tests/DisableMalloc_test.cpp", - "tests/MemUnreachable_test.cpp", - "tests/ThreadCapture_test.cpp", - ], - static_libs: [ - "libmemunreachable", - "libc_malloc_debug_backtrace", - ], - }, - host: { - srcs: [ - "Allocator.cpp", - "HeapWalker.cpp", - "LeakFolding.cpp", - "tests/HostMallocStub.cpp", - ], - }, - darwin: { - enabled: false, - }, - }, - - test_suites: ["device-tests"], -} - -cc_test { - name: "memunreachable_binder_test", - defaults: ["libmemunreachable_defaults"], - require_root: true, - - srcs: [ - "tests/Binder_test.cpp", - ], - static_libs: ["libmemunreachable"], - shared_libs: [ - "libbinder", - "libhidlbase", - "libutils", - ], - test_suites: ["device-tests"], -} diff --git a/libmemunreachable/Binder.cpp b/libmemunreachable/Binder.cpp deleted file mode 100644 index 60512a3f8..000000000 --- a/libmemunreachable/Binder.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2017 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 "Binder.h" -#include "log.h" - -__BEGIN_DECLS - -// Weak undefined references to the symbols in libbinder and libhwbinder -// so that libmemunreachable can call them in processes that have them -// loaded without requiring libmemunreachable to have dependencies on them. -ssize_t __attribute__((weak)) getBinderKernelReferences(size_t, uintptr_t*); -ssize_t __attribute__((weak)) getHWBinderKernelReferences(size_t, uintptr_t*); - -__END_DECLS - -namespace android { - -static bool BinderReferencesToVector(allocator::vector& refs, - std::function fn) { - if (fn == nullptr) { - return true; - } - - size_t size = refs.size(); - - do { - refs.resize(size); - - ssize_t ret = fn(refs.size(), refs.data()); - if (ret < 0) { - return false; - } - - size = ret; - } while (size > refs.size()); - - refs.resize(size); - return true; -} - -bool BinderReferences(allocator::vector& refs) { - refs.clear(); - - allocator::vector binder_refs{refs.get_allocator()}; - if (BinderReferencesToVector(refs, getBinderKernelReferences)) { - refs.insert(refs.end(), binder_refs.begin(), binder_refs.end()); - } else { - MEM_ALOGE("getBinderKernelReferences failed"); - } - - allocator::vector hwbinder_refs{refs.get_allocator()}; - if (BinderReferencesToVector(hwbinder_refs, getHWBinderKernelReferences)) { - refs.insert(refs.end(), hwbinder_refs.begin(), hwbinder_refs.end()); - } else { - MEM_ALOGE("getHWBinderKernelReferences failed"); - } - - return true; -} - -} // namespace android diff --git a/libmemunreachable/Binder.h b/libmemunreachable/Binder.h deleted file mode 100644 index bf4fd3e18..000000000 --- a/libmemunreachable/Binder.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2017 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 LIBMEMUNREACHABLE_BINDER_H_ -#define LIBMEMUNREACHABLE_BINDER_H_ - -#include "Allocator.h" - -namespace android { - -bool BinderReferences(allocator::vector& refs); - -} // namespace android - -#endif // LIBMEMUNREACHABLE_BINDER_H_ diff --git a/libmemunreachable/HeapWalker.cpp b/libmemunreachable/HeapWalker.cpp deleted file mode 100644 index 7cae04869..000000000 --- a/libmemunreachable/HeapWalker.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (C) 2016 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 - -#include -#include - -#include "Allocator.h" -#include "HeapWalker.h" -#include "LeakFolding.h" -#include "ScopedSignalHandler.h" -#include "log.h" - -namespace android { - -bool HeapWalker::Allocation(uintptr_t begin, uintptr_t end) { - if (end == begin) { - end = begin + 1; - } - Range range{begin, end}; - if (valid_mappings_range_.end != 0 && - (begin < valid_mappings_range_.begin || end > valid_mappings_range_.end)) { - MEM_LOG_ALWAYS_FATAL("allocation %p-%p is outside mapping range %p-%p", - reinterpret_cast(begin), reinterpret_cast(end), - reinterpret_cast(valid_mappings_range_.begin), - reinterpret_cast(valid_mappings_range_.end)); - } - auto inserted = allocations_.insert(std::pair(range, AllocationInfo{})); - if (inserted.second) { - valid_allocations_range_.begin = std::min(valid_allocations_range_.begin, begin); - valid_allocations_range_.end = std::max(valid_allocations_range_.end, end); - allocation_bytes_ += range.size(); - return true; - } else { - Range overlap = inserted.first->first; - if (overlap != range) { - MEM_ALOGE("range %p-%p overlaps with existing range %p-%p", reinterpret_cast(begin), - reinterpret_cast(end), reinterpret_cast(overlap.begin), - reinterpret_cast(overlap.end)); - } - return false; - } -} - -// Sanitizers may consider certain memory inaccessible through certain pointers. -// With MTE this will need to use unchecked instructions or disable tag checking globally. -static uintptr_t ReadWordAtAddressUnsafe(uintptr_t word_ptr) - __attribute__((no_sanitize("address", "hwaddress"))) { - return *reinterpret_cast(word_ptr); -} - -bool HeapWalker::WordContainsAllocationPtr(uintptr_t word_ptr, Range* range, AllocationInfo** info) { - walking_ptr_ = word_ptr; - // This access may segfault if the process under test has done something strange, - // for example mprotect(PROT_NONE) on a native heap page. If so, it will be - // caught and handled by mmaping a zero page over the faulting page. - uintptr_t value = ReadWordAtAddressUnsafe(word_ptr); - walking_ptr_ = 0; - if (value >= valid_allocations_range_.begin && value < valid_allocations_range_.end) { - AllocationMap::iterator it = allocations_.find(Range{value, value + 1}); - if (it != allocations_.end()) { - *range = it->first; - *info = &it->second; - return true; - } - } - return false; -} - -void HeapWalker::RecurseRoot(const Range& root) { - allocator::vector to_do(1, root, allocator_); - while (!to_do.empty()) { - Range range = to_do.back(); - to_do.pop_back(); - - walking_range_ = range; - ForEachPtrInRange(range, [&](Range& ref_range, AllocationInfo* ref_info) { - if (!ref_info->referenced_from_root) { - ref_info->referenced_from_root = true; - to_do.push_back(ref_range); - } - }); - walking_range_ = Range{0, 0}; - } -} - -void HeapWalker::Mapping(uintptr_t begin, uintptr_t end) { - valid_mappings_range_.begin = std::min(valid_mappings_range_.begin, begin); - valid_mappings_range_.end = std::max(valid_mappings_range_.end, end); -} - -void HeapWalker::Root(uintptr_t begin, uintptr_t end) { - roots_.push_back(Range{begin, end}); -} - -void HeapWalker::Root(const allocator::vector& vals) { - root_vals_.insert(root_vals_.end(), vals.begin(), vals.end()); -} - -size_t HeapWalker::Allocations() { - return allocations_.size(); -} - -size_t HeapWalker::AllocationBytes() { - return allocation_bytes_; -} - -bool HeapWalker::DetectLeaks() { - // Recursively walk pointers from roots to mark referenced allocations - for (auto it = roots_.begin(); it != roots_.end(); it++) { - RecurseRoot(*it); - } - - Range vals; - vals.begin = reinterpret_cast(root_vals_.data()); - vals.end = vals.begin + root_vals_.size() * sizeof(uintptr_t); - - RecurseRoot(vals); - - if (segv_page_count_ > 0) { - MEM_ALOGE("%zu pages skipped due to segfaults", segv_page_count_); - } - - return true; -} - -bool HeapWalker::Leaked(allocator::vector& leaked, size_t limit, size_t* num_leaks_out, - size_t* leak_bytes_out) { - leaked.clear(); - - size_t num_leaks = 0; - size_t leak_bytes = 0; - for (auto it = allocations_.begin(); it != allocations_.end(); it++) { - if (!it->second.referenced_from_root) { - num_leaks++; - leak_bytes += it->first.end - it->first.begin; - } - } - - size_t n = 0; - for (auto it = allocations_.begin(); it != allocations_.end(); it++) { - if (!it->second.referenced_from_root) { - if (n++ < limit) { - leaked.push_back(it->first); - } - } - } - - if (num_leaks_out) { - *num_leaks_out = num_leaks; - } - if (leak_bytes_out) { - *leak_bytes_out = leak_bytes; - } - - return true; -} - -static bool MapOverPage(void* addr) { - const size_t page_size = sysconf(_SC_PAGE_SIZE); - void* page = reinterpret_cast(reinterpret_cast(addr) & ~(page_size - 1)); - - void* ret = mmap(page, page_size, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0); - if (ret == MAP_FAILED) { - MEM_ALOGE("failed to map page at %p: %s", page, strerror(errno)); - return false; - } - - return true; -} - -void HeapWalker::HandleSegFault(ScopedSignalHandler& handler, int signal, siginfo_t* si, - void* /*uctx*/) { - uintptr_t addr = reinterpret_cast(si->si_addr); - if (addr != walking_ptr_) { - handler.reset(); - return; - } - if (!segv_logged_) { - MEM_ALOGW("failed to read page at %p, signal %d", si->si_addr, signal); - if (walking_range_.begin != 0U) { - MEM_ALOGW("while walking range %p-%p", reinterpret_cast(walking_range_.begin), - reinterpret_cast(walking_range_.end)); - } - segv_logged_ = true; - } - segv_page_count_++; - if (!MapOverPage(si->si_addr)) { - handler.reset(); - } -} - -Allocator::unique_ptr ScopedSignalHandler::handler_map_; - -} // namespace android diff --git a/libmemunreachable/HeapWalker.h b/libmemunreachable/HeapWalker.h deleted file mode 100644 index f00bccaaa..000000000 --- a/libmemunreachable/HeapWalker.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_HEAP_WALKER_H_ -#define LIBMEMUNREACHABLE_HEAP_WALKER_H_ - -#include - -#include "android-base/macros.h" - -#include "Allocator.h" -#include "ScopedSignalHandler.h" -#include "Tarjan.h" - -namespace android { - -// A range [begin, end) -struct Range { - uintptr_t begin; - uintptr_t end; - - size_t size() const { return end - begin; }; - bool operator==(const Range& other) const { - return this->begin == other.begin && this->end == other.end; - } - bool operator!=(const Range& other) const { return !(*this == other); } -}; - -// Comparator for Ranges that returns equivalence for overlapping ranges -struct compare_range { - bool operator()(const Range& a, const Range& b) const { return a.end <= b.begin; } -}; - -class HeapWalker { - public: - explicit HeapWalker(Allocator allocator) - : allocator_(allocator), - allocations_(allocator), - allocation_bytes_(0), - roots_(allocator), - root_vals_(allocator), - sigsegv_handler_(allocator), - sigbus_handler_(allocator), - walking_ptr_(0), - walking_range_{0, 0}, - segv_logged_(false), - segv_page_count_(0) { - valid_allocations_range_.end = 0; - valid_allocations_range_.begin = ~valid_allocations_range_.end; - valid_mappings_range_.end = 0; - valid_mappings_range_.begin = ~valid_allocations_range_.end; - - sigsegv_handler_.install( - SIGSEGV, [=](ScopedSignalHandler& handler, int signal, siginfo_t* siginfo, void* uctx) { - this->HandleSegFault(handler, signal, siginfo, uctx); - }); - sigbus_handler_.install( - SIGBUS, [=](ScopedSignalHandler& handler, int signal, siginfo_t* siginfo, void* uctx) { - this->HandleSegFault(handler, signal, siginfo, uctx); - }); - } - - ~HeapWalker() {} - bool Allocation(uintptr_t begin, uintptr_t end); - void Mapping(uintptr_t begin, uintptr_t end); - void Root(uintptr_t begin, uintptr_t end); - void Root(const allocator::vector& vals); - - bool DetectLeaks(); - - bool Leaked(allocator::vector&, size_t limit, size_t* num_leaks, size_t* leak_bytes); - size_t Allocations(); - size_t AllocationBytes(); - - template - void ForEachPtrInRange(const Range& range, F&& f); - - template - void ForEachAllocation(F&& f); - - struct AllocationInfo { - bool referenced_from_root; - }; - - private: - void RecurseRoot(const Range& root); - bool WordContainsAllocationPtr(uintptr_t ptr, Range* range, AllocationInfo** info); - void HandleSegFault(ScopedSignalHandler&, int, siginfo_t*, void*); - - DISALLOW_COPY_AND_ASSIGN(HeapWalker); - Allocator allocator_; - using AllocationMap = allocator::map; - AllocationMap allocations_; - size_t allocation_bytes_; - Range valid_allocations_range_; - Range valid_mappings_range_; - - allocator::vector roots_; - allocator::vector root_vals_; - - ScopedSignalHandler sigsegv_handler_; - ScopedSignalHandler sigbus_handler_; - volatile uintptr_t walking_ptr_; - Range walking_range_; - bool segv_logged_; - size_t segv_page_count_; -}; - -template -inline void HeapWalker::ForEachPtrInRange(const Range& range, F&& f) { - uintptr_t begin = (range.begin + (sizeof(uintptr_t) - 1)) & ~(sizeof(uintptr_t) - 1); - // TODO(ccross): we might need to consider a pointer to the end of a buffer - // to be inside the buffer, which means the common case of a pointer to the - // beginning of a buffer may keep two ranges live. - for (uintptr_t i = begin; i < range.end; i += sizeof(uintptr_t)) { - Range ref_range; - AllocationInfo* ref_info; - if (WordContainsAllocationPtr(i, &ref_range, &ref_info)) { - f(ref_range, ref_info); - } - } -} - -template -inline void HeapWalker::ForEachAllocation(F&& f) { - for (auto& it : allocations_) { - const Range& range = it.first; - HeapWalker::AllocationInfo& allocation = it.second; - f(range, allocation); - } -} - -} // namespace android - -#endif diff --git a/libmemunreachable/Leak.h b/libmemunreachable/Leak.h deleted file mode 100644 index de64b6410..000000000 --- a/libmemunreachable/Leak.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_LEAK_H_ -#define LIBMEMUNREACHABLE_LEAK_H_ - -#include -#include - -#include "memunreachable/memunreachable.h" - -// Custom std::hash specialization so that Leak::Backtrace can be used -// as a key in std::unordered_map. -namespace std { - -template <> -struct hash { - std::size_t operator()(const android::Leak::Backtrace& key) const { - std::size_t seed = 0; - - hash_combine(seed, key.num_frames); - for (size_t i = 0; i < key.num_frames; i++) { - hash_combine(seed, key.frames[i]); - } - - return seed; - } - - private: - template - inline void hash_combine(std::size_t& seed, const T& v) const { - std::hash hasher; - seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); - } -}; - -} // namespace std - -namespace android { - -static bool operator==(const Leak::Backtrace& lhs, const Leak::Backtrace& rhs) { - return (lhs.num_frames == rhs.num_frames) && - memcmp(lhs.frames, rhs.frames, lhs.num_frames * sizeof(lhs.frames[0])) == 0; -} -} - -#endif diff --git a/libmemunreachable/LeakFolding.cpp b/libmemunreachable/LeakFolding.cpp deleted file mode 100644 index 074dc48dd..000000000 --- a/libmemunreachable/LeakFolding.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2016 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 "Allocator.h" -#include "HeapWalker.h" -#include "LeakFolding.h" -#include "Tarjan.h" -#include "log.h" - -namespace android { - -// Converts possibly cyclic graph of leaks to a DAG by combining -// strongly-connected components into a object, stored in the scc pointer -// of each node in the component. -void LeakFolding::ComputeDAG() { - SCCList scc_list{allocator_}; - Tarjan(leak_graph_, scc_list); - - Allocator scc_allocator = allocator_; - - for (auto& scc_nodes : scc_list) { - Allocator::unique_ptr leak_scc; - leak_scc = scc_allocator.make_unique(scc_allocator); - - for (auto& node : scc_nodes) { - node->ptr->scc = leak_scc.get(); - leak_scc->count++; - leak_scc->size += node->ptr->range.size(); - } - - leak_scc_.emplace_back(std::move(leak_scc)); - } - - for (auto& it : leak_map_) { - LeakInfo& leak = it.second; - for (auto& ref : leak.node.references_out) { - if (leak.scc != ref->ptr->scc) { - leak.scc->node.Edge(&ref->ptr->scc->node); - } - } - } -} - -void LeakFolding::AccumulateLeaks(SCCInfo* dominator) { - std::function walk([&](SCCInfo* scc) { - if (scc->accumulator != dominator) { - scc->accumulator = dominator; - dominator->cuumulative_size += scc->size; - dominator->cuumulative_count += scc->count; - scc->node.Foreach([&](SCCInfo* ref) { walk(ref); }); - } - }); - walk(dominator); -} - -bool LeakFolding::FoldLeaks() { - Allocator leak_allocator = allocator_; - - // Find all leaked allocations insert them into leak_map_ and leak_graph_ - heap_walker_.ForEachAllocation([&](const Range& range, HeapWalker::AllocationInfo& allocation) { - if (!allocation.referenced_from_root) { - auto it = leak_map_.emplace(std::piecewise_construct, std::forward_as_tuple(range), - std::forward_as_tuple(range, allocator_)); - LeakInfo& leak = it.first->second; - leak_graph_.push_back(&leak.node); - } - }); - - // Find references between leaked allocations and connect them in leak_graph_ - for (auto& it : leak_map_) { - LeakInfo& leak = it.second; - heap_walker_.ForEachPtrInRange(leak.range, - [&](Range& ptr_range, HeapWalker::AllocationInfo* ptr_info) { - if (!ptr_info->referenced_from_root) { - LeakInfo* ptr_leak = &leak_map_.at(ptr_range); - leak.node.Edge(&ptr_leak->node); - } - }); - } - - // Convert the cyclic graph to a DAG by grouping strongly connected components - ComputeDAG(); - - // Compute dominators and cuumulative sizes - for (auto& scc : leak_scc_) { - if (scc->node.references_in.size() == 0) { - scc->dominator = true; - AccumulateLeaks(scc.get()); - } - } - - return true; -} - -bool LeakFolding::Leaked(allocator::vector& leaked, size_t* num_leaks_out, - size_t* leak_bytes_out) { - size_t num_leaks = 0; - size_t leak_bytes = 0; - for (auto& it : leak_map_) { - const LeakInfo& leak = it.second; - num_leaks++; - leak_bytes += leak.range.size(); - } - - for (auto& it : leak_map_) { - const LeakInfo& leak = it.second; - if (leak.scc->dominator) { - leaked.emplace_back(Leak{leak.range, leak.scc->cuumulative_count - 1, - leak.scc->cuumulative_size - leak.range.size()}); - } - } - - if (num_leaks_out) { - *num_leaks_out = num_leaks; - } - if (leak_bytes_out) { - *leak_bytes_out = leak_bytes; - } - - return true; -} - -} // namespace android diff --git a/libmemunreachable/LeakFolding.h b/libmemunreachable/LeakFolding.h deleted file mode 100644 index 09affac9a..000000000 --- a/libmemunreachable/LeakFolding.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_LEAK_FOLDING_H_ -#define LIBMEMUNREACHABLE_LEAK_FOLDING_H_ - -#include "HeapWalker.h" - -namespace android { - -class LeakFolding { - public: - LeakFolding(Allocator allocator, HeapWalker& heap_walker) - : allocator_(allocator), - heap_walker_(heap_walker), - leak_map_(allocator), - leak_graph_(allocator), - leak_scc_(allocator) {} - - bool FoldLeaks(); - - struct Leak { - const Range range; - size_t referenced_count; - size_t referenced_size; - }; - - bool Leaked(allocator::vector& leaked, size_t* num_leaks_out, size_t* leak_bytes_out); - - private: - DISALLOW_COPY_AND_ASSIGN(LeakFolding); - Allocator allocator_; - HeapWalker& heap_walker_; - - struct SCCInfo { - public: - Node node; - - size_t count; - size_t size; - - size_t cuumulative_count; - size_t cuumulative_size; - - bool dominator; - SCCInfo* accumulator; - - explicit SCCInfo(Allocator allocator) - : node(this, allocator), - count(0), - size(0), - cuumulative_count(0), - cuumulative_size(0), - dominator(false), - accumulator(nullptr) {} - - private: - SCCInfo(SCCInfo&&) = delete; - DISALLOW_COPY_AND_ASSIGN(SCCInfo); - }; - - struct LeakInfo { - public: - Node node; - - const Range range; - - SCCInfo* scc; - - LeakInfo(const Range& range, Allocator allocator) - : node(this, allocator), range(range), scc(nullptr) {} - - private: - DISALLOW_COPY_AND_ASSIGN(LeakInfo); - }; - - void ComputeDAG(); - void AccumulateLeaks(SCCInfo* dominator); - - allocator::map leak_map_; - Graph leak_graph_; - allocator::vector::unique_ptr> leak_scc_; -}; - -} // namespace android - -#endif // LIBMEMUNREACHABLE_LEAK_FOLDING_H_ diff --git a/libmemunreachable/LeakPipe.cpp b/libmemunreachable/LeakPipe.cpp deleted file mode 100644 index 8ea9ad68b..000000000 --- a/libmemunreachable/LeakPipe.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2016 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 "LeakPipe.h" - -#include "log.h" - -namespace android { - -bool LeakPipe::SendFd(int sock, int fd) { - struct msghdr hdr {}; - struct iovec iov {}; - unsigned int data = 0xfdfdfdfd; - alignas(struct cmsghdr) char cmsgbuf[CMSG_SPACE(sizeof(int))]; - - hdr.msg_iov = &iov; - hdr.msg_iovlen = 1; - iov.iov_base = &data; - iov.iov_len = sizeof(data); - - hdr.msg_control = cmsgbuf; - hdr.msg_controllen = CMSG_LEN(sizeof(int)); - - struct cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr); - cmsg->cmsg_len = CMSG_LEN(sizeof(int)); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - - *(int*)CMSG_DATA(cmsg) = fd; - - int ret = sendmsg(sock, &hdr, 0); - if (ret < 0) { - MEM_ALOGE("failed to send fd: %s", strerror(errno)); - return false; - } - if (ret == 0) { - MEM_ALOGE("eof when sending fd"); - return false; - } - - return true; -} - -int LeakPipe::ReceiveFd(int sock) { - struct msghdr hdr {}; - struct iovec iov {}; - unsigned int data; - alignas(struct cmsghdr) char cmsgbuf[CMSG_SPACE(sizeof(int))]; - - hdr.msg_iov = &iov; - hdr.msg_iovlen = 1; - iov.iov_base = &data; - iov.iov_len = sizeof(data); - - hdr.msg_control = cmsgbuf; - hdr.msg_controllen = CMSG_LEN(sizeof(int)); - - int ret = recvmsg(sock, &hdr, 0); - if (ret < 0) { - MEM_ALOGE("failed to receive fd: %s", strerror(errno)); - return -1; - } - if (ret == 0) { - MEM_ALOGE("eof when receiving fd"); - return -1; - } - - struct cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr); - if (cmsg == NULL || cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) { - MEM_ALOGE("missing fd while receiving fd"); - return -1; - } - - return *(int*)CMSG_DATA(cmsg); -} - -} // namespace android diff --git a/libmemunreachable/LeakPipe.h b/libmemunreachable/LeakPipe.h deleted file mode 100644 index 94d4aa486..000000000 --- a/libmemunreachable/LeakPipe.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_LEAK_PIPE_H_ -#define LIBMEMUNREACHABLE_LEAK_PIPE_H_ - -#include - -#include - -#include "android-base/macros.h" - -#include "ScopedPipe.h" -#include "log.h" - -namespace android { - -// LeakPipe implements a pipe that can transfer vectors of simple objects -// between processes. The pipe is created in the sending process and -// transferred over a socketpair that was created before forking. This ensures -// that only the sending process can have the send side of the pipe open, so if -// the sending process dies the pipe will close. -class LeakPipe { - public: - LeakPipe() { - int ret = socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sv_); - if (ret < 0) { - MEM_LOG_ALWAYS_FATAL("failed to create socketpair: %s", strerror(errno)); - } - } - - ~LeakPipe() { Close(); } - - void Close() { - close(sv_[0]); - close(sv_[1]); - sv_[0] = -1; - sv_[1] = -1; - } - - bool OpenReceiver() { - int fd = ReceiveFd(sv_[0]); - if (fd < 0) { - return false; - } - - receiver_.SetFd(fd); - return true; - } - - bool OpenSender() { - ScopedPipe pipe; - - if (!SendFd(sv_[1], pipe.Receiver())) { - return false; - } - pipe.ReleaseReceiver(); - - sender_.SetFd(pipe.ReleaseSender()); - return true; - } - - class LeakPipeBase { - public: - LeakPipeBase() : fd_(-1) {} - - ~LeakPipeBase() { Close(); } - - void SetFd(int fd) { fd_ = fd; } - - void Close() { - close(fd_); - fd_ = -1; - } - - protected: - int fd_; - - private: - DISALLOW_COPY_AND_ASSIGN(LeakPipeBase); - }; - - class LeakPipeSender : public LeakPipeBase { - public: - using LeakPipeBase::LeakPipeBase; - - template - bool Send(const T& value) { - ssize_t ret = TEMP_FAILURE_RETRY(write(fd_, &value, sizeof(T))); - if (ret < 0) { - MEM_ALOGE("failed to send value: %s", strerror(errno)); - return false; - } else if (static_cast(ret) != sizeof(T)) { - MEM_ALOGE("eof while writing value"); - return false; - } - - return true; - } - - template > - bool SendVector(const std::vector& vector) { - size_t size = vector.size() * sizeof(T); - if (!Send(size)) { - return false; - } - - ssize_t ret = TEMP_FAILURE_RETRY(write(fd_, vector.data(), size)); - if (ret < 0) { - MEM_ALOGE("failed to send vector: %s", strerror(errno)); - return false; - } else if (static_cast(ret) != size) { - MEM_ALOGE("eof while writing vector"); - return false; - } - - return true; - } - }; - - class LeakPipeReceiver : public LeakPipeBase { - public: - using LeakPipeBase::LeakPipeBase; - - template - bool Receive(T* value) { - ssize_t ret = TEMP_FAILURE_RETRY(read(fd_, reinterpret_cast(value), sizeof(T))); - if (ret < 0) { - MEM_ALOGE("failed to receive value: %s", strerror(errno)); - return false; - } else if (static_cast(ret) != sizeof(T)) { - MEM_ALOGE("eof while receiving value"); - return false; - } - - return true; - } - - template > - bool ReceiveVector(std::vector& vector) { - size_t size = 0; - if (!Receive(&size)) { - return false; - } - - vector.resize(size / sizeof(T)); - - char* ptr = reinterpret_cast(vector.data()); - while (size > 0) { - ssize_t ret = TEMP_FAILURE_RETRY(read(fd_, ptr, size)); - if (ret < 0) { - MEM_ALOGE("failed to send vector: %s", strerror(errno)); - return false; - } else if (ret == 0) { - MEM_ALOGE("eof while reading vector"); - return false; - } - size -= ret; - ptr += ret; - } - - return true; - } - }; - - LeakPipeReceiver& Receiver() { return receiver_; } - - LeakPipeSender& Sender() { return sender_; } - - private: - LeakPipeReceiver receiver_; - LeakPipeSender sender_; - bool SendFd(int sock, int fd); - int ReceiveFd(int sock); - DISALLOW_COPY_AND_ASSIGN(LeakPipe); - int sv_[2]; -}; - -} // namespace android - -#endif // LIBMEMUNREACHABLE_LEAK_PIPE_H_ diff --git a/libmemunreachable/LinkedList.h b/libmemunreachable/LinkedList.h deleted file mode 100644 index 36fe9fd1b..000000000 --- a/libmemunreachable/LinkedList.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_LINKED_LIST_H_ -#define LIBMEMUNREACHABLE_LINKED_LIST_H_ - -namespace android { - -template -class LinkedList { - public: - LinkedList() : next_(this), prev_(this), data_() {} - explicit LinkedList(T data) : LinkedList() { data_ = data; } - ~LinkedList() {} - void insert(LinkedList& node) { - assert(node.empty()); - node.next_ = this->next_; - node.next_->prev_ = &node; - this->next_ = &node; - node.prev_ = this; - } - void remove() { - this->next_->prev_ = this->prev_; - this->prev_->next_ = this->next_; - this->next_ = this; - this->prev_ = this; - } - T data() { return data_; } - bool empty() { return next_ == this && prev_ == this; } - LinkedList* next() { return next_; } - - private: - LinkedList* next_; - LinkedList* prev_; - T data_; -}; - -template -class LinkedListHead { - public: - LinkedListHead() : node_() {} - ~LinkedListHead() {} - - private: - LinkedList node_; -}; - -} // namespace android - -#endif diff --git a/libmemunreachable/MemUnreachable.cpp b/libmemunreachable/MemUnreachable.cpp deleted file mode 100644 index c4add19ce..000000000 --- a/libmemunreachable/MemUnreachable.cpp +++ /dev/null @@ -1,564 +0,0 @@ -/* - * Copyright (C) 2016 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 -#include -#include -#include -#include - -#include -#include -#include - -#include "Allocator.h" -#include "Binder.h" -#include "HeapWalker.h" -#include "Leak.h" -#include "LeakFolding.h" -#include "LeakPipe.h" -#include "ProcessMappings.h" -#include "PtracerThread.h" -#include "ScopedDisableMalloc.h" -#include "Semaphore.h" -#include "ThreadCapture.h" - -#include "bionic.h" -#include "log.h" -#include "memunreachable/memunreachable.h" - -using namespace std::chrono_literals; - -namespace android { - -const size_t Leak::contents_length; - -class MemUnreachable { - public: - MemUnreachable(pid_t pid, Allocator allocator) - : pid_(pid), allocator_(allocator), heap_walker_(allocator_) {} - bool CollectAllocations(const allocator::vector& threads, - const allocator::vector& mappings, - const allocator::vector& refs); - bool GetUnreachableMemory(allocator::vector& leaks, size_t limit, size_t* num_leaks, - size_t* leak_bytes); - size_t Allocations() { return heap_walker_.Allocations(); } - size_t AllocationBytes() { return heap_walker_.AllocationBytes(); } - - private: - bool ClassifyMappings(const allocator::vector& mappings, - allocator::vector& heap_mappings, - allocator::vector& anon_mappings, - allocator::vector& globals_mappings, - allocator::vector& stack_mappings); - DISALLOW_COPY_AND_ASSIGN(MemUnreachable); - pid_t pid_; - Allocator allocator_; - HeapWalker heap_walker_; -}; - -static void HeapIterate(const Mapping& heap_mapping, - const std::function& func) { - malloc_iterate(heap_mapping.begin, heap_mapping.end - heap_mapping.begin, - [](uintptr_t base, size_t size, void* arg) { - auto f = reinterpret_cast*>(arg); - (*f)(base, size); - }, - const_cast(reinterpret_cast(&func))); -} - -bool MemUnreachable::CollectAllocations(const allocator::vector& threads, - const allocator::vector& mappings, - const allocator::vector& refs) { - MEM_ALOGI("searching process %d for allocations", pid_); - - for (auto it = mappings.begin(); it != mappings.end(); it++) { - heap_walker_.Mapping(it->begin, it->end); - } - - allocator::vector heap_mappings{mappings}; - allocator::vector anon_mappings{mappings}; - allocator::vector globals_mappings{mappings}; - allocator::vector stack_mappings{mappings}; - if (!ClassifyMappings(mappings, heap_mappings, anon_mappings, globals_mappings, stack_mappings)) { - return false; - } - - for (auto it = heap_mappings.begin(); it != heap_mappings.end(); it++) { - MEM_ALOGV("Heap mapping %" PRIxPTR "-%" PRIxPTR " %s", it->begin, it->end, it->name); - HeapIterate(*it, - [&](uintptr_t base, size_t size) { heap_walker_.Allocation(base, base + size); }); - } - - for (auto it = anon_mappings.begin(); it != anon_mappings.end(); it++) { - MEM_ALOGV("Anon mapping %" PRIxPTR "-%" PRIxPTR " %s", it->begin, it->end, it->name); - heap_walker_.Allocation(it->begin, it->end); - } - - for (auto it = globals_mappings.begin(); it != globals_mappings.end(); it++) { - MEM_ALOGV("Globals mapping %" PRIxPTR "-%" PRIxPTR " %s", it->begin, it->end, it->name); - heap_walker_.Root(it->begin, it->end); - } - - for (auto thread_it = threads.begin(); thread_it != threads.end(); thread_it++) { - for (auto it = stack_mappings.begin(); it != stack_mappings.end(); it++) { - if (thread_it->stack.first >= it->begin && thread_it->stack.first <= it->end) { - MEM_ALOGV("Stack %" PRIxPTR "-%" PRIxPTR " %s", thread_it->stack.first, it->end, it->name); - heap_walker_.Root(thread_it->stack.first, it->end); - } - } - heap_walker_.Root(thread_it->regs); - } - - heap_walker_.Root(refs); - - MEM_ALOGI("searching done"); - - return true; -} - -bool MemUnreachable::GetUnreachableMemory(allocator::vector& leaks, size_t limit, - size_t* num_leaks, size_t* leak_bytes) { - MEM_ALOGI("sweeping process %d for unreachable memory", pid_); - leaks.clear(); - - if (!heap_walker_.DetectLeaks()) { - return false; - } - - allocator::vector leaked1{allocator_}; - heap_walker_.Leaked(leaked1, 0, num_leaks, leak_bytes); - - MEM_ALOGI("sweeping done"); - - MEM_ALOGI("folding related leaks"); - - LeakFolding folding(allocator_, heap_walker_); - if (!folding.FoldLeaks()) { - return false; - } - - allocator::vector leaked{allocator_}; - - if (!folding.Leaked(leaked, num_leaks, leak_bytes)) { - return false; - } - - allocator::unordered_map backtrace_map{allocator_}; - - // Prevent reallocations of backing memory so we can store pointers into it - // in backtrace_map. - leaks.reserve(leaked.size()); - - for (auto& it : leaked) { - leaks.emplace_back(); - Leak* leak = &leaks.back(); - - ssize_t num_backtrace_frames = malloc_backtrace( - reinterpret_cast(it.range.begin), leak->backtrace.frames, leak->backtrace.max_frames); - if (num_backtrace_frames > 0) { - leak->backtrace.num_frames = num_backtrace_frames; - - auto inserted = backtrace_map.emplace(leak->backtrace, leak); - if (!inserted.second) { - // Leak with same backtrace already exists, drop this one and - // increment similar counts on the existing one. - leaks.pop_back(); - Leak* similar_leak = inserted.first->second; - similar_leak->similar_count++; - similar_leak->similar_size += it.range.size(); - similar_leak->similar_referenced_count += it.referenced_count; - similar_leak->similar_referenced_size += it.referenced_size; - similar_leak->total_size += it.range.size(); - similar_leak->total_size += it.referenced_size; - continue; - } - } - - leak->begin = it.range.begin; - leak->size = it.range.size(); - leak->referenced_count = it.referenced_count; - leak->referenced_size = it.referenced_size; - leak->total_size = leak->size + leak->referenced_size; - memcpy(leak->contents, reinterpret_cast(it.range.begin), - std::min(leak->size, Leak::contents_length)); - } - - MEM_ALOGI("folding done"); - - std::sort(leaks.begin(), leaks.end(), - [](const Leak& a, const Leak& b) { return a.total_size > b.total_size; }); - - if (leaks.size() > limit) { - leaks.resize(limit); - } - - return true; -} - -static bool has_prefix(const allocator::string& s, const char* prefix) { - int ret = s.compare(0, strlen(prefix), prefix); - return ret == 0; -} - -static bool is_sanitizer_mapping(const allocator::string& s) { - return s == "[anon:low shadow]" || s == "[anon:high shadow]" || has_prefix(s, "[anon:hwasan"); -} - -bool MemUnreachable::ClassifyMappings(const allocator::vector& mappings, - allocator::vector& heap_mappings, - allocator::vector& anon_mappings, - allocator::vector& globals_mappings, - allocator::vector& stack_mappings) { - heap_mappings.clear(); - anon_mappings.clear(); - globals_mappings.clear(); - stack_mappings.clear(); - - allocator::string current_lib{allocator_}; - - for (auto it = mappings.begin(); it != mappings.end(); it++) { - if (it->execute) { - current_lib = it->name; - continue; - } - - if (!it->read) { - continue; - } - - const allocator::string mapping_name{it->name, allocator_}; - if (mapping_name == "[anon:.bss]") { - // named .bss section - globals_mappings.emplace_back(*it); - } else if (mapping_name == current_lib) { - // .rodata or .data section - globals_mappings.emplace_back(*it); - } else if (mapping_name == "[anon:libc_malloc]" || - android::base::StartsWith(mapping_name, "[anon:scudo:")) { - // named malloc mapping - heap_mappings.emplace_back(*it); - } else if (has_prefix(mapping_name, "[anon:dalvik-")) { - // named dalvik heap mapping - globals_mappings.emplace_back(*it); - } else if (has_prefix(mapping_name, "[stack")) { - // named stack mapping - stack_mappings.emplace_back(*it); - } else if (mapping_name.size() == 0) { - globals_mappings.emplace_back(*it); - } else if (has_prefix(mapping_name, "[anon:") && - mapping_name != "[anon:leak_detector_malloc]" && - !is_sanitizer_mapping(mapping_name)) { - // TODO(ccross): it would be nice to treat named anonymous mappings as - // possible leaks, but naming something in a .bss or .data section makes - // it impossible to distinguish them from mmaped and then named mappings. - globals_mappings.emplace_back(*it); - } - } - - return true; -} - -template -static inline const char* plural(T val) { - return (val == 1) ? "" : "s"; -} - -bool GetUnreachableMemory(UnreachableMemoryInfo& info, size_t limit) { - if (info.version > 0) { - MEM_ALOGE("unsupported UnreachableMemoryInfo.version %zu in GetUnreachableMemory", - info.version); - return false; - } - - int parent_pid = getpid(); - int parent_tid = gettid(); - - Heap heap; - - Semaphore continue_parent_sem; - LeakPipe pipe; - - PtracerThread thread{[&]() -> int { - ///////////////////////////////////////////// - // Collection thread - ///////////////////////////////////////////// - MEM_ALOGI("collecting thread info for process %d...", parent_pid); - - ThreadCapture thread_capture(parent_pid, heap); - allocator::vector thread_info(heap); - allocator::vector mappings(heap); - allocator::vector refs(heap); - - // ptrace all the threads - if (!thread_capture.CaptureThreads()) { - continue_parent_sem.Post(); - return 1; - } - - // collect register contents and stacks - if (!thread_capture.CapturedThreadInfo(thread_info)) { - continue_parent_sem.Post(); - return 1; - } - - // snapshot /proc/pid/maps - if (!ProcessMappings(parent_pid, mappings)) { - continue_parent_sem.Post(); - return 1; - } - - if (!BinderReferences(refs)) { - continue_parent_sem.Post(); - return 1; - } - - // malloc must be enabled to call fork, at_fork handlers take the same - // locks as ScopedDisableMalloc. All threads are paused in ptrace, so - // memory state is still consistent. Unfreeze the original thread so it - // can drop the malloc locks, it will block until the collection thread - // exits. - thread_capture.ReleaseThread(parent_tid); - continue_parent_sem.Post(); - - // fork a process to do the heap walking - int ret = fork(); - if (ret < 0) { - return 1; - } else if (ret == 0) { - ///////////////////////////////////////////// - // Heap walker process - ///////////////////////////////////////////// - // Examine memory state in the child using the data collected above and - // the CoW snapshot of the process memory contents. - - if (!pipe.OpenSender()) { - _exit(1); - } - - MemUnreachable unreachable{parent_pid, heap}; - - if (!unreachable.CollectAllocations(thread_info, mappings, refs)) { - _exit(2); - } - size_t num_allocations = unreachable.Allocations(); - size_t allocation_bytes = unreachable.AllocationBytes(); - - allocator::vector leaks{heap}; - - size_t num_leaks = 0; - size_t leak_bytes = 0; - bool ok = unreachable.GetUnreachableMemory(leaks, limit, &num_leaks, &leak_bytes); - - ok = ok && pipe.Sender().Send(num_allocations); - ok = ok && pipe.Sender().Send(allocation_bytes); - ok = ok && pipe.Sender().Send(num_leaks); - ok = ok && pipe.Sender().Send(leak_bytes); - ok = ok && pipe.Sender().SendVector(leaks); - - if (!ok) { - _exit(3); - } - - _exit(0); - } else { - // Nothing left to do in the collection thread, return immediately, - // releasing all the captured threads. - MEM_ALOGI("collection thread done"); - return 0; - } - }}; - - ///////////////////////////////////////////// - // Original thread - ///////////////////////////////////////////// - - { - // Disable malloc to get a consistent view of memory - ScopedDisableMalloc disable_malloc; - - // Start the collection thread - thread.Start(); - - // Wait for the collection thread to signal that it is ready to fork the - // heap walker process. - continue_parent_sem.Wait(30s); - - // Re-enable malloc so the collection thread can fork. - } - - // Wait for the collection thread to exit - int ret = thread.Join(); - if (ret != 0) { - return false; - } - - // Get a pipe from the heap walker process. Transferring a new pipe fd - // ensures no other forked processes can have it open, so when the heap - // walker process dies the remote side of the pipe will close. - if (!pipe.OpenReceiver()) { - return false; - } - - bool ok = true; - ok = ok && pipe.Receiver().Receive(&info.num_allocations); - ok = ok && pipe.Receiver().Receive(&info.allocation_bytes); - ok = ok && pipe.Receiver().Receive(&info.num_leaks); - ok = ok && pipe.Receiver().Receive(&info.leak_bytes); - ok = ok && pipe.Receiver().ReceiveVector(info.leaks); - if (!ok) { - return false; - } - - MEM_ALOGI("unreachable memory detection done"); - MEM_ALOGE("%zu bytes in %zu allocation%s unreachable out of %zu bytes in %zu allocation%s", - info.leak_bytes, info.num_leaks, plural(info.num_leaks), info.allocation_bytes, - info.num_allocations, plural(info.num_allocations)); - return true; -} - -std::string Leak::ToString(bool log_contents) const { - std::ostringstream oss; - - oss << " " << std::dec << size; - oss << " bytes unreachable at "; - oss << std::hex << begin; - oss << std::endl; - if (referenced_count > 0) { - oss << std::dec; - oss << " referencing " << referenced_size << " unreachable bytes"; - oss << " in " << referenced_count << " allocation" << plural(referenced_count); - oss << std::endl; - } - if (similar_count > 0) { - oss << std::dec; - oss << " and " << similar_size << " similar unreachable bytes"; - oss << " in " << similar_count << " allocation" << plural(similar_count); - oss << std::endl; - if (similar_referenced_count > 0) { - oss << " referencing " << similar_referenced_size << " unreachable bytes"; - oss << " in " << similar_referenced_count << " allocation" << plural(similar_referenced_count); - oss << std::endl; - } - } - - if (log_contents) { - const int bytes_per_line = 16; - const size_t bytes = std::min(size, contents_length); - - if (bytes == size) { - oss << " contents:" << std::endl; - } else { - oss << " first " << bytes << " bytes of contents:" << std::endl; - } - - for (size_t i = 0; i < bytes; i += bytes_per_line) { - oss << " " << std::hex << begin + i << ": "; - size_t j; - oss << std::setfill('0'); - for (j = i; j < bytes && j < i + bytes_per_line; j++) { - oss << std::setw(2) << static_cast(contents[j]) << " "; - } - oss << std::setfill(' '); - for (; j < i + bytes_per_line; j++) { - oss << " "; - } - for (j = i; j < bytes && j < i + bytes_per_line; j++) { - char c = contents[j]; - if (c < ' ' || c >= 0x7f) { - c = '.'; - } - oss << c; - } - oss << std::endl; - } - } - if (backtrace.num_frames > 0) { - oss << backtrace_string(backtrace.frames, backtrace.num_frames); - } - - return oss.str(); -} - -std::string UnreachableMemoryInfo::ToString(bool log_contents) const { - std::ostringstream oss; - oss << " " << leak_bytes << " bytes in "; - oss << num_leaks << " unreachable allocation" << plural(num_leaks); - oss << std::endl; - oss << " ABI: '" ABI_STRING "'" << std::endl; - oss << std::endl; - - for (auto it = leaks.begin(); it != leaks.end(); it++) { - oss << it->ToString(log_contents); - oss << std::endl; - } - - return oss.str(); -} - -UnreachableMemoryInfo::~UnreachableMemoryInfo() { - // Clear the memory that holds the leaks, otherwise the next attempt to - // detect leaks may find the old data (for example in the jemalloc tcache) - // and consider all the leaks to be referenced. - memset(leaks.data(), 0, leaks.capacity() * sizeof(Leak)); - - std::vector tmp; - leaks.swap(tmp); - - // Disable and re-enable malloc to flush the jemalloc tcache to make sure - // there are no copies of the leaked pointer addresses there. - malloc_disable(); - malloc_enable(); -} - -std::string GetUnreachableMemoryString(bool log_contents, size_t limit) { - UnreachableMemoryInfo info; - if (!GetUnreachableMemory(info, limit)) { - return "Failed to get unreachable memory\n" - "If you are trying to get unreachable memory from a system app\n" - "(like com.android.systemui), disable selinux first using\n" - "setenforce 0\n"; - } - - return info.ToString(log_contents); -} - -} // namespace android - -bool LogUnreachableMemory(bool log_contents, size_t limit) { - android::UnreachableMemoryInfo info; - if (!android::GetUnreachableMemory(info, limit)) { - return false; - } - - for (auto it = info.leaks.begin(); it != info.leaks.end(); it++) { - MEM_ALOGE("%s", it->ToString(log_contents).c_str()); - } - return true; -} - -bool NoLeaks() { - android::UnreachableMemoryInfo info; - if (!android::GetUnreachableMemory(info, 0)) { - return false; - } - - return info.num_leaks == 0; -} diff --git a/libmemunreachable/OWNERS b/libmemunreachable/OWNERS deleted file mode 100644 index 9127a931c..000000000 --- a/libmemunreachable/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -ccross@google.com -cferris@google.com diff --git a/libmemunreachable/ProcessMappings.cpp b/libmemunreachable/ProcessMappings.cpp deleted file mode 100644 index 8e1be4c8c..000000000 --- a/libmemunreachable/ProcessMappings.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2016 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 -#include -#include - -#include -#include - -#include "ProcessMappings.h" - -namespace android { - -struct ReadMapCallback { - ReadMapCallback(allocator::vector& mappings) : mappings_(mappings) {} - - void operator()(uint64_t start, uint64_t end, uint16_t flags, uint64_t, ino_t, - const char* name) const { - mappings_.emplace_back(start, end, flags & PROT_READ, flags & PROT_WRITE, flags & PROT_EXEC, - name); - } - - allocator::vector& mappings_; -}; - -bool ProcessMappings(pid_t pid, allocator::vector& mappings) { - char map_buffer[1024]; - snprintf(map_buffer, sizeof(map_buffer), "/proc/%d/maps", pid); - android::base::unique_fd fd(open(map_buffer, O_RDONLY)); - if (fd == -1) { - return false; - } - allocator::string content(mappings.get_allocator()); - ssize_t n; - while ((n = TEMP_FAILURE_RETRY(read(fd, map_buffer, sizeof(map_buffer)))) > 0) { - content.append(map_buffer, n); - } - ReadMapCallback callback(mappings); - return android::procinfo::ReadMapFileContent(&content[0], callback); -} - -} // namespace android diff --git a/libmemunreachable/ProcessMappings.h b/libmemunreachable/ProcessMappings.h deleted file mode 100644 index 94da69b11..000000000 --- a/libmemunreachable/ProcessMappings.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_PROCESS_MAPPING_H_ -#define LIBMEMUNREACHABLE_PROCESS_MAPPING_H_ - -#include - -#include "Allocator.h" - -namespace android { - -struct Mapping { - uintptr_t begin; - uintptr_t end; - bool read; - bool write; - bool execute; - char name[96]; - - Mapping() {} - Mapping(uintptr_t begin, uintptr_t end, bool read, bool write, bool execute, const char* name) - : begin(begin), end(end), read(read), write(write), execute(execute) { - strlcpy(this->name, name, sizeof(this->name)); - } -}; - -// This function is not re-entrant since it uses a static buffer for -// the line data. -bool ProcessMappings(pid_t pid, allocator::vector& mappings); - -} // namespace android - -#endif // LIBMEMUNREACHABLE_PROCESS_MAPPING_H_ diff --git a/libmemunreachable/PtracerThread.cpp b/libmemunreachable/PtracerThread.cpp deleted file mode 100644 index d2fca49f2..000000000 --- a/libmemunreachable/PtracerThread.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (C) 2016 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "android-base/macros.h" - -#include "PtracerThread.h" -#include "log.h" - -namespace android { - -class Stack { - public: - explicit Stack(size_t size) : size_(size) { - int prot = PROT_READ | PROT_WRITE; - int flags = MAP_PRIVATE | MAP_ANONYMOUS; - page_size_ = sysconf(_SC_PAGE_SIZE); - size_ += page_size_ * 2; // guard pages - base_ = mmap(NULL, size_, prot, flags, -1, 0); - if (base_ == MAP_FAILED) { - base_ = NULL; - size_ = 0; - return; - } - prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, base_, size_, "libmemunreachable stack"); - mprotect(base_, page_size_, PROT_NONE); - mprotect(top(), page_size_, PROT_NONE); - }; - ~Stack() { munmap(base_, size_); }; - void* top() { - return reinterpret_cast(reinterpret_cast(base_) + size_ - page_size_); - }; - - private: - DISALLOW_COPY_AND_ASSIGN(Stack); - - void* base_; - size_t size_; - size_t page_size_; -}; - -PtracerThread::PtracerThread(const std::function& func) : child_pid_(0) { - stack_ = std::make_unique(PTHREAD_STACK_MIN); - if (stack_->top() == nullptr) { - MEM_LOG_ALWAYS_FATAL("failed to mmap child stack: %s", strerror(errno)); - } - - func_ = std::function{[&, func]() -> int { - // In the child thread, lock and unlock the mutex to wait for the parent - // to finish setting up for the child thread - std::unique_lock lk(m_); - lk.unlock(); - _exit(func()); - }}; -} - -PtracerThread::~PtracerThread() { - Kill(); - Join(); - ClearTracer(); - stack_ = nullptr; -} - -bool PtracerThread::Start() { - std::unique_lock lk(m_); - - // Convert from void(*)(void*) to lambda with captures - auto proxy = [](void* arg) -> int { - prctl(PR_SET_NAME, "libmemunreachable ptrace thread"); - return (*reinterpret_cast*>(arg))(); - }; - - // See README.md for why we create the child process this way - child_pid_ = clone(proxy, stack_->top(), CLONE_VM | CLONE_FS | CLONE_FILES /*|CLONE_UNTRACED*/, - reinterpret_cast(&func_)); - if (child_pid_ < 0) { - MEM_ALOGE("failed to clone child: %s", strerror(errno)); - return false; - } - - SetTracer(child_pid_); - - lk.unlock(); - - return true; -} - -int PtracerThread::Join() { - if (child_pid_ == -1) { - return -1; - } - int status; - int ret = TEMP_FAILURE_RETRY(waitpid(child_pid_, &status, __WALL)); - if (ret < 0) { - MEM_ALOGE("waitpid %d failed: %s", child_pid_, strerror(errno)); - return -1; - } - - child_pid_ = -1; - - if (WIFEXITED(status)) { - return WEXITSTATUS(status); - } else if (WIFSIGNALED(status)) { - return -WTERMSIG(status); - } else { - MEM_ALOGE("unexpected status %x", status); - return -1; - } -} - -void PtracerThread::Kill() { - if (child_pid_ == -1) { - return; - } - - syscall(SYS_tkill, child_pid_, SIGKILL); -} - -void PtracerThread::SetTracer(pid_t tracer_pid) { - prctl(PR_SET_PTRACER, tracer_pid); -} - -void PtracerThread::ClearTracer() { - prctl(PR_SET_PTRACER, 0); -} - -} // namespace android diff --git a/libmemunreachable/PtracerThread.h b/libmemunreachable/PtracerThread.h deleted file mode 100644 index 4f9c42021..000000000 --- a/libmemunreachable/PtracerThread.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_PTRACER_THREAD_H_ -#define LIBMEMUNREACHABLE_PTRACER_THREAD_H_ - -#include -#include - -#include "android-base/macros.h" - -#include "Allocator.h" - -namespace android { - -class Stack; - -// PtracerThread is similar to std::thread, except that it creates a "thread" -// that can ptrace the other threads. The thread is actually a separate -// process, with its own thread group, but shares address space and fds with -// the parent. -class PtracerThread { - public: - explicit PtracerThread(const std::function& func); - ~PtracerThread(); - bool Start(); - int Join(); - - private: - void SetTracer(pid_t); - void ClearTracer(); - void Kill(); - DISALLOW_COPY_AND_ASSIGN(PtracerThread); - std::unique_ptr stack_; - std::function func_; - std::mutex m_; - pid_t child_pid_; -}; - -} // namespace android - -#endif // LIBMEMUNREACHABLE_PTRACER_THREAD_H_ diff --git a/libmemunreachable/README.md b/libmemunreachable/README.md deleted file mode 100644 index 9cc0c9b25..000000000 --- a/libmemunreachable/README.md +++ /dev/null @@ -1,92 +0,0 @@ -libmemunreachable -================ - -Introduction --------------- -libmemunreachable is a zero-overhead native memory leak detector. It uses an imprecise mark-and-sweep garbage collector pass over all native memory, reporting any unreachable blocks as leaks. It is similar to the [Heap Checker from tcmalloc](http://htmlpreview.github.io/?https://github.com/gperftools/gperftools/blob/master/doc/heap_checker.html), but with a few key differences to remove the overhead. Instead of instrumenting every call to malloc and free, it queries the allocator (jemalloc) for active allocations when leak detection is requested. In addition, it performs a very short stop-the-world data collection on the main process, and then forks a copy of the process to perform the mark-and-sweep, minimizing disruption to the original process. - -In the default (zero-overhead) mode, the returned data on leaks is limited to the address, approximate (upper bound) size, and the the first 32 bytes of the contents of the leaked allocation. If malloc_debug backtraces are enabled they will be included in the leak information, but backtracing allocations requires significant overhead. - ----------- - -Usage -------- - -### In Android apps ### - -libmemunreachble is loaded by zygote and can be triggered with `dumpsys -t 600 meminfo --unreachable [process]`. - -To enable malloc\_debug backtraces on allocations for a single app process on a userdebug device, use: -``` -adb root -adb shell setprop libc.debug.malloc.program app_process -adb shell setprop wrap.[process] "\$\@" -adb shell setprop libc.debug.malloc.options backtrace=4 -``` - -Kill and restart the app, trigger the leak, and then run `dumpsys -t 600 meminfo --unreachable [process]`. - -To disable malloc\_debug: -``` -adb shell setprop libc.debug.malloc.options "''" -adb shell setprop libc.debug.malloc.program "''" -adb shell setprop wrap.[process] "''" -``` - -### C interface ### - -#### `bool LogUnreachableMemory(bool log_contents, size_t limit)` #### -Writes a description of leaked memory to the log. A summary is always written, followed by details of up to `limit` leaks. If `log_contents` is `true`, details include up to 32 bytes of the contents of each leaked allocation. -Returns true if leak detection succeeded. - -#### `bool NoLeaks()` #### -Returns `true` if no unreachable memory was found. - -### C++ interface ### - -#### `bool GetUnreachableMemory(UnreachableMemoryInfo& info, size_t limit = 100)` #### -Updates an `UnreachableMemoryInfo` object with information on leaks, including details on up to `limit` leaks. Returns true if leak detection succeeded. - -#### `std::string GetUnreachableMemoryString(bool log_contents = false, size_t limit = 100)` #### -Returns a description of leaked memory. A summary is always written, followed by details of up to `limit` leaks. If `log_contents` is `true`, details include up to 32 bytes of the contents of each leaked allocation. -Returns true if leak detection succeeded. - -Implementation -------------------- -The sequence of steps required to perform a leak detection pass is divided into three processes - the original process, the collection process, and the sweeper process. - - 1. *Original process*: Leak detection is requested by calling `GetUnreachableMemory()` - 2. Allocations are disabled using `malloc_disable()` - 3. The collection process is spawned. The collection process, created using clone, is similar to a normal `fork()` child process, except that it shares the address space of the parent - any writes by the original process are visible to the collection process, and vice-versa. If we forked instead of using clone, the address space might get out of sync with observed post-ptrace thread state, since it takes some time to pause the parent. - 4. *Collection process*: All threads in the original process are paused with `ptrace()`. - 5. Registers contents, active stack areas, and memory mapping information are collected. - 6. *Original process*: Allocations are re-enabled using `malloc_enable()`, but all threads are still paused with `ptrace()`. - 7. *Collection process*: The sweeper process is spawned using a normal `fork()`. The sweeper process has a copy of all memory from the original process, including all the data collected by the collection process. - 8. Collection process releases all threads from `ptrace` and exits - 9. *Original process*: All threads continue, the thread that called `GetUnreachableMemory()` blocks waiting for leak data over a pipe. - 10. *Sweeper process*: A list of all active allocations is produced by examining the memory mappings and calling `malloc_iterate()` on any heap mappings. - 11. A list of all roots is produced from globals (.data and .bss sections of binaries), and registers and stacks from each thread. - 12. The mark-and-sweep pass is performed starting from roots. - 13. Unmarked allocations are sent over the pipe back to the original process. - ----------- - - -Components ---------------- -- `MemUnreachable.cpp`: Entry points, implements the sequencing described above. -- `PtracerThread.cpp`: Used to clone the collection process with shared address space. -- `ThreadCapture.cpp`: Pauses threads in the main process and collects register contents. -- `ProcessMappings.cpp`: Collects snapshots of `/proc/pid/maps`. -- `HeapWalker.cpp`: Performs the mark-and-sweep pass over active allocations. -- `LeakPipe.cpp`: transfers data describing leaks from the sweeper process to the original process. - - -Heap allocator requirements ----------------------------------- -libmemunreachable requires a small interface to the allocator in order to collect information about active allocations. - - - `malloc_disable()`: prevent any thread from mutating internal allocator state. - - `malloc enable()`: re-enable allocations in all threads. - - `malloc_iterate()`: call a callback on each active allocation in a given heap region. - - `malloc_backtrace()`: return the backtrace from when the allocation at the given address was allocated, if it was collected. diff --git a/libmemunreachable/ScopedAlarm.h b/libmemunreachable/ScopedAlarm.h deleted file mode 100644 index bb50b9e92..000000000 --- a/libmemunreachable/ScopedAlarm.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_SCOPED_ALARM_H_ -#define LIBMEMUNREACHABLE_SCOPED_ALARM_H_ - -#include -#include - -#include -#include - -namespace android { - -class ScopedAlarm { - public: - ScopedAlarm(std::chrono::microseconds us, std::function func) { - func_ = func; - struct sigaction oldact {}; - struct sigaction act {}; - act.sa_handler = [](int) { ScopedAlarm::func_(); }; - sigaction(SIGALRM, &act, &oldact); - - std::chrono::seconds s = std::chrono::duration_cast(us); - itimerval t = itimerval{}; - t.it_value.tv_sec = s.count(); - t.it_value.tv_usec = (us - s).count(); - setitimer(ITIMER_REAL, &t, NULL); - } - ~ScopedAlarm() { - itimerval t = itimerval{}; - setitimer(ITIMER_REAL, &t, NULL); - struct sigaction act {}; - act.sa_handler = SIG_DFL; - sigaction(SIGALRM, &act, NULL); - } - - private: - static std::function func_; -}; - -} // namespace android - -#endif diff --git a/libmemunreachable/ScopedDisableMalloc.h b/libmemunreachable/ScopedDisableMalloc.h deleted file mode 100644 index dc863c982..000000000 --- a/libmemunreachable/ScopedDisableMalloc.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_SCOPED_DISABLE_MALLOC_H_ -#define LIBMEMUNREACHABLE_SCOPED_DISABLE_MALLOC_H_ - -#include - -#include "android-base/macros.h" - -#include "ScopedAlarm.h" -#include "bionic.h" -#include "log.h" - -namespace android { - -class DisableMallocGuard { - public: - DisableMallocGuard() : disabled_(false) {} - ~DisableMallocGuard() { Enable(); } - - void Disable() { - if (!disabled_) { - disabled_ = true; - malloc_disable(); - } - } - - void Enable() { - if (disabled_) { - malloc_enable(); - disabled_ = false; - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(DisableMallocGuard); - bool disabled_; -}; - -// Any calls to malloc or free from this thread will deadlock as long as this -// object is in scope. Calls to malloc from other threads may succeed (for -// example if the allocation is satisfied out of the thread's tcache), or may -// block until the object is destroyed. -// -// Don't call fork() while malloc is disabled, it needs the same locks held -// here. -class ScopedDisableMalloc { - public: - ScopedDisableMalloc() { disable_malloc_.Disable(); } - - ~ScopedDisableMalloc() { disable_malloc_.Enable(); } - - private: - DISALLOW_COPY_AND_ASSIGN(ScopedDisableMalloc); - DisableMallocGuard disable_malloc_; -}; - -class ScopedDisableMallocTimeout { - public: - explicit ScopedDisableMallocTimeout(std::chrono::milliseconds timeout = std::chrono::seconds(10)) - : timeout_(timeout), timed_out_(false), disable_malloc_() { - Disable(); - } - - ~ScopedDisableMallocTimeout() { Enable(); } - - bool timed_out() { return timed_out_; } - - void Enable() { - disable_malloc_.Enable(); - alarm_ = nullptr; - } - - void Disable() { - // set up the alarm before disabling malloc so unique_ptr can be used - alarm_ = std::make_unique(timeout_, [&]() { - disable_malloc_.Enable(); - timed_out_ = true; - }); - - disable_malloc_.Disable(); - } - - private: - DISALLOW_COPY_AND_ASSIGN(ScopedDisableMallocTimeout); - std::chrono::milliseconds timeout_; - bool timed_out_; - std::unique_ptr alarm_; - DisableMallocGuard disable_malloc_; -}; - -} // namespace android - -#endif // LIBMEMUNREACHABLE_SCOPED_DISABLE_MALLOC_H_ diff --git a/libmemunreachable/ScopedPipe.h b/libmemunreachable/ScopedPipe.h deleted file mode 100644 index b9dead50d..000000000 --- a/libmemunreachable/ScopedPipe.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_SCOPED_PIPE_H_ -#define LIBMEMUNREACHABLE_SCOPED_PIPE_H_ - -#include - -#include "log.h" - -namespace android { - -class ScopedPipe { - public: - ScopedPipe() : pipefd_{-1, -1} { - int ret = pipe2(pipefd_, O_CLOEXEC); - if (ret < 0) { - MEM_LOG_ALWAYS_FATAL("failed to open pipe"); - } - } - ~ScopedPipe() { Close(); } - - ScopedPipe(ScopedPipe&& other) noexcept { - SetReceiver(other.ReleaseReceiver()); - SetSender(other.ReleaseSender()); - } - - ScopedPipe& operator=(ScopedPipe&& other) noexcept { - SetReceiver(other.ReleaseReceiver()); - SetSender(other.ReleaseSender()); - return *this; - } - - void CloseReceiver() { close(ReleaseReceiver()); } - - void CloseSender() { close(ReleaseSender()); } - - void Close() { - CloseReceiver(); - CloseSender(); - } - - int Receiver() { return pipefd_[0]; } - int Sender() { return pipefd_[1]; } - - int ReleaseReceiver() { - int ret = Receiver(); - SetReceiver(-1); - return ret; - } - - int ReleaseSender() { - int ret = Sender(); - SetSender(-1); - return ret; - } - - private: - void SetReceiver(int fd) { pipefd_[0] = fd; }; - void SetSender(int fd) { pipefd_[1] = fd; }; - - int pipefd_[2]; -}; - -} // namespace android - -#endif diff --git a/libmemunreachable/ScopedSignalHandler.h b/libmemunreachable/ScopedSignalHandler.h deleted file mode 100644 index ef4473f7a..000000000 --- a/libmemunreachable/ScopedSignalHandler.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_SCOPED_SIGNAL_HANDLER_H_ -#define LIBMEMUNREACHABLE_SCOPED_SIGNAL_HANDLER_H_ - -#include -#include - -#include - -#include "android-base/macros.h" - -#include "Allocator.h" -#include "log.h" - -namespace android { - -class ScopedSignalHandler { - public: - using Fn = std::function; - - explicit ScopedSignalHandler(Allocator allocator) : signal_(-1) { - if (handler_map_ == nullptr) { - Allocator map_allocator = allocator; - handler_map_ = map_allocator.make_unique(allocator); - } - } - ~ScopedSignalHandler() { reset(); } - - template - void install(int signal, F&& f) { - if (signal_ != -1) MEM_LOG_ALWAYS_FATAL("ScopedSignalHandler already installed"); - - if (handler_map_->find(signal) != handler_map_->end()) { - MEM_LOG_ALWAYS_FATAL("ScopedSignalHandler already installed for %d", signal); - } - - (*handler_map_)[signal] = - SignalFn([=](int signal, siginfo_t* si, void* uctx) { f(*this, signal, si, uctx); }); - - struct sigaction act {}; - act.sa_sigaction = [](int signal, siginfo_t* si, void* uctx) { - ((*handler_map_)[signal])(signal, si, uctx); - }; - act.sa_flags = SA_SIGINFO; - - int ret = sigaction(signal, &act, &old_act_); - if (ret < 0) { - MEM_LOG_ALWAYS_FATAL("failed to install segfault handler: %s", strerror(errno)); - } - - signal_ = signal; - } - - void reset() { - if (signal_ != -1) { - int ret = sigaction(signal_, &old_act_, NULL); - if (ret < 0) { - MEM_ALOGE("failed to uninstall segfault handler"); - } - - handler_map_->erase(signal_); - if (handler_map_->empty()) { - handler_map_.reset(); - } - signal_ = -1; - } - } - - private: - using SignalFn = std::function; - using SignalFnMap = allocator::unordered_map; - DISALLOW_COPY_AND_ASSIGN(ScopedSignalHandler); - int signal_; - struct sigaction old_act_; - static Allocator::unique_ptr handler_map_; -}; - -} // namespace android - -#endif // LIBMEMUNREACHABLE_SCOPED_SIGNAL_HANDLER_H_ diff --git a/libmemunreachable/Semaphore.h b/libmemunreachable/Semaphore.h deleted file mode 100644 index cd7397266..000000000 --- a/libmemunreachable/Semaphore.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_SEMAPHORE_H_ -#define LIBMEMUNREACHABLE_SEMAPHORE_H_ - -#include -#include - -#include "android-base/macros.h" - -namespace android { - -class Semaphore { - public: - explicit Semaphore(int count = 0) : count_(count) {} - ~Semaphore() = default; - - void Wait(std::chrono::milliseconds ms) { - std::unique_lock lk(m_); - cv_.wait_for(lk, ms, [&] { - if (count_ > 0) { - count_--; - return true; - } - return false; - }); - } - void Post() { - { - std::lock_guard lk(m_); - count_++; - } - cv_.notify_one(); - } - - private: - DISALLOW_COPY_AND_ASSIGN(Semaphore); - - int count_; - std::mutex m_; - std::condition_variable cv_; -}; - -} // namespace android - -#endif // LIBMEMUNREACHABLE_SEMAPHORE_H_ diff --git a/libmemunreachable/Tarjan.h b/libmemunreachable/Tarjan.h deleted file mode 100644 index f3ab65252..000000000 --- a/libmemunreachable/Tarjan.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2016 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. - */ - -// Based on system/update_engine/payload_generator/tarjan.cc - -#ifndef LIBMEMUNREACHABLE_TARJAN_H_ -#define LIBMEMUNREACHABLE_TARJAN_H_ - -#include -#include - -#include "Allocator.h" - -namespace android { - -template -class Node { - public: - allocator::set*> references_in; - allocator::set*> references_out; - size_t index; - size_t lowlink; - - T* ptr; - - Node(T* ptr, Allocator allocator) - : references_in(allocator), references_out(allocator), ptr(ptr){}; - Node(Node&& rhs) noexcept = default; - void Edge(Node* ref) { - references_out.emplace(ref); - ref->references_in.emplace(this); - } - template - void Foreach(F&& f) { - for (auto& node : references_out) { - f(node->ptr); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(Node); -}; - -template -using Graph = allocator::vector*>; - -template -using SCC = allocator::vector*>; - -template -using SCCList = allocator::vector>; - -template -class TarjanAlgorithm { - public: - explicit TarjanAlgorithm(Allocator allocator) - : index_(0), stack_(allocator), components_(allocator) {} - - void Execute(Graph& graph, SCCList& out); - - private: - static constexpr size_t UNDEFINED_INDEX = static_cast(-1); - void Tarjan(Node* vertex, Graph& graph); - - size_t index_; - allocator::vector*> stack_; - SCCList components_; -}; - -template -void TarjanAlgorithm::Execute(Graph& graph, SCCList& out) { - stack_.clear(); - components_.clear(); - index_ = 0; - for (auto& it : graph) { - it->index = UNDEFINED_INDEX; - it->lowlink = UNDEFINED_INDEX; - } - - for (auto& it : graph) { - if (it->index == UNDEFINED_INDEX) { - Tarjan(it, graph); - } - } - out.swap(components_); -} - -template -void TarjanAlgorithm::Tarjan(Node* vertex, Graph& graph) { - assert(vertex->index == UNDEFINED_INDEX); - vertex->index = index_; - vertex->lowlink = index_; - index_++; - stack_.push_back(vertex); - for (auto& it : vertex->references_out) { - Node* vertex_next = it; - if (vertex_next->index == UNDEFINED_INDEX) { - Tarjan(vertex_next, graph); - vertex->lowlink = std::min(vertex->lowlink, vertex_next->lowlink); - } else if (std::find(stack_.begin(), stack_.end(), vertex_next) != stack_.end()) { - vertex->lowlink = std::min(vertex->lowlink, vertex_next->index); - } - } - if (vertex->lowlink == vertex->index) { - SCC component{components_.get_allocator()}; - Node* other_vertex; - do { - other_vertex = stack_.back(); - stack_.pop_back(); - component.push_back(other_vertex); - } while (other_vertex != vertex && !stack_.empty()); - - components_.emplace_back(component); - } -} - -template -void Tarjan(Graph& graph, SCCList& out) { - TarjanAlgorithm tarjan{graph.get_allocator()}; - tarjan.Execute(graph, out); -} - -} // namespace android - -#endif // LIBMEMUNREACHABLE_TARJAN_H_ diff --git a/libmemunreachable/ThreadCapture.cpp b/libmemunreachable/ThreadCapture.cpp deleted file mode 100644 index 45eb55de8..000000000 --- a/libmemunreachable/ThreadCapture.cpp +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright (C) 2016 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 "ThreadCapture.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -#include "Allocator.h" -#include "log.h" - -namespace android { - -// bionic interfaces used: -// atoi -// strlcat -// writev - -// bionic interfaces reimplemented to avoid allocation: -// getdents64 - -// Convert a pid > 0 to a string. sprintf might allocate, so we can't use it. -// Returns a pointer somewhere in buf to a null terminated string, or NULL -// on error. -static char* pid_to_str(char* buf, size_t len, pid_t pid) { - if (pid <= 0) { - return nullptr; - } - - char* ptr = buf + len - 1; - *ptr = 0; - while (pid > 0) { - ptr--; - if (ptr < buf) { - return nullptr; - } - *ptr = '0' + (pid % 10); - pid /= 10; - } - - return ptr; -} - -class ThreadCaptureImpl { - public: - ThreadCaptureImpl(pid_t pid, Allocator& allocator); - ~ThreadCaptureImpl() {} - bool ListThreads(TidList& tids); - bool CaptureThreads(); - bool ReleaseThreads(); - bool ReleaseThread(pid_t tid); - bool CapturedThreadInfo(ThreadInfoList& threads); - void InjectTestFunc(std::function&& f) { inject_test_func_ = f; } - - private: - int CaptureThread(pid_t tid); - bool ReleaseThread(pid_t tid, unsigned int signal); - int PtraceAttach(pid_t tid); - void PtraceDetach(pid_t tid, unsigned int signal); - bool PtraceThreadInfo(pid_t tid, ThreadInfo& thread_info); - - allocator::map captured_threads_; - Allocator allocator_; - pid_t pid_; - std::function inject_test_func_; -}; - -ThreadCaptureImpl::ThreadCaptureImpl(pid_t pid, Allocator& allocator) - : captured_threads_(allocator), allocator_(allocator), pid_(pid) {} - -bool ThreadCaptureImpl::ListThreads(TidList& tids) { - tids.clear(); - - char pid_buf[11]; - char path[256] = "/proc/"; - char* pid_str = pid_to_str(pid_buf, sizeof(pid_buf), pid_); - if (!pid_str) { - return false; - } - strlcat(path, pid_str, sizeof(path)); - strlcat(path, "/task", sizeof(path)); - - android::base::unique_fd fd(open(path, O_CLOEXEC | O_DIRECTORY | O_RDONLY)); - if (fd == -1) { - MEM_ALOGE("failed to open %s: %s", path, strerror(errno)); - return false; - } - - struct linux_dirent64 { - uint64_t d_ino; - int64_t d_off; - uint16_t d_reclen; - char d_type; - char d_name[]; - } __attribute((packed)); - char dirent_buf[4096]; - ssize_t nread; - do { - nread = syscall(SYS_getdents64, fd.get(), dirent_buf, sizeof(dirent_buf)); - if (nread < 0) { - MEM_ALOGE("failed to get directory entries from %s: %s", path, strerror(errno)); - return false; - } else if (nread > 0) { - ssize_t off = 0; - while (off < nread) { - linux_dirent64* dirent = reinterpret_cast(dirent_buf + off); - off += dirent->d_reclen; - pid_t tid = atoi(dirent->d_name); - if (tid <= 0) { - continue; - } - tids.push_back(tid); - } - } - - } while (nread != 0); - - return true; -} - -bool ThreadCaptureImpl::CaptureThreads() { - TidList tids{allocator_}; - - bool found_new_thread; - do { - if (!ListThreads(tids)) { - ReleaseThreads(); - return false; - } - - found_new_thread = false; - - for (auto it = tids.begin(); it != tids.end(); it++) { - auto captured = captured_threads_.find(*it); - if (captured == captured_threads_.end()) { - if (CaptureThread(*it) < 0) { - ReleaseThreads(); - return false; - } - found_new_thread = true; - } - } - } while (found_new_thread); - - return true; -} - -// Detatches from a thread, delivering signal if nonzero, logs on error -void ThreadCaptureImpl::PtraceDetach(pid_t tid, unsigned int signal) { - void* sig_ptr = reinterpret_cast(static_cast(signal)); - if (ptrace(PTRACE_DETACH, tid, NULL, sig_ptr) < 0 && errno != ESRCH) { - MEM_ALOGE("failed to detach from thread %d of process %d: %s", tid, pid_, strerror(errno)); - } -} - -// Attaches to and pauses thread. -// Returns 1 on attach, 0 on tid not found, -1 and logs on error -int ThreadCaptureImpl::PtraceAttach(pid_t tid) { - int ret = ptrace(PTRACE_SEIZE, tid, NULL, NULL); - if (ret < 0) { - MEM_ALOGE("failed to attach to thread %d of process %d: %s", tid, pid_, strerror(errno)); - return -1; - } - - if (inject_test_func_) { - inject_test_func_(tid); - } - - if (ptrace(PTRACE_INTERRUPT, tid, 0, 0) < 0) { - if (errno == ESRCH) { - return 0; - } else { - MEM_ALOGE("failed to interrupt thread %d of process %d: %s", tid, pid_, strerror(errno)); - PtraceDetach(tid, 0); - return -1; - } - } - return 1; -} - -bool ThreadCaptureImpl::PtraceThreadInfo(pid_t tid, ThreadInfo& thread_info) { - thread_info.tid = tid; - - const unsigned int max_num_regs = 128; // larger than number of registers on any device - uintptr_t regs[max_num_regs]; - struct iovec iovec; - iovec.iov_base = ®s; - iovec.iov_len = sizeof(regs); - - if (ptrace(PTRACE_GETREGSET, tid, reinterpret_cast(NT_PRSTATUS), &iovec)) { - MEM_ALOGE("ptrace getregset for thread %d of process %d failed: %s", tid, pid_, strerror(errno)); - return false; - } - - unsigned int num_regs = iovec.iov_len / sizeof(uintptr_t); - thread_info.regs.assign(®s[0], ®s[num_regs]); - - const int sp = -#if defined(__x86_64__) - offsetof(struct pt_regs, rsp) / sizeof(uintptr_t) -#elif defined(__i386__) - offsetof(struct pt_regs, esp) / sizeof(uintptr_t) -#elif defined(__arm__) - offsetof(struct pt_regs, ARM_sp) / sizeof(uintptr_t) -#elif defined(__aarch64__) - offsetof(struct user_pt_regs, sp) / sizeof(uintptr_t) -#elif defined(__mips__) || defined(__mips64__) - offsetof(struct pt_regs, regs[29]) / sizeof(uintptr_t) -#else -#error Unrecognized architecture -#endif - ; - - // TODO(ccross): use /proc/tid/status or /proc/pid/maps to get start_stack - - thread_info.stack = std::pair(regs[sp], 0); - - return true; -} - -int ThreadCaptureImpl::CaptureThread(pid_t tid) { - int ret = PtraceAttach(tid); - if (ret <= 0) { - return ret; - } - - int status = 0; - if (TEMP_FAILURE_RETRY(waitpid(tid, &status, __WALL)) < 0) { - MEM_ALOGE("failed to wait for pause of thread %d of process %d: %s", tid, pid_, strerror(errno)); - PtraceDetach(tid, 0); - return -1; - } - - if (!WIFSTOPPED(status)) { - MEM_ALOGE("thread %d of process %d was not paused after waitpid, killed?", tid, pid_); - return 0; - } - - unsigned int resume_signal = 0; - - unsigned int signal = WSTOPSIG(status); - if ((status >> 16) == PTRACE_EVENT_STOP) { - switch (signal) { - case SIGSTOP: - case SIGTSTP: - case SIGTTIN: - case SIGTTOU: - // group-stop signals - break; - case SIGTRAP: - // normal ptrace interrupt stop - break; - default: - MEM_ALOGE("unexpected signal %d with PTRACE_EVENT_STOP for thread %d of process %d", signal, - tid, pid_); - return -1; - } - } else { - // signal-delivery-stop - resume_signal = signal; - } - - captured_threads_[tid] = resume_signal; - return 1; -} - -bool ThreadCaptureImpl::ReleaseThread(pid_t tid) { - auto it = captured_threads_.find(tid); - if (it == captured_threads_.end()) { - return false; - } - return ReleaseThread(it->first, it->second); -} - -bool ThreadCaptureImpl::ReleaseThread(pid_t tid, unsigned int signal) { - PtraceDetach(tid, signal); - return true; -} - -bool ThreadCaptureImpl::ReleaseThreads() { - bool ret = true; - for (auto it = captured_threads_.begin(); it != captured_threads_.end();) { - if (ReleaseThread(it->first, it->second)) { - it = captured_threads_.erase(it); - } else { - it++; - ret = false; - } - } - return ret; -} - -bool ThreadCaptureImpl::CapturedThreadInfo(ThreadInfoList& threads) { - threads.clear(); - - for (auto it = captured_threads_.begin(); it != captured_threads_.end(); it++) { - ThreadInfo t{0, allocator::vector(allocator_), std::pair(0, 0)}; - if (!PtraceThreadInfo(it->first, t)) { - return false; - } - threads.push_back(t); - } - return true; -} - -ThreadCapture::ThreadCapture(pid_t pid, Allocator allocator) { - Allocator impl_allocator = allocator; - impl_ = impl_allocator.make_unique(pid, impl_allocator); -} - -ThreadCapture::~ThreadCapture() {} - -bool ThreadCapture::ListThreads(TidList& tids) { - return impl_->ListThreads(tids); -} - -bool ThreadCapture::CaptureThreads() { - return impl_->CaptureThreads(); -} - -bool ThreadCapture::ReleaseThreads() { - return impl_->ReleaseThreads(); -} - -bool ThreadCapture::ReleaseThread(pid_t tid) { - return impl_->ReleaseThread(tid); -} - -bool ThreadCapture::CapturedThreadInfo(ThreadInfoList& threads) { - return impl_->CapturedThreadInfo(threads); -} - -void ThreadCapture::InjectTestFunc(std::function&& f) { - impl_->InjectTestFunc(std::forward>(f)); -} - -} // namespace android diff --git a/libmemunreachable/ThreadCapture.h b/libmemunreachable/ThreadCapture.h deleted file mode 100644 index 961cb60fa..000000000 --- a/libmemunreachable/ThreadCapture.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_THREAD_CAPTURE_H_ -#define LIBMEMUNREACHABLE_THREAD_CAPTURE_H_ - -#include - -#include "Allocator.h" - -namespace android { - -struct ThreadInfo { - pid_t tid; - allocator::vector regs; - std::pair stack; -}; - -using TidList = allocator::vector; -using ThreadInfoList = allocator::vector; - -class ThreadCaptureImpl; - -class ThreadCapture { - public: - ThreadCapture(pid_t pid, Allocator allocator); - ~ThreadCapture(); - - bool ListThreads(TidList& tids); - bool CaptureThreads(); - bool ReleaseThreads(); - bool ReleaseThread(pid_t tid); - bool CapturedThreadInfo(ThreadInfoList& threads); - void InjectTestFunc(std::function&& f); - - private: - ThreadCapture(const ThreadCapture&) = delete; - void operator=(const ThreadCapture&) = delete; - - Allocator::unique_ptr impl_; -}; - -} // namespace android - -#endif diff --git a/libmemunreachable/bionic.h b/libmemunreachable/bionic.h deleted file mode 100644 index dd1ec79d6..000000000 --- a/libmemunreachable/bionic.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_BIONIC_H_ -#define LIBMEMUNREACHABLE_BIONIC_H_ - -#include -#include -#include - -__BEGIN_DECLS - -/* Exported from bionic */ -extern void malloc_disable(); -extern void malloc_enable(); -extern int malloc_iterate(uintptr_t base, size_t size, - void (*callback)(uintptr_t base, size_t size, void* arg), void* arg); -extern ssize_t malloc_backtrace(void* pointer, uintptr_t* frames, size_t frame_count); - -__END_DECLS - -#endif // LIBMEMUNREACHABLE_BIONIC_H_ diff --git a/libmemunreachable/include/memunreachable/memunreachable.h b/libmemunreachable/include/memunreachable/memunreachable.h deleted file mode 100644 index 011443fe3..000000000 --- a/libmemunreachable/include/memunreachable/memunreachable.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_MEMUNREACHABLE_H_ -#define LIBMEMUNREACHABLE_MEMUNREACHABLE_H_ - -#include -#include - -#ifdef __cplusplus - -#include -#include - -namespace android { - -struct Leak { - uintptr_t begin = 0; - size_t size = 0; - - size_t referenced_count = 0; - size_t referenced_size = 0; - - size_t similar_count = 0; - size_t similar_size = 0; - size_t similar_referenced_count = 0; - size_t similar_referenced_size = 0; - - size_t total_size = 0; - - static const size_t contents_length = 32; - char contents[contents_length] = {}; - - struct Backtrace { - size_t num_frames = 0; - - static const size_t max_frames = 16; - uintptr_t frames[max_frames] = {}; - - size_t reserved[8] = {}; - } backtrace; - - size_t reserved[8] = {}; - - std::string ToString(bool log_contents) const; -}; - -struct UnreachableMemoryInfo { - std::vector leaks; - size_t num_leaks = 0; - size_t leak_bytes = 0; - size_t num_allocations = 0; - size_t allocation_bytes = 0; - - size_t version = 0; // Must be 0 - size_t reserved[8] = {}; - - UnreachableMemoryInfo() {} - ~UnreachableMemoryInfo(); - - std::string ToString(bool log_contents) const; -}; - -bool GetUnreachableMemory(UnreachableMemoryInfo& info, size_t limit = 100); - -std::string GetUnreachableMemoryString(bool log_contents = false, size_t limit = 100); - -} // namespace android - -#endif - -__BEGIN_DECLS - -bool LogUnreachableMemory(bool log_contents, size_t limit); - -bool NoLeaks(); - -__END_DECLS - -#endif // LIBMEMUNREACHABLE_MEMUNREACHABLE_H_ diff --git a/libmemunreachable/libmemunreachable.map b/libmemunreachable/libmemunreachable.map deleted file mode 100644 index 0d0d954b1..000000000 --- a/libmemunreachable/libmemunreachable.map +++ /dev/null @@ -1,13 +0,0 @@ -LIBMEMUNREACHABLE { - global: - LogUnreachableMemory; - NoLeaks; - extern "C++" { - android::GetUnreachableMemory*; - android::GetUnreachableMemoryString*; - android::Leak::*; - android::UnreachableMemoryInfo::*; - }; - local: - *; -}; diff --git a/libmemunreachable/log.h b/libmemunreachable/log.h deleted file mode 100644 index 44c5f853b..000000000 --- a/libmemunreachable/log.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2016 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 LIBMEMUNREACHABLE_LOG_H_ -#define LIBMEMUNREACHABLE_LOG_H_ - -#define LOG_TAG "libmemunreachable" - -#if defined(__ANDROID__) - -#include - -#define MEM_ALOGE(...) async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, ##__VA_ARGS__) -#define MEM_ALOGW(...) async_safe_format_log(ANDROID_LOG_WARN, LOG_TAG, ##__VA_ARGS__) -#define MEM_ALOGI(...) async_safe_format_log(ANDROID_LOG_INFO, LOG_TAG, ##__VA_ARGS__) -#define MEM_ALOGV_IMPL(...) async_safe_format_log(ANDROID_LOG_VERBOSE, LOG_TAG, ##__VA_ARGS__) - -#ifdef NDEBUG -#define MEM_ALOGV(...) \ - do { \ - if (0) { \ - MEM_ALOGV_IMPL(__VA_ARGS__); \ - } \ - } while (0) -#else -#define MEM_ALOGV(...) MEM_ALOGV_IMPL(__VA_ARGS__) -#endif - -#define MEM_LOG_ALWAYS_FATAL(...) async_safe_fatal(__VA_ARGS__) - -#else - -#include - -#define MEM_ALOGW ALOGW -#define MEM_ALOGE ALOGE -#define MEM_ALOGV ALOGV -#define MEM_ALOGI ALOGI - -#define MEM_LOG_ALWAYS_FATAL LOG_ALWAYS_FATAL - -#endif - -#endif // LIBMEMUNREACHABLE_LOG_H_ diff --git a/libmemunreachable/tests/Allocator_test.cpp b/libmemunreachable/tests/Allocator_test.cpp deleted file mode 100644 index 8991a7b0b..000000000 --- a/libmemunreachable/tests/Allocator_test.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2016 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 - -namespace android { - -std::function ScopedAlarm::func_; - -class AllocatorTest : public testing::Test { - protected: - AllocatorTest() : heap(), disable_malloc_() {} - virtual void SetUp() { heap_count = 0; } - virtual void TearDown() { - ASSERT_EQ(heap_count, 0); - ASSERT_TRUE(heap.empty()); - ASSERT_FALSE(disable_malloc_.timed_out()); - } - Heap heap; - - private: - ScopedDisableMallocTimeout disable_malloc_; -}; - -TEST_F(AllocatorTest, simple) { - Allocator allocator(heap); - void* ptr = allocator.allocate(); - ASSERT_TRUE(ptr != NULL); - allocator.deallocate(ptr); -} - -TEST_F(AllocatorTest, multiple) { - Allocator allocator(heap); - void* ptr1 = allocator.allocate(); - ASSERT_TRUE(ptr1 != NULL); - void* ptr2 = allocator.allocate(); - ASSERT_TRUE(ptr2 != NULL); - ASSERT_NE(ptr1, ptr2); - allocator.deallocate(ptr1); - void* ptr3 = allocator.allocate(); - ASSERT_EQ(ptr1, ptr3); - allocator.deallocate(ptr3); - allocator.deallocate(ptr2); -} - -TEST_F(AllocatorTest, many) { - const int num = 4096; - const int size = 128; - Allocator allocator(heap); - void* ptr[num]; - for (int i = 0; i < num; i++) { - ptr[i] = allocator.allocate(); - memset(ptr[i], 0xaa, size); - *(reinterpret_cast(ptr[i])) = i; - } - - for (int i = 0; i < num; i++) { - for (int j = 0; j < num; j++) { - if (i != j) { - ASSERT_NE(ptr[i], ptr[j]); - } - } - } - - for (int i = 0; i < num; i++) { - ASSERT_EQ(*(reinterpret_cast(ptr[i])), i & 0xFF); - allocator.deallocate(ptr[i]); - } -} - -TEST_F(AllocatorTest, large) { - const size_t size = 1024 * 1024; - Allocator allocator(heap); - void* ptr = allocator.allocate(); - memset(ptr, 0xaa, size); - allocator.deallocate(ptr); -} - -TEST_F(AllocatorTest, many_large) { - const int num = 128; - const int size = 1024 * 1024; - Allocator allocator(heap); - void* ptr[num]; - for (int i = 0; i < num; i++) { - ptr[i] = allocator.allocate(); - memset(ptr[i], 0xaa, size); - *(reinterpret_cast(ptr[i])) = i; - } - - for (int i = 0; i < num; i++) { - ASSERT_EQ(*(reinterpret_cast(ptr[i])), i & 0xFF); - allocator.deallocate(ptr[i]); - } -} - -TEST_F(AllocatorTest, copy) { - Allocator a(heap); - Allocator b = a; - Allocator c(b); - Allocator d(a); - Allocator e(heap); - - ASSERT_EQ(a, b); - ASSERT_EQ(a, c); - ASSERT_EQ(a, d); - ASSERT_EQ(a, e); - - void* ptr1 = a.allocate(); - void* ptr2 = b.allocate(); - void* ptr3 = c.allocate(); - void* ptr4 = d.allocate(); - - b.deallocate(ptr1); - d.deallocate(ptr2); - a.deallocate(ptr3); - c.deallocate(ptr4); -} - -TEST_F(AllocatorTest, stl_vector) { - auto v = allocator::vector(Allocator(heap)); - for (int i = 0; i < 1024; i++) { - v.push_back(i); - } - for (int i = 0; i < 1024; i++) { - ASSERT_EQ(v[i], i); - } - v.clear(); -} - -TEST_F(AllocatorTest, stl_list) { - auto v = allocator::list(Allocator(heap)); - for (int i = 0; i < 1024; i++) { - v.push_back(i); - } - int i = 0; - for (auto iter = v.begin(); iter != v.end(); iter++, i++) { - ASSERT_EQ(*iter, i); - } - v.clear(); -} - -TEST_F(AllocatorTest, shared) { - Allocator allocator(heap); - - Allocator::shared_ptr ptr = allocator.make_shared(0); - { - auto ptr2 = ptr; // NOLINT, test copy of ptr - } - ASSERT_NE(ptr, nullptr); -} - -TEST_F(AllocatorTest, unique) { - Allocator allocator(heap); - - Allocator::unique_ptr ptr = allocator.make_unique(0); - - ASSERT_NE(ptr, nullptr); -} - -} // namespace android diff --git a/libmemunreachable/tests/AndroidTest.xml b/libmemunreachable/tests/AndroidTest.xml deleted file mode 100644 index 604c0ec0a..000000000 --- a/libmemunreachable/tests/AndroidTest.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - diff --git a/libmemunreachable/tests/Binder_test.cpp b/libmemunreachable/tests/Binder_test.cpp deleted file mode 100644 index eaf7652d1..000000000 --- a/libmemunreachable/tests/Binder_test.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2016 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 -#include -#include -#include -#include - -#include - -#include "Allocator.h" -#include "Binder.h" - -namespace android { - -static const String16 service_name("test.libmemunreachable_binder"); - -// Provides a service that will hold a strong reference to any remote binder -// object, so that the test can verify that a remote strong reference is -// visible to libmemunreachable. -class BinderService : public BBinder { - public: - BinderService() = default; - virtual ~BinderService() = default; - - virtual status_t onTransact(uint32_t /*code*/, const Parcel& data, Parcel* reply, - uint32_t /*flags*/ = 0) { - reply->writeStrongBinder(ref); - ref = data.readStrongBinder(); - return 0; - } - - private: - sp ref; -}; - -class BinderObject : public BBinder { - public: - BinderObject() = default; - ~BinderObject() = default; -}; - -// Forks a subprocess that registers a BinderService with the global binder -// servicemanager. Requires root permissions. -class ServiceProcess { - public: - ServiceProcess() : child_(0) {} - ~ServiceProcess() { Stop(); } - - bool Run() { - pid_t ret = fork(); - if (ret < 0) { - return false; - } else if (ret == 0) { - // child - _exit(Service()); - } else { - // parent - child_ = ret; - return true; - } - } - - bool Stop() { - if (child_ > 0) { - if (kill(child_, SIGTERM)) { - return false; - } - int status = 0; - if (TEMP_FAILURE_RETRY(waitpid(child_, &status, 0)) != child_) { - return false; - } - child_ = 0; - return WIFEXITED(status) && WEXITSTATUS(status) == 0; - } - - return true; - } - - int Service() { - sp proc{ProcessState::self()}; - sp sm = defaultServiceManager(); - if (sm == nullptr) { - fprintf(stderr, "Failed to get service manager\n"); - return 1; - } - // This step requires root permissions - if (sm->addService(service_name, new BinderService()) != OK) { - fprintf(stderr, "Failed to add test service\n"); - return 1; - } - proc->startThreadPool(); - pause(); - return 0; - } - - private: - pid_t child_; -}; - -class MemunreachableBinderTest : public ::testing::Test { - protected: - ServiceProcess service_process_; -}; - -// Tests that a local binder object with a remote strong reference is visible -// through the libmemunreachable BinderReferences interface, which uses the -// getBinderKernelReferences method in libbinder. Starts a BinderService -// through ServiceProcess as a remote service to hold the strong reference. -TEST_F(MemunreachableBinderTest, binder) { - ASSERT_EQ(static_cast(0), getuid()) << "This test must be run as root."; - - ServiceProcess service_process; - ASSERT_TRUE(service_process.Run()); - - sp sm = defaultServiceManager(); - ASSERT_TRUE(sm != nullptr); - - // A small sleep allows the service to start, which - // prevents a longer sleep in getService. - usleep(100000); - - sp service = sm->getService(service_name); - ASSERT_TRUE(service != nullptr); - - sp binder{new BinderObject()}; - - Parcel send; - Parcel reply; - - send.writeStrongBinder(binder); - status_t rv = service->transact(0, send, &reply); - ASSERT_EQ(static_cast(OK), rv); - - Heap heap; - allocator::vector refs{heap}; - - ASSERT_TRUE(BinderReferences(refs)); - - bool found_ref = false; - for (auto ref : refs) { - if (ref == reinterpret_cast(binder.get())) { - found_ref = true; - } - } - - ASSERT_TRUE(found_ref); -} - -} // namespace android diff --git a/libmemunreachable/tests/DisableMalloc_test.cpp b/libmemunreachable/tests/DisableMalloc_test.cpp deleted file mode 100644 index f4467190c..000000000 --- a/libmemunreachable/tests/DisableMalloc_test.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2016 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 -#include - -using namespace std::chrono_literals; - -namespace android { - -class DisableMallocTest : public ::testing::Test { - protected: - void alarm(std::chrono::microseconds us) { - std::chrono::seconds s = std::chrono::duration_cast(us); - itimerval t = itimerval(); - t.it_value.tv_sec = s.count(); - t.it_value.tv_usec = (us - s).count(); - setitimer(ITIMER_REAL, &t, NULL); - } -}; - -TEST_F(DisableMallocTest, reenable) { - ASSERT_EXIT( - { - alarm(100ms); - void* ptr1 = malloc(128); - ASSERT_NE(ptr1, nullptr); - free(ptr1); - { ScopedDisableMalloc disable_malloc; } - void* ptr2 = malloc(128); - ASSERT_NE(ptr2, nullptr); - free(ptr2); - _exit(1); - }, - ::testing::ExitedWithCode(1), ""); -} - -TEST_F(DisableMallocTest, deadlock_allocate) { - ASSERT_DEATH( - { - void* ptr = malloc(128); - ASSERT_NE(ptr, nullptr); - free(ptr); - { - alarm(100ms); - ScopedDisableMalloc disable_malloc; - void* ptr = malloc(128); - ASSERT_NE(ptr, nullptr); - free(ptr); - } - }, - ""); -} - -TEST_F(DisableMallocTest, deadlock_new) { - ASSERT_DEATH( - { - // C++ allows `new Foo` to be replaced with a stack allocation or merged - // with future `new Foo` expressions, provided certain conditions are - // met [expr.new/10]. None of this applies to `operator new(size_t)`. - void* ptr = ::operator new(1); - ASSERT_NE(ptr, nullptr); - ::operator delete(ptr); - { - alarm(100ms); - ScopedDisableMalloc disable_malloc; - void* ptr = ::operator new(1); - ASSERT_NE(ptr, nullptr); - ::operator delete(ptr); - } - }, - ""); -} - -TEST_F(DisableMallocTest, deadlock_delete) { - ASSERT_DEATH( - { - void* ptr = ::operator new(1); - ASSERT_NE(ptr, nullptr); - { - alarm(250ms); - ScopedDisableMalloc disable_malloc; - ::operator delete(ptr); - } - }, - ""); -} - -TEST_F(DisableMallocTest, deadlock_free) { - ASSERT_DEATH( - { - void* ptr = malloc(128); - ASSERT_NE(ptr, nullptr); - { - alarm(100ms); - ScopedDisableMalloc disable_malloc; - free(ptr); - } - }, - ""); -} - -TEST_F(DisableMallocTest, deadlock_fork) { - ASSERT_DEATH({ - { - alarm(100ms); - ScopedDisableMalloc disable_malloc; - fork(); -} -}, ""); -} - -} // namespace android diff --git a/libmemunreachable/tests/HeapWalker_test.cpp b/libmemunreachable/tests/HeapWalker_test.cpp deleted file mode 100644 index 9610cd633..000000000 --- a/libmemunreachable/tests/HeapWalker_test.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 2016 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 "HeapWalker.h" - -#include -#include -#include "Allocator.h" - -namespace android { - -class HeapWalkerTest : public ::testing::Test { - public: - HeapWalkerTest() : disable_malloc_(), heap_() {} - - void TearDown() { - ASSERT_TRUE(heap_.empty()); - if (!HasFailure()) { - ASSERT_FALSE(disable_malloc_.timed_out()); - } - } - - protected: - ScopedDisableMallocTimeout disable_malloc_; - Heap heap_; -}; - -TEST_F(HeapWalkerTest, allocation) { - HeapWalker heap_walker(heap_); - ASSERT_TRUE(heap_walker.Allocation(3, 4)); - ASSERT_TRUE(heap_walker.Allocation(2, 3)); - ASSERT_TRUE(heap_walker.Allocation(4, 5)); - ASSERT_TRUE(heap_walker.Allocation(6, 7)); - ASSERT_TRUE(heap_walker.Allocation(0, 1)); -} - -TEST_F(HeapWalkerTest, overlap) { - HeapWalker heap_walker(heap_); - ASSERT_TRUE(heap_walker.Allocation(2, 3)); - ASSERT_TRUE(heap_walker.Allocation(3, 4)); - ASSERT_FALSE(heap_walker.Allocation(2, 3)); - ASSERT_FALSE(heap_walker.Allocation(1, 3)); - ASSERT_FALSE(heap_walker.Allocation(1, 4)); - ASSERT_FALSE(heap_walker.Allocation(1, 5)); - ASSERT_FALSE(heap_walker.Allocation(3, 4)); - ASSERT_FALSE(heap_walker.Allocation(3, 5)); - ASSERT_TRUE(heap_walker.Allocation(4, 5)); - ASSERT_TRUE(heap_walker.Allocation(1, 2)); -} - -TEST_F(HeapWalkerTest, zero) { - HeapWalker heap_walker(heap_); - ASSERT_TRUE(heap_walker.Allocation(2, 2)); - ASSERT_FALSE(heap_walker.Allocation(2, 2)); - ASSERT_TRUE(heap_walker.Allocation(3, 3)); - ASSERT_TRUE(heap_walker.Allocation(1, 1)); - ASSERT_FALSE(heap_walker.Allocation(2, 3)); -} - -TEST_F(HeapWalkerTest, mapping) { - HeapWalker heap_walker(heap_); - heap_walker.Mapping(2, 3); - heap_walker.Mapping(4, 5); - ASSERT_TRUE(heap_walker.Allocation(2, 3)); - ASSERT_TRUE(heap_walker.Allocation(4, 5)); - // space between mappings is not checked, but could be in the future - ASSERT_TRUE(heap_walker.Allocation(3, 4)); - - // re-enable malloc, ASSERT_DEATH may allocate - disable_malloc_.Enable(); - ASSERT_DEATH({ heap_walker.Allocation(1, 2); }, "0x1-0x2.*outside.*0x2-0x5"); - ASSERT_DEATH({ heap_walker.Allocation(1, 3); }, "0x1-0x3.*outside.*0x2-0x5"); - ASSERT_DEATH({ heap_walker.Allocation(4, 6); }, "0x4-0x6.*outside.*0x2-0x5"); - ASSERT_DEATH({ heap_walker.Allocation(5, 6); }, "0x5-0x6.*outside.*0x2-0x5"); - ASSERT_DEATH({ heap_walker.Allocation(1, 6); }, "0x1-0x6.*outside.*0x2-0x5"); -} - -#define buffer_begin(buffer) reinterpret_cast(buffer) -#define buffer_end(buffer) (reinterpret_cast(buffer) + sizeof(buffer)) - -TEST_F(HeapWalkerTest, leak) { - void* buffer1[16]{}; - char buffer2[16]{}; - buffer1[0] = &buffer2[0] - sizeof(void*); - buffer1[1] = &buffer2[15] + sizeof(void*); - - HeapWalker heap_walker(heap_); - heap_walker.Allocation(buffer_begin(buffer2), buffer_end(buffer2)); - - ASSERT_EQ(true, heap_walker.DetectLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, heap_walker.Leaked(leaked, 100, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(1U, num_leaks); - EXPECT_EQ(16U, leaked_bytes); - ASSERT_EQ(1U, leaked.size()); - EXPECT_EQ(buffer_begin(buffer2), leaked[0].begin); - EXPECT_EQ(buffer_end(buffer2), leaked[0].end); -} - -TEST_F(HeapWalkerTest, live) { - const int from_buffer_entries = 4; - const int to_buffer_bytes = 16; - - for (int i = 0; i < from_buffer_entries; i++) { - for (int j = 0; j < to_buffer_bytes; j++) { - void* buffer1[from_buffer_entries]{}; - char buffer2[to_buffer_bytes]{}; - buffer1[i] = &buffer2[j]; - - HeapWalker heap_walker(heap_); - heap_walker.Allocation(buffer_begin(buffer2), buffer_end(buffer2)); - heap_walker.Root(buffer_begin(buffer1), buffer_end(buffer1)); - - ASSERT_EQ(true, heap_walker.DetectLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = SIZE_MAX; - size_t leaked_bytes = SIZE_MAX; - ASSERT_EQ(true, heap_walker.Leaked(leaked, 100, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(0U, num_leaks); - EXPECT_EQ(0U, leaked_bytes); - EXPECT_EQ(0U, leaked.size()); - } - } -} - -TEST_F(HeapWalkerTest, unaligned) { - const int from_buffer_entries = 4; - const int to_buffer_bytes = 16; - void* buffer1[from_buffer_entries]{}; - char buffer2[to_buffer_bytes]{}; - - buffer1[1] = &buffer2; - - for (unsigned int i = 0; i < sizeof(uintptr_t); i++) { - for (unsigned int j = 0; j < sizeof(uintptr_t); j++) { - HeapWalker heap_walker(heap_); - heap_walker.Allocation(buffer_begin(buffer2), buffer_end(buffer2)); - heap_walker.Root(buffer_begin(buffer1) + i, buffer_end(buffer1) - j); - - ASSERT_EQ(true, heap_walker.DetectLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = SIZE_MAX; - size_t leaked_bytes = SIZE_MAX; - ASSERT_EQ(true, heap_walker.Leaked(leaked, 100, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(0U, num_leaks); - EXPECT_EQ(0U, leaked_bytes); - EXPECT_EQ(0U, leaked.size()); - } - } -} - -TEST_F(HeapWalkerTest, cycle) { - void* buffer1; - void* buffer2; - - buffer1 = &buffer2; - buffer2 = &buffer1; - - HeapWalker heap_walker(heap_); - heap_walker.Allocation(buffer_begin(buffer1), buffer_end(buffer1)); - heap_walker.Allocation(buffer_begin(buffer2), buffer_end(buffer2)); - - ASSERT_EQ(true, heap_walker.DetectLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, heap_walker.Leaked(leaked, 100, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(2U, num_leaks); - EXPECT_EQ(2 * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(2U, leaked.size()); -} - -TEST_F(HeapWalkerTest, segv) { - const size_t page_size = sysconf(_SC_PAGE_SIZE); - void* buffer1 = mmap(NULL, page_size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - ASSERT_NE(buffer1, nullptr); - void* buffer2; - - buffer2 = &buffer1; - - HeapWalker heap_walker(heap_); - heap_walker.Allocation(buffer_begin(buffer1), buffer_begin(buffer1) + page_size); - heap_walker.Root(buffer_begin(buffer2), buffer_end(buffer2)); - - ASSERT_EQ(true, heap_walker.DetectLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, heap_walker.Leaked(leaked, 100, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(0U, num_leaks); - EXPECT_EQ(0U, leaked_bytes); - ASSERT_EQ(0U, leaked.size()); -} - -} // namespace android diff --git a/libmemunreachable/tests/HostMallocStub.cpp b/libmemunreachable/tests/HostMallocStub.cpp deleted file mode 100644 index 0ef04870f..000000000 --- a/libmemunreachable/tests/HostMallocStub.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2016 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 "bionic.h" - -void malloc_disable() {} - -void malloc_enable() {} diff --git a/libmemunreachable/tests/LeakFolding_test.cpp b/libmemunreachable/tests/LeakFolding_test.cpp deleted file mode 100644 index f5b363140..000000000 --- a/libmemunreachable/tests/LeakFolding_test.cpp +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Copyright (C) 2016 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 "LeakFolding.h" -#include "HeapWalker.h" - -#include -#include -#include "Allocator.h" - -namespace android { - -class LeakFoldingTest : public ::testing::Test { - public: - LeakFoldingTest() : disable_malloc_(), heap_() {} - - void TearDown() { - ASSERT_TRUE(heap_.empty()); - if (!HasFailure()) { - ASSERT_FALSE(disable_malloc_.timed_out()); - } - } - - protected: - ScopedDisableMallocTimeout disable_malloc_; - Heap heap_; -}; - -#define buffer_begin(buffer) reinterpret_cast(&(buffer)[0]) -#define buffer_end(buffer) (reinterpret_cast(&(buffer)[0]) + sizeof(buffer)) -#define ALLOCATION(heap_walker, buffer) \ - ASSERT_EQ(true, (heap_walker).Allocation(buffer_begin(buffer), buffer_end(buffer))) - -TEST_F(LeakFoldingTest, one) { - void* buffer1[1] = {nullptr}; - - HeapWalker heap_walker(heap_); - - ALLOCATION(heap_walker, buffer1); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(1U, num_leaks); - EXPECT_EQ(sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(1U, leaked.size()); - EXPECT_EQ(0U, leaked[0].referenced_count); - EXPECT_EQ(0U, leaked[0].referenced_size); -} - -TEST_F(LeakFoldingTest, two) { - void* buffer1[1] = {nullptr}; - void* buffer2[1] = {nullptr}; - - HeapWalker heap_walker(heap_); - - ALLOCATION(heap_walker, buffer1); - ALLOCATION(heap_walker, buffer2); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(2U, num_leaks); - EXPECT_EQ(2 * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(2U, leaked.size()); - EXPECT_EQ(0U, leaked[0].referenced_count); - EXPECT_EQ(0U, leaked[0].referenced_size); - EXPECT_EQ(0U, leaked[1].referenced_count); - EXPECT_EQ(0U, leaked[1].referenced_size); -} - -TEST_F(LeakFoldingTest, dominator) { - void* buffer1[1]; - void* buffer2[1] = {nullptr}; - - buffer1[0] = buffer2; - - HeapWalker heap_walker(heap_); - - ALLOCATION(heap_walker, buffer1); - ALLOCATION(heap_walker, buffer2); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(2U, num_leaks); - EXPECT_EQ(2 * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(1U, leaked.size()); - EXPECT_EQ(1U, leaked[0].referenced_count); - EXPECT_EQ(sizeof(uintptr_t), leaked[0].referenced_size); -} - -TEST_F(LeakFoldingTest, cycle) { - void* buffer1[1]; - void* buffer2[1]; - void* buffer3[1]; - - buffer1[0] = buffer2; - buffer2[0] = buffer3; - buffer3[0] = buffer2; - - HeapWalker heap_walker(heap_); - - ALLOCATION(heap_walker, buffer1); - ALLOCATION(heap_walker, buffer2); - ALLOCATION(heap_walker, buffer3); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(3U, num_leaks); - EXPECT_EQ(3 * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(1U, leaked.size()); - EXPECT_EQ(2U, leaked[0].referenced_count); - EXPECT_EQ(2 * sizeof(uintptr_t), leaked[0].referenced_size); -} - -TEST_F(LeakFoldingTest, dominator_cycle) { - void* buffer1[2] = {nullptr, nullptr}; - void* buffer2[2]; - void* buffer3[1] = {nullptr}; - - buffer1[0] = &buffer2; - buffer2[0] = &buffer1; - buffer2[1] = &buffer3; - - HeapWalker heap_walker(heap_); - - ALLOCATION(heap_walker, buffer1); - ALLOCATION(heap_walker, buffer2); - ALLOCATION(heap_walker, buffer3); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(3U, num_leaks); - EXPECT_EQ(5 * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(2U, leaked.size()); - - EXPECT_EQ(2U, leaked[0].referenced_count); - EXPECT_EQ(3 * sizeof(uintptr_t), leaked[0].referenced_size); - EXPECT_EQ(2U, leaked[1].referenced_count); - EXPECT_EQ(3 * sizeof(uintptr_t), leaked[1].referenced_size); -} - -TEST_F(LeakFoldingTest, two_cycles) { - void* buffer1[1]; - void* buffer2[1]; - void* buffer3[1]; - void* buffer4[1]; - void* buffer5[1]; - void* buffer6[1]; - - buffer1[0] = buffer3; - buffer2[0] = buffer5; - buffer3[0] = buffer4; - buffer4[0] = buffer3; - buffer5[0] = buffer6; - buffer6[0] = buffer5; - - HeapWalker heap_walker(heap_); - - ALLOCATION(heap_walker, buffer1); - ALLOCATION(heap_walker, buffer2); - ALLOCATION(heap_walker, buffer3); - ALLOCATION(heap_walker, buffer4); - ALLOCATION(heap_walker, buffer5); - ALLOCATION(heap_walker, buffer6); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(6U, num_leaks); - EXPECT_EQ(6 * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(2U, leaked.size()); - EXPECT_EQ(2U, leaked[0].referenced_count); - EXPECT_EQ(2 * sizeof(uintptr_t), leaked[0].referenced_size); - EXPECT_EQ(2U, leaked[1].referenced_count); - EXPECT_EQ(2 * sizeof(uintptr_t), leaked[1].referenced_size); -} - -TEST_F(LeakFoldingTest, two_dominator_cycles) { - void* buffer1[1]; - void* buffer2[1]; - void* buffer3[1]; - void* buffer4[1]; - - buffer1[0] = buffer2; - buffer2[0] = buffer1; - buffer3[0] = buffer4; - buffer4[0] = buffer3; - - HeapWalker heap_walker(heap_); - - ALLOCATION(heap_walker, buffer1); - ALLOCATION(heap_walker, buffer2); - ALLOCATION(heap_walker, buffer3); - ALLOCATION(heap_walker, buffer4); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(4U, num_leaks); - EXPECT_EQ(4 * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(4U, leaked.size()); - EXPECT_EQ(1U, leaked[0].referenced_count); - EXPECT_EQ(sizeof(uintptr_t), leaked[0].referenced_size); - EXPECT_EQ(1U, leaked[1].referenced_count); - EXPECT_EQ(sizeof(uintptr_t), leaked[1].referenced_size); - EXPECT_EQ(1U, leaked[2].referenced_count); - EXPECT_EQ(sizeof(uintptr_t), leaked[2].referenced_size); - EXPECT_EQ(1U, leaked[3].referenced_count); - EXPECT_EQ(sizeof(uintptr_t), leaked[3].referenced_size); -} - -TEST_F(LeakFoldingTest, giant_dominator_cycle) { - const size_t n = 1000; - void* buffer[n]; - - HeapWalker heap_walker(heap_); - - for (size_t i = 0; i < n; i++) { - ASSERT_TRUE(heap_walker.Allocation(reinterpret_cast(&buffer[i]), - reinterpret_cast(&buffer[i + 1]))); - } - - for (size_t i = 0; i < n - 1; i++) { - buffer[i] = &buffer[i + 1]; - } - buffer[n - 1] = &buffer[0]; - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(n, num_leaks); - EXPECT_EQ(n * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(1000U, leaked.size()); - EXPECT_EQ(n - 1, leaked[0].referenced_count); - EXPECT_EQ((n - 1) * sizeof(uintptr_t), leaked[0].referenced_size); -} - -TEST_F(LeakFoldingTest, giant_cycle) { - const size_t n = 1000; - void* buffer[n]; - void* buffer1[1]; - - HeapWalker heap_walker(heap_); - - for (size_t i = 0; i < n - 1; i++) { - buffer[i] = &buffer[i + 1]; - } - buffer[n - 1] = &buffer[0]; - - buffer1[0] = &buffer[0]; - - for (size_t i = 0; i < n; i++) { - ASSERT_TRUE(heap_walker.Allocation(reinterpret_cast(&buffer[i]), - reinterpret_cast(&buffer[i + 1]))); - } - - ALLOCATION(heap_walker, buffer1); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(n + 1, num_leaks); - EXPECT_EQ((n + 1) * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(1U, leaked.size()); - EXPECT_EQ(n, leaked[0].referenced_count); - EXPECT_EQ(n * sizeof(uintptr_t), leaked[0].referenced_size); -} - -TEST_F(LeakFoldingTest, multipath) { - void* buffer1[2]; - void* buffer2[1]; - void* buffer3[1]; - void* buffer4[1] = {nullptr}; - - // 1 - // / \ - // v v - // 2 3 - // \ / - // v - // 4 - - buffer1[0] = &buffer2; - buffer1[1] = &buffer3; - buffer2[0] = &buffer4; - buffer3[0] = &buffer4; - - HeapWalker heap_walker(heap_); - - ALLOCATION(heap_walker, buffer1); - ALLOCATION(heap_walker, buffer2); - ALLOCATION(heap_walker, buffer3); - ALLOCATION(heap_walker, buffer4); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(4U, num_leaks); - EXPECT_EQ(5 * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(1U, leaked.size()); - EXPECT_EQ(3U, leaked[0].referenced_count); - EXPECT_EQ(3 * sizeof(uintptr_t), leaked[0].referenced_size); -} - -TEST_F(LeakFoldingTest, multicycle) { - void* buffer1[2]{}; - void* buffer2[2]{}; - void* buffer3[2]{}; - void* buffer4[2]{}; - - // 1 - // / ^ - // v \ - // 2 -> 3 - // \ ^ - // v / - // 4 - - buffer1[0] = &buffer2; - buffer2[0] = &buffer3; - buffer2[1] = &buffer4; - buffer3[0] = &buffer1; - buffer4[0] = &buffer3; - - HeapWalker heap_walker(heap_); - - ALLOCATION(heap_walker, buffer1); - ALLOCATION(heap_walker, buffer2); - ALLOCATION(heap_walker, buffer3); - ALLOCATION(heap_walker, buffer4); - - LeakFolding folding(heap_, heap_walker); - - ASSERT_TRUE(folding.FoldLeaks()); - - allocator::vector leaked(heap_); - size_t num_leaks = 0; - size_t leaked_bytes = 0; - ASSERT_EQ(true, folding.Leaked(leaked, &num_leaks, &leaked_bytes)); - - EXPECT_EQ(4U, num_leaks); - EXPECT_EQ(8 * sizeof(uintptr_t), leaked_bytes); - ASSERT_EQ(4U, leaked.size()); - EXPECT_EQ(3U, leaked[0].referenced_count); - EXPECT_EQ(6 * sizeof(uintptr_t), leaked[0].referenced_size); - EXPECT_EQ(3U, leaked[1].referenced_count); - EXPECT_EQ(6 * sizeof(uintptr_t), leaked[1].referenced_size); - EXPECT_EQ(3U, leaked[2].referenced_count); - EXPECT_EQ(6 * sizeof(uintptr_t), leaked[2].referenced_size); - EXPECT_EQ(3U, leaked[3].referenced_count); - EXPECT_EQ(6 * sizeof(uintptr_t), leaked[3].referenced_size); -} - -} // namespace android diff --git a/libmemunreachable/tests/MemUnreachable_test.cpp b/libmemunreachable/tests/MemUnreachable_test.cpp deleted file mode 100644 index 9cb16232f..000000000 --- a/libmemunreachable/tests/MemUnreachable_test.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) 2016 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 - -#include - -#include - -#include "bionic.h" - -namespace android { - -class HiddenPointer { - public: - // Since we're doing such a good job of hiding it, the static analyzer - // thinks that we're leaking this `malloc`. This is probably related to - // https://bugs.llvm.org/show_bug.cgi?id=34198. NOLINTNEXTLINE - explicit HiddenPointer(size_t size = 256) { Set(malloc(size)); } - ~HiddenPointer() { Free(); } - void* Get() { return reinterpret_cast(~ptr_); } - void Free() { - free(Get()); - Set(nullptr); - } - - private: - void Set(void* ptr) { ptr_ = ~reinterpret_cast(ptr); } - volatile uintptr_t ptr_; -}; - -// Trick the compiler into thinking a value on the stack is still referenced. -static void Ref(void** ptr) { - void** volatile storage; - storage = ptr; -} - -class MemunreachableTest : public ::testing::Test { - protected: - virtual void SetUp() { - CleanStack(8192); - CleanTcache(); - } - - virtual void TearDown() { - CleanStack(8192); - CleanTcache(); - } - - // Allocate a buffer on the stack and zero it to make sure there are no - // stray pointers from old test runs. - void __attribute__((noinline)) CleanStack(size_t size) { - void* buf = alloca(size); - memset(buf, 0, size); - Ref(&buf); - } - - // Disable and re-enable malloc to flush the jemalloc tcache to make sure - // there are stray pointers from old test runs there. - void CleanTcache() { - malloc_disable(); - malloc_enable(); - } -}; - -TEST_F(MemunreachableTest, clean) { - UnreachableMemoryInfo info; - - ASSERT_TRUE(LogUnreachableMemory(true, 100)); - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); -} - -TEST_F(MemunreachableTest, stack) { - HiddenPointer hidden_ptr; - - { - void* ptr = hidden_ptr.Get(); - Ref(&ptr); - - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); - - ptr = nullptr; - } - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(1U, info.leaks.size()); - } - - hidden_ptr.Free(); - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); - } -} - -void* g_ptr; - -TEST_F(MemunreachableTest, global) { - HiddenPointer hidden_ptr; - - g_ptr = hidden_ptr.Get(); - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); - } - - g_ptr = nullptr; - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(1U, info.leaks.size()); - } - - hidden_ptr.Free(); - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); - } -} - -TEST_F(MemunreachableTest, tls) { - HiddenPointer hidden_ptr; - pthread_key_t key; - pthread_key_create(&key, nullptr); - - pthread_setspecific(key, hidden_ptr.Get()); - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); - } - - pthread_setspecific(key, nullptr); - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(1U, info.leaks.size()); - } - - hidden_ptr.Free(); - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); - } - - pthread_key_delete(key); -} - -TEST_F(MemunreachableTest, twice) { - HiddenPointer hidden_ptr; - - { - void* ptr = hidden_ptr.Get(); - Ref(&ptr); - - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); - - ptr = nullptr; - } - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(1U, info.leaks.size()); - } - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(1U, info.leaks.size()); - } - - hidden_ptr.Free(); - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); - } -} - -TEST_F(MemunreachableTest, log) { - HiddenPointer hidden_ptr; - - ASSERT_TRUE(LogUnreachableMemory(true, 100)); - - hidden_ptr.Free(); - - { - UnreachableMemoryInfo info; - - ASSERT_TRUE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); - } -} - -TEST_F(MemunreachableTest, notdumpable) { - if (getuid() == 0) { - // TODO(ccross): make this a skipped test when gtest supports them - printf("[ SKIP ] Not testable when running as root\n"); - return; - } - - ASSERT_EQ(0, prctl(PR_SET_DUMPABLE, 0)); - - HiddenPointer hidden_ptr; - - EXPECT_FALSE(LogUnreachableMemory(true, 100)); - - ASSERT_EQ(0, prctl(PR_SET_DUMPABLE, 1)); -} - -TEST_F(MemunreachableTest, leak_lots) { - std::vector hidden_ptrs; - hidden_ptrs.resize(1024); - - ASSERT_TRUE(LogUnreachableMemory(true, 100)); -} - -TEST_F(MemunreachableTest, version) { - UnreachableMemoryInfo info; - info.version = 1; - - ASSERT_FALSE(GetUnreachableMemory(info)); - ASSERT_EQ(0U, info.leaks.size()); -} - -} // namespace android diff --git a/libmemunreachable/tests/ThreadCapture_test.cpp b/libmemunreachable/tests/ThreadCapture_test.cpp deleted file mode 100644 index 933d65ab5..000000000 --- a/libmemunreachable/tests/ThreadCapture_test.cpp +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright (C) 2016 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 "ThreadCapture.h" - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -#include "Allocator.h" -#include "ScopedDisableMalloc.h" -#include "ScopedPipe.h" - -#include - -using namespace std::chrono_literals; - -namespace android { - -class ThreadListTest : public ::testing::TestWithParam { - public: - ThreadListTest() : stop_(false) {} - - ~ThreadListTest() { - // pthread_join may return before the entry in /proc/pid/task/ is gone, - // loop until ListThreads only finds the main thread so the next test - // doesn't fail. - WaitForThreads(); - } - - virtual void TearDown() { ASSERT_TRUE(heap.empty()); } - - protected: - template - void StartThreads(unsigned int threads, Function&& func) { - threads_.reserve(threads); - tids_.reserve(threads); - for (unsigned int i = 0; i < threads; i++) { - threads_.emplace_back([&, threads, this]() { - { - std::lock_guard lk(m_); - tids_.push_back(gettid()); - if (tids_.size() == threads) { - cv_start_.notify_one(); - } - } - - func(); - - { - std::unique_lock lk(m_); - cv_stop_.wait(lk, [&] { return stop_; }); - } - }); - } - - { - std::unique_lock lk(m_); - cv_start_.wait(lk, [&] { return tids_.size() == threads; }); - } - } - - void StopThreads() { - { - std::lock_guard lk(m_); - stop_ = true; - } - cv_stop_.notify_all(); - - for (auto i = threads_.begin(); i != threads_.end(); i++) { - i->join(); - } - threads_.clear(); - tids_.clear(); - } - - std::vector& tids() { return tids_; } - - Heap heap; - - private: - void WaitForThreads() { - auto tids = TidList{heap}; - ThreadCapture thread_capture{getpid(), heap}; - - for (unsigned int i = 0; i < 100; i++) { - EXPECT_TRUE(thread_capture.ListThreads(tids)); - if (tids.size() == 1) { - break; - } - std::this_thread::sleep_for(10ms); - } - EXPECT_EQ(1U, tids.size()); - } - - std::mutex m_; - std::condition_variable cv_start_; - std::condition_variable cv_stop_; - bool stop_; - std::vector tids_; - - std::vector threads_; -}; - -TEST_F(ThreadListTest, list_one) { - ScopedDisableMallocTimeout disable_malloc; - - ThreadCapture thread_capture(getpid(), heap); - - auto expected_tids = allocator::vector(1, getpid(), heap); - auto list_tids = allocator::vector(heap); - - ASSERT_TRUE(thread_capture.ListThreads(list_tids)); - - ASSERT_EQ(expected_tids, list_tids); - - if (!HasFailure()) { - ASSERT_FALSE(disable_malloc.timed_out()); - } -} - -TEST_P(ThreadListTest, list_some) { - const unsigned int threads = GetParam() - 1; - - StartThreads(threads, []() {}); - std::vector expected_tids = tids(); - expected_tids.push_back(getpid()); - - auto list_tids = allocator::vector(heap); - - { - ScopedDisableMallocTimeout disable_malloc; - - ThreadCapture thread_capture(getpid(), heap); - - ASSERT_TRUE(thread_capture.ListThreads(list_tids)); - - if (!HasFailure()) { - ASSERT_FALSE(disable_malloc.timed_out()); - } - } - - StopThreads(); - - std::sort(list_tids.begin(), list_tids.end()); - std::sort(expected_tids.begin(), expected_tids.end()); - - ASSERT_EQ(expected_tids.size(), list_tids.size()); - EXPECT_TRUE(std::equal(expected_tids.begin(), expected_tids.end(), list_tids.begin())); -} - -INSTANTIATE_TEST_CASE_P(ThreadListTest, ThreadListTest, ::testing::Values(1, 2, 10, 1024)); - -class ThreadCaptureTest : public ThreadListTest { - public: - ThreadCaptureTest() {} - ~ThreadCaptureTest() {} - void Fork(std::function&& child_init, std::function&& child_cleanup, - std::function&& parent) { - ScopedPipe start_pipe; - ScopedPipe stop_pipe; - - int pid = fork(); - - if (pid == 0) { - // child - child_init(); - EXPECT_EQ(1, TEMP_FAILURE_RETRY(write(start_pipe.Sender(), "+", 1))) << strerror(errno); - char buf; - EXPECT_EQ(1, TEMP_FAILURE_RETRY(read(stop_pipe.Receiver(), &buf, 1))) << strerror(errno); - child_cleanup(); - _exit(0); - } else { - // parent - ASSERT_GT(pid, 0); - char buf; - ASSERT_EQ(1, TEMP_FAILURE_RETRY(read(start_pipe.Receiver(), &buf, 1))) << strerror(errno); - - parent(pid); - - ASSERT_EQ(1, TEMP_FAILURE_RETRY(write(stop_pipe.Sender(), "+", 1))) << strerror(errno); - siginfo_t info{}; - ASSERT_EQ(0, TEMP_FAILURE_RETRY(waitid(P_PID, pid, &info, WEXITED))) << strerror(errno); - } - } -}; - -TEST_P(ThreadCaptureTest, capture_some) { - const unsigned int threads = GetParam(); - - Fork( - [&]() { - // child init - StartThreads(threads - 1, []() {}); - }, - [&]() { - // child cleanup - StopThreads(); - }, - [&](pid_t child) { - // parent - ASSERT_GT(child, 0); - - { - ScopedDisableMallocTimeout disable_malloc; - - ThreadCapture thread_capture(child, heap); - auto list_tids = allocator::vector(heap); - - ASSERT_TRUE(thread_capture.ListThreads(list_tids)); - ASSERT_EQ(threads, list_tids.size()); - - ASSERT_TRUE(thread_capture.CaptureThreads()); - - auto thread_info = allocator::vector(heap); - ASSERT_TRUE(thread_capture.CapturedThreadInfo(thread_info)); - ASSERT_EQ(threads, thread_info.size()); - ASSERT_TRUE(thread_capture.ReleaseThreads()); - - if (!HasFailure()) { - ASSERT_FALSE(disable_malloc.timed_out()); - } - } - }); -} - -INSTANTIATE_TEST_CASE_P(ThreadCaptureTest, ThreadCaptureTest, ::testing::Values(1, 2, 10, 1024)); - -TEST_F(ThreadCaptureTest, capture_kill) { - int ret = fork(); - - if (ret == 0) { - // child - sleep(10); - } else { - // parent - ASSERT_GT(ret, 0); - - { - ScopedDisableMallocTimeout disable_malloc; - - ThreadCapture thread_capture(ret, heap); - thread_capture.InjectTestFunc([&](pid_t tid) { - tgkill(ret, tid, SIGKILL); - usleep(10000); - }); - auto list_tids = allocator::vector(heap); - - ASSERT_TRUE(thread_capture.ListThreads(list_tids)); - ASSERT_EQ(1U, list_tids.size()); - - ASSERT_FALSE(thread_capture.CaptureThreads()); - - if (!HasFailure()) { - ASSERT_FALSE(disable_malloc.timed_out()); - } - } - } -} - -TEST_F(ThreadCaptureTest, capture_signal) { - const int sig = SIGUSR1; - - ScopedPipe pipe; - - // For signal handler - static ScopedPipe* g_pipe; - - Fork( - [&]() { - // child init - pipe.CloseReceiver(); - - g_pipe = &pipe; - - struct sigaction act {}; - act.sa_handler = [](int) { - char buf = '+'; - write(g_pipe->Sender(), &buf, 1); - g_pipe->CloseSender(); - }; - sigaction(sig, &act, NULL); - sigset_t set; - sigemptyset(&set); - sigaddset(&set, sig); - pthread_sigmask(SIG_UNBLOCK, &set, NULL); - }, - [&]() { - // child cleanup - g_pipe = nullptr; - pipe.Close(); - }, - [&](pid_t child) { - // parent - ASSERT_GT(child, 0); - pipe.CloseSender(); - - { - ScopedDisableMallocTimeout disable_malloc; - - ThreadCapture thread_capture(child, heap); - thread_capture.InjectTestFunc([&](pid_t tid) { - tgkill(child, tid, sig); - usleep(10000); - }); - auto list_tids = allocator::vector(heap); - - ASSERT_TRUE(thread_capture.ListThreads(list_tids)); - ASSERT_EQ(1U, list_tids.size()); - - ASSERT_TRUE(thread_capture.CaptureThreads()); - - auto thread_info = allocator::vector(heap); - ASSERT_TRUE(thread_capture.CapturedThreadInfo(thread_info)); - ASSERT_EQ(1U, thread_info.size()); - ASSERT_TRUE(thread_capture.ReleaseThreads()); - - usleep(100000); - char buf; - ASSERT_EQ(1, TEMP_FAILURE_RETRY(read(pipe.Receiver(), &buf, 1))); - ASSERT_EQ(buf, '+'); - - if (!HasFailure()) { - ASSERT_FALSE(disable_malloc.timed_out()); - } - } - }); -} - -} // namespace android diff --git a/lmkd/Android.bp b/lmkd/Android.bp deleted file mode 100644 index deebb8e65..000000000 --- a/lmkd/Android.bp +++ /dev/null @@ -1,61 +0,0 @@ -cc_defaults { - name: "stats_defaults", - - product_variables: { - use_lmkd_stats_log: { - cflags: [ - "-DLMKD_LOG_STATS" - ], - }, - }, -} - -cc_binary { - name: "lmkd", - - srcs: ["lmkd.c"], - shared_libs: [ - "libcutils", - "liblog", - "libprocessgroup", - "libpsi", - ], - static_libs: [ - "libstatslogc", - "libstatssocket", - ], - local_include_dirs: ["include"], - cflags: ["-Werror", "-DLMKD_TRACE_KILLS"], - init_rc: ["lmkd.rc"], - defaults: ["stats_defaults"], - logtags: ["event.logtags"], -} - -cc_library_static { - name: "libstatslogc", - srcs: ["statslog.c"], - cflags: [ - "-Wall", - "-Werror", - ], - defaults: ["stats_defaults"], - shared_libs: [ - "liblog", - ], - static_libs: ["libstatssocket",], -} - -cc_library_static { - name: "liblmkd_utils", - srcs: ["liblmkd_utils.c"], - recovery_available: true, - shared_libs: [ - "libcutils", - ], - export_include_dirs: ["include"], - cppflags: [ - "-g", - "-Wall", - "-Werror", - ] -} diff --git a/lmkd/OWNERS b/lmkd/OWNERS deleted file mode 100644 index b15bb4870..000000000 --- a/lmkd/OWNERS +++ /dev/null @@ -1 +0,0 @@ -surenb@google.com diff --git a/lmkd/README.md b/lmkd/README.md deleted file mode 100644 index 8a7369273..000000000 --- a/lmkd/README.md +++ /dev/null @@ -1,90 +0,0 @@ -Android Low Memory Killer Daemon -================================ - - -Introduction ------------- - -Android Low Memory Killer Daemon (lmkd) is a process monitoring memory -state of a running Android system and reacting to high memory pressure -by killing the least essential process(es) to keep system performing -at acceptable levels. - - -Background ----------- - -Historically on Android systems memory monitoring and killing of -non-essential processes was handled by a kernel lowmemorykiller driver. -Since Linux Kernel 4.12 the lowmemorykiller driver has been removed and -instead userspace lmkd daemon performs these tasks. - - -Android Properties ------------------- - -lmkd can be configured on a particular system using the following Android -properties: - - ro.config.low_ram: choose between low-memory vs high-performance - device. Default = false. - - ro.lmk.use_minfree_levels: use free memory and file cache thresholds for - making decisions when to kill. This mode works - the same way kernel lowmemorykiller driver used - to work. Default = false - - ro.lmk.low: min oom_adj score for processes eligible to be - killed at low vmpressure level. Default = 1001 - (disabled) - - ro.lmk.medium: min oom_adj score for processes eligible to be - killed at medium vmpressure level. Default = 800 - (non-essential processes) - - ro.lmk.critical: min oom_adj score for processes eligible to be - killed at critical vmpressure level. Default = 0 - (all processes) - - ro.lmk.critical_upgrade: enables upgrade to critical level. Default = false - - ro.lmk.upgrade_pressure: max mem_pressure at which level will be upgraded - because system is swapping too much. Default = 100 - (disabled) - - ro.lmk.downgrade_pressure: min mem_pressure at which vmpressure event will - be ignored because enough free memory is still - available. Default = 100 (disabled) - - ro.lmk.kill_heaviest_task: kill heaviest eligible task (best decision) vs. - any eligible task (fast decision). Default = false - - ro.lmk.kill_timeout_ms: duration in ms after a kill when no additional - kill will be done. Default = 0 (disabled) - - ro.lmk.debug: enable lmkd debug logs, Default = false - - ro.lmk.swap_free_low_percentage: level of free swap as a percentage of the - total swap space used as a threshold to consider - the system as swap space starved. Default for - low-RAM devices = 10, for high-end devices = 20 - - ro.lmk.thrashing_limit: number of workingset refaults as a percentage of - the file-backed pagecache size used as a threshold - to consider system thrashing its pagecache. - Default for low-RAM devices = 30, for high-end - devices = 100 - - ro.lmk.thrashing_limit_decay: thrashing threshold decay expressed as a - percentage of the original threshold used to lower - the threshold when system does not recover even - after a kill. Default for low-RAM devices = 50, - for high-end devices = 10 - - ro.lmk.psi_partial_stall_ms: partial PSI stall threshold in milliseconds for - triggering low memory notification. Default for - low-RAM devices = 200, for high-end devices = 70 - - ro.lmk.psi_complete_stall_ms: complete PSI stall threshold in milliseconds for - triggering critical memory notification. Default = - 700 diff --git a/lmkd/event.logtags b/lmkd/event.logtags deleted file mode 100644 index 452f4119c..000000000 --- a/lmkd/event.logtags +++ /dev/null @@ -1,38 +0,0 @@ -# The entries in this file map a sparse set of log tag numbers to tag names. -# This is installed on the device, in /system/etc, and parsed by logcat. -# -# Tag numbers are decimal integers, from 0 to 2^31. (Let's leave the -# negative values alone for now.) -# -# Tag names are one or more ASCII letters and numbers or underscores, i.e. -# "[A-Z][a-z][0-9]_". Do not include spaces or punctuation (the former -# impacts log readability, the latter makes regex searches more annoying). -# -# Tag numbers and names are separated by whitespace. Blank lines and lines -# starting with '#' are ignored. -# -# Optionally, after the tag names can be put a description for the value(s) -# of the tag. Description are in the format -# (|data type[|data unit]) -# Multiple values are separated by commas. -# -# The data type is a number from the following values: -# 1: int32_t -# 2: int64_t -# 3: string -# 4: list -# -# The data unit is a number taken from the following list: -# 1: Number of objects -# 2: Number of bytes -# 3: Number of milliseconds -# 4: Number of allocations -# 5: Id -# 6: Percent -# s: Number of seconds (monotonic time) -# Default value for data of type int/long is 2 (bytes). -# -# TODO: generate ".java" and ".h" files with integer constants from this file. - -# for killinfo logs -10195355 killinfo (Pid|1|5),(Uid|1|5),(OomAdj|1),(MinOomAdj|1),(TaskSize|1),(enum kill_reasons|1|5),(MemFree|1),(Cached|1),(SwapCached|1),(Buffers|1),(Shmem|1),(Unevictable|1),(SwapTotal|1),(SwapFree|1),(ActiveAnon|1),(InactiveAnon|1),(ActiveFile|1),(InactiveFile|1),(SReclaimable|1),(SUnreclaim|1),(KernelStack|1),(PageTables|1),(IonHeap|1),(IonHeapPool|1),(CmaFree|1) diff --git a/lmkd/include/liblmkd_utils.h b/lmkd/include/liblmkd_utils.h deleted file mode 100644 index 92e4d412d..000000000 --- a/lmkd/include/liblmkd_utils.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2018 Google, Inc - * - * 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 _LIBLMKD_UTILS_H_ -#define _LIBLMKD_UTILS_H_ - -#include -#include - -#include - -__BEGIN_DECLS - -/* - * Connects to lmkd process and returns socket handle. - * On success returns socket handle. - * On error, -1 is returned, and errno is set appropriately. - */ -int lmkd_connect(); - -/* - * Registers a process with lmkd and sets its oomadj score. - * On success returns 0. - * On error, -1 is returned. - * In the case of error errno is set appropriately. - */ -int lmkd_register_proc(int sock, struct lmk_procprio *params); - -/* - * Unregisters a process previously registered with lmkd. - * On success returns 0. - * On error, -1 is returned. - * In the case of error errno is set appropriately. - */ -int lmkd_unregister_proc(int sock, struct lmk_procremove *params); - -/* - * Creates memcg directory for given process. - * On success returns 0. - * -1 is returned if path creation failed. - * -2 is returned if tasks file open operation failed. - * -3 is returned if tasks file write operation failed. - * In the case of error errno is set appropriately. - */ -int create_memcg(uid_t uid, pid_t pid); - -__END_DECLS - -#endif /* _LIBLMKD_UTILS_H_ */ diff --git a/lmkd/include/lmkd.h b/lmkd/include/lmkd.h deleted file mode 100644 index bd9b80e3e..000000000 --- a/lmkd/include/lmkd.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2018 Google, Inc - * - * 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 _LMKD_H_ -#define _LMKD_H_ - -#include -#include -#include - -__BEGIN_DECLS - -/* - * Supported LMKD commands - */ -enum lmk_cmd { - LMK_TARGET = 0, /* Associate minfree with oom_adj_score */ - LMK_PROCPRIO, /* Register a process and set its oom_adj_score */ - LMK_PROCREMOVE, /* Unregister a process */ - LMK_PROCPURGE, /* Purge all registered processes */ - LMK_GETKILLCNT, /* Get number of kills */ -}; - -/* - * Max number of targets in LMK_TARGET command. - */ -#define MAX_TARGETS 6 - -/* - * Max packet length in bytes. - * Longest packet is LMK_TARGET followed by MAX_TARGETS - * of minfree and oom_adj_score values - */ -#define CTRL_PACKET_MAX_SIZE (sizeof(int) * (MAX_TARGETS * 2 + 1)) - -/* LMKD packet - first int is lmk_cmd followed by payload */ -typedef int LMKD_CTRL_PACKET[CTRL_PACKET_MAX_SIZE / sizeof(int)]; - -/* Get LMKD packet command */ -static inline enum lmk_cmd lmkd_pack_get_cmd(LMKD_CTRL_PACKET pack) { - return (enum lmk_cmd)ntohl(pack[0]); -} - -/* LMK_TARGET packet payload */ -struct lmk_target { - int minfree; - int oom_adj_score; -}; - -/* - * For LMK_TARGET packet get target_idx-th payload. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline void lmkd_pack_get_target(LMKD_CTRL_PACKET packet, int target_idx, - struct lmk_target* target) { - target->minfree = ntohl(packet[target_idx * 2 + 1]); - target->oom_adj_score = ntohl(packet[target_idx * 2 + 2]); -} - -/* - * Prepare LMK_TARGET packet and return packet size in bytes. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline size_t lmkd_pack_set_target(LMKD_CTRL_PACKET packet, struct lmk_target* targets, - size_t target_cnt) { - int idx = 0; - packet[idx++] = htonl(LMK_TARGET); - while (target_cnt) { - packet[idx++] = htonl(targets->minfree); - packet[idx++] = htonl(targets->oom_adj_score); - targets++; - target_cnt--; - } - return idx * sizeof(int); -} - -/* Process types for lmk_procprio.ptype */ -enum proc_type { - PROC_TYPE_FIRST, - PROC_TYPE_APP = PROC_TYPE_FIRST, - PROC_TYPE_SERVICE, - PROC_TYPE_COUNT, -}; - -/* LMK_PROCPRIO packet payload */ -struct lmk_procprio { - pid_t pid; - uid_t uid; - int oomadj; - enum proc_type ptype; -}; - -/* - * For LMK_PROCPRIO packet get its payload. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline void lmkd_pack_get_procprio(LMKD_CTRL_PACKET packet, int field_count, - struct lmk_procprio* params) { - params->pid = (pid_t)ntohl(packet[1]); - params->uid = (uid_t)ntohl(packet[2]); - params->oomadj = ntohl(packet[3]); - /* if field is missing assume PROC_TYPE_APP for backward compatibility */ - params->ptype = field_count > 3 ? (enum proc_type)ntohl(packet[4]) : PROC_TYPE_APP; -} - -/* - * Prepare LMK_PROCPRIO packet and return packet size in bytes. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline size_t lmkd_pack_set_procprio(LMKD_CTRL_PACKET packet, struct lmk_procprio* params) { - packet[0] = htonl(LMK_PROCPRIO); - packet[1] = htonl(params->pid); - packet[2] = htonl(params->uid); - packet[3] = htonl(params->oomadj); - packet[4] = htonl((int)params->ptype); - return 5 * sizeof(int); -} - -/* LMK_PROCREMOVE packet payload */ -struct lmk_procremove { - pid_t pid; -}; - -/* - * For LMK_PROCREMOVE packet get its payload. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline void lmkd_pack_get_procremove(LMKD_CTRL_PACKET packet, - struct lmk_procremove* params) { - params->pid = (pid_t)ntohl(packet[1]); -} - -/* - * Prepare LMK_PROCREMOVE packet and return packet size in bytes. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline size_t lmkd_pack_set_procremove(LMKD_CTRL_PACKET packet, - struct lmk_procremove* params) { - packet[0] = htonl(LMK_PROCREMOVE); - packet[1] = htonl(params->pid); - return 2 * sizeof(int); -} - -/* - * Prepare LMK_PROCPURGE packet and return packet size in bytes. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline size_t lmkd_pack_set_procpurge(LMKD_CTRL_PACKET packet) { - packet[0] = htonl(LMK_PROCPURGE); - return sizeof(int); -} - -/* LMK_GETKILLCNT packet payload */ -struct lmk_getkillcnt { - int min_oomadj; - int max_oomadj; -}; - -/* - * For LMK_GETKILLCNT packet get its payload. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline void lmkd_pack_get_getkillcnt(LMKD_CTRL_PACKET packet, - struct lmk_getkillcnt* params) { - params->min_oomadj = ntohl(packet[1]); - params->max_oomadj = ntohl(packet[2]); -} - -/* - * Prepare LMK_GETKILLCNT packet and return packet size in bytes. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline size_t lmkd_pack_set_getkillcnt(LMKD_CTRL_PACKET packet, - struct lmk_getkillcnt* params) { - packet[0] = htonl(LMK_GETKILLCNT); - packet[1] = htonl(params->min_oomadj); - packet[2] = htonl(params->max_oomadj); - return 3 * sizeof(int); -} - -/* - * Prepare LMK_GETKILLCNT reply packet and return packet size in bytes. - * Warning: no checks performed, caller should ensure valid parameters. - */ -static inline size_t lmkd_pack_set_getkillcnt_repl(LMKD_CTRL_PACKET packet, int kill_cnt) { - packet[0] = htonl(LMK_GETKILLCNT); - packet[1] = htonl(kill_cnt); - return 2 * sizeof(int); -} - -__END_DECLS - -#endif /* _LMKD_H_ */ diff --git a/lmkd/liblmkd_utils.c b/lmkd/liblmkd_utils.c deleted file mode 100644 index 280c14962..000000000 --- a/lmkd/liblmkd_utils.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2018 Google, Inc - * - * 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 -#include -#include -#include - -#include -#include - -int lmkd_connect() { - return socket_local_client("lmkd", - ANDROID_SOCKET_NAMESPACE_RESERVED, - SOCK_SEQPACKET | SOCK_CLOEXEC); -} - -int lmkd_register_proc(int sock, struct lmk_procprio *params) { - LMKD_CTRL_PACKET packet; - size_t size; - int ret; - - size = lmkd_pack_set_procprio(packet, params); - ret = TEMP_FAILURE_RETRY(write(sock, packet, size)); - - return (ret < 0) ? -1 : 0; -} - -int lmkd_unregister_proc(int sock, struct lmk_procremove *params) { - LMKD_CTRL_PACKET packet; - size_t size; - int ret; - - size = lmkd_pack_set_procremove(packet, params); - ret = TEMP_FAILURE_RETRY(write(sock, packet, size)); - - return (ret < 0) ? -1 : 0; -} - -int create_memcg(uid_t uid, pid_t pid) { - char buf[256]; - int tasks_file; - int written; - - snprintf(buf, sizeof(buf), "/dev/memcg/apps/uid_%u", uid); - if (mkdir(buf, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0 && - errno != EEXIST) { - return -1; - } - - snprintf(buf, sizeof(buf), "/dev/memcg/apps/uid_%u/pid_%u", uid, pid); - if (mkdir(buf, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0 && - errno != EEXIST) { - return -1; - } - - snprintf(buf, sizeof(buf), "/dev/memcg/apps/uid_%u/pid_%u/tasks", uid, pid); - tasks_file = open(buf, O_WRONLY); - if (tasks_file < 0) { - return -2; - } - written = snprintf(buf, sizeof(buf), "%u", pid); - if (__predict_false(written >= (int)sizeof(buf))) { - written = sizeof(buf) - 1; - } - written = TEMP_FAILURE_RETRY(write(tasks_file, buf, written)); - close(tasks_file); - - return (written < 0) ? -3 : 0; -} - diff --git a/lmkd/libpsi/Android.bp b/lmkd/libpsi/Android.bp deleted file mode 100644 index 8a970942e..000000000 --- a/lmkd/libpsi/Android.bp +++ /dev/null @@ -1,22 +0,0 @@ -cc_library_headers { - name: "libpsi_headers", - export_include_dirs: ["include"], -} - -cc_library { - name: "libpsi", - srcs: ["psi.c"], - shared_libs: [ - "liblog" - ], - header_libs: [ - "libpsi_headers", - ], - export_header_lib_headers: [ - "libpsi_headers", - ], - cflags: [ - "-Wall", - "-Werror", - ], -} diff --git a/lmkd/libpsi/OWNERS b/lmkd/libpsi/OWNERS deleted file mode 100644 index b15bb4870..000000000 --- a/lmkd/libpsi/OWNERS +++ /dev/null @@ -1 +0,0 @@ -surenb@google.com diff --git a/lmkd/libpsi/include/psi/psi.h b/lmkd/libpsi/include/psi/psi.h deleted file mode 100644 index cd49e8b60..000000000 --- a/lmkd/libpsi/include/psi/psi.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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_PSI_H__ -#define __ANDROID_PSI_H__ - -#include -#include - -__BEGIN_DECLS - -enum psi_stall_type { - PSI_SOME, - PSI_FULL, - PSI_TYPE_COUNT -}; - -/* - * Initializes psi monitor. - * stall_type, threshold_us and window_us are monitor parameters - * When successful, the function returns file descriptor that can - * be used with poll/epoll syscalls to wait for EPOLLPRI events. - * When unsuccessful, the function returns -1 and errno is set - * appropriately. - */ -int init_psi_monitor(enum psi_stall_type stall_type, - int threshold_us, int window_us); - -/* - * Registers psi monitor file descriptor fd on the epoll instance - * referred to by the file descriptor epollfd. - * data parameter will be associated with event's epoll_data.ptr - * member. - */ -int register_psi_monitor(int epollfd, int fd, void* data); - -/* - * Unregisters psi monitor file descriptor fd from the epoll instance - * referred to by the file descriptor epollfd. - */ -int unregister_psi_monitor(int epollfd, int fd); - -/* - * Destroys psi monitor. - * fd is the file descriptor returned by psi monitor initialization - * routine. - * Note that if user process exits without calling this routine - * kernel will destroy the monitor as its lifetime is linked to - * the file descriptor. - */ -void destroy_psi_monitor(int fd); - -__END_DECLS - -#endif // __ANDROID_PSI_H__ diff --git a/lmkd/libpsi/psi.c b/lmkd/libpsi/psi.c deleted file mode 100644 index f4d5d1878..000000000 --- a/lmkd/libpsi/psi.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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 "libpsi" - -#include -#include -#include - -#include -#include "psi/psi.h" - -#define PSI_MON_FILE_MEMORY "/proc/pressure/memory" - -static const char* stall_type_name[] = { - "some", - "full", -}; - -int init_psi_monitor(enum psi_stall_type stall_type, - int threshold_us, int window_us) { - int fd; - int res; - char buf[256]; - - fd = TEMP_FAILURE_RETRY(open(PSI_MON_FILE_MEMORY, O_WRONLY | O_CLOEXEC)); - if (fd < 0) { - ALOGE("No kernel psi monitor support (errno=%d)", errno); - return -1; - } - - switch (stall_type) { - case (PSI_SOME): - case (PSI_FULL): - res = snprintf(buf, sizeof(buf), "%s %d %d", - stall_type_name[stall_type], threshold_us, window_us); - break; - default: - ALOGE("Invalid psi stall type: %d", stall_type); - errno = EINVAL; - goto err; - } - - if (res >= (ssize_t)sizeof(buf)) { - ALOGE("%s line overflow for psi stall type '%s'", - PSI_MON_FILE_MEMORY, stall_type_name[stall_type]); - errno = EINVAL; - goto err; - } - - res = TEMP_FAILURE_RETRY(write(fd, buf, strlen(buf) + 1)); - if (res < 0) { - ALOGE("%s write failed for psi stall type '%s'; errno=%d", - PSI_MON_FILE_MEMORY, stall_type_name[stall_type], errno); - goto err; - } - - return fd; - -err: - close(fd); - return -1; -} - -int register_psi_monitor(int epollfd, int fd, void* data) { - int res; - struct epoll_event epev; - - epev.events = EPOLLPRI; - epev.data.ptr = data; - res = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &epev); - if (res < 0) { - ALOGE("epoll_ctl for psi monitor failed; errno=%d", errno); - } - return res; -} - -int unregister_psi_monitor(int epollfd, int fd) { - return epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL); -} - -void destroy_psi_monitor(int fd) { - if (fd >= 0) { - close(fd); - } -} diff --git a/lmkd/lmkd.c b/lmkd/lmkd.c deleted file mode 100644 index 435249806..000000000 --- a/lmkd/lmkd.c +++ /dev/null @@ -1,3026 +0,0 @@ -/* - * Copyright (C) 2013 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 "lowmemorykiller" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "statslog.h" - -/* - * Define LMKD_TRACE_KILLS to record lmkd kills in kernel traces - * to profile and correlate with OOM kills - */ -#ifdef LMKD_TRACE_KILLS - -#define ATRACE_TAG ATRACE_TAG_ALWAYS -#include - -#define TRACE_KILL_START(pid) ATRACE_INT(__FUNCTION__, pid); -#define TRACE_KILL_END() ATRACE_INT(__FUNCTION__, 0); - -#else /* LMKD_TRACE_KILLS */ - -#define TRACE_KILL_START(pid) ((void)(pid)) -#define TRACE_KILL_END() ((void)0) - -#endif /* LMKD_TRACE_KILLS */ - -#ifndef __unused -#define __unused __attribute__((__unused__)) -#endif - -#define MEMCG_SYSFS_PATH "/dev/memcg/" -#define MEMCG_MEMORY_USAGE "/dev/memcg/memory.usage_in_bytes" -#define MEMCG_MEMORYSW_USAGE "/dev/memcg/memory.memsw.usage_in_bytes" -#define ZONEINFO_PATH "/proc/zoneinfo" -#define MEMINFO_PATH "/proc/meminfo" -#define VMSTAT_PATH "/proc/vmstat" -#define PROC_STATUS_TGID_FIELD "Tgid:" -#define LINE_MAX 128 - -#define PERCEPTIBLE_APP_ADJ 200 - -/* Android Logger event logtags (see event.logtags) */ -#define KILLINFO_LOG_TAG 10195355 - -/* gid containing AID_SYSTEM required */ -#define INKERNEL_MINFREE_PATH "/sys/module/lowmemorykiller/parameters/minfree" -#define INKERNEL_ADJ_PATH "/sys/module/lowmemorykiller/parameters/adj" - -#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) -#define EIGHT_MEGA (1 << 23) - -#define TARGET_UPDATE_MIN_INTERVAL_MS 1000 - -#define NS_PER_MS (NS_PER_SEC / MS_PER_SEC) -#define US_PER_MS (US_PER_SEC / MS_PER_SEC) - -/* Defined as ProcessList.SYSTEM_ADJ in ProcessList.java */ -#define SYSTEM_ADJ (-900) - -#define STRINGIFY(x) STRINGIFY_INTERNAL(x) -#define STRINGIFY_INTERNAL(x) #x - -/* - * PSI monitor tracking window size. - * PSI monitor generates events at most once per window, - * therefore we poll memory state for the duration of - * PSI_WINDOW_SIZE_MS after the event happens. - */ -#define PSI_WINDOW_SIZE_MS 1000 -/* Polling period after PSI signal when pressure is high */ -#define PSI_POLL_PERIOD_SHORT_MS 10 -/* Polling period after PSI signal when pressure is low */ -#define PSI_POLL_PERIOD_LONG_MS 100 - -#define min(a, b) (((a) < (b)) ? (a) : (b)) -#define max(a, b) (((a) > (b)) ? (a) : (b)) - -#define FAIL_REPORT_RLIMIT_MS 1000 - -/* - * System property defaults - */ -/* ro.lmk.swap_free_low_percentage property defaults */ -#define DEF_LOW_SWAP_LOWRAM 10 -#define DEF_LOW_SWAP 20 -/* ro.lmk.thrashing_limit property defaults */ -#define DEF_THRASHING_LOWRAM 30 -#define DEF_THRASHING 100 -/* ro.lmk.thrashing_limit_decay property defaults */ -#define DEF_THRASHING_DECAY_LOWRAM 50 -#define DEF_THRASHING_DECAY 10 -/* ro.lmk.psi_partial_stall_ms property defaults */ -#define DEF_PARTIAL_STALL_LOWRAM 200 -#define DEF_PARTIAL_STALL 70 -/* ro.lmk.psi_complete_stall_ms property defaults */ -#define DEF_COMPLETE_STALL 700 - -static inline int sys_pidfd_open(pid_t pid, unsigned int flags) { - return syscall(__NR_pidfd_open, pid, flags); -} - -static inline int sys_pidfd_send_signal(int pidfd, int sig, siginfo_t *info, - unsigned int flags) { - return syscall(__NR_pidfd_send_signal, pidfd, sig, info, flags); -} - -/* default to old in-kernel interface if no memory pressure events */ -static bool use_inkernel_interface = true; -static bool has_inkernel_module; - -/* memory pressure levels */ -enum vmpressure_level { - VMPRESS_LEVEL_LOW = 0, - VMPRESS_LEVEL_MEDIUM, - VMPRESS_LEVEL_CRITICAL, - VMPRESS_LEVEL_COUNT -}; - -static const char *level_name[] = { - "low", - "medium", - "critical" -}; - -struct { - int64_t min_nr_free_pages; /* recorded but not used yet */ - int64_t max_nr_free_pages; -} low_pressure_mem = { -1, -1 }; - -struct psi_threshold { - enum psi_stall_type stall_type; - int threshold_ms; -}; - -static int level_oomadj[VMPRESS_LEVEL_COUNT]; -static int mpevfd[VMPRESS_LEVEL_COUNT] = { -1, -1, -1 }; -static bool pidfd_supported; -static int last_kill_pid_or_fd = -1; -static struct timespec last_kill_tm; - -/* lmkd configurable parameters */ -static bool debug_process_killing; -static bool enable_pressure_upgrade; -static int64_t upgrade_pressure; -static int64_t downgrade_pressure; -static bool low_ram_device; -static bool kill_heaviest_task; -static unsigned long kill_timeout_ms; -static bool use_minfree_levels; -static bool per_app_memcg; -static int swap_free_low_percentage; -static int psi_partial_stall_ms; -static int psi_complete_stall_ms; -static int thrashing_limit_pct; -static int thrashing_limit_decay_pct; -static bool use_psi_monitors = false; -static struct kernel_poll_info kpoll_info; -static struct psi_threshold psi_thresholds[VMPRESS_LEVEL_COUNT] = { - { PSI_SOME, 70 }, /* 70ms out of 1sec for partial stall */ - { PSI_SOME, 100 }, /* 100ms out of 1sec for partial stall */ - { PSI_FULL, 70 }, /* 70ms out of 1sec for complete stall */ -}; - -static android_log_context ctx; - -enum polling_update { - POLLING_DO_NOT_CHANGE, - POLLING_START, - POLLING_STOP, - POLLING_PAUSE, - POLLING_RESUME, -}; - -/* - * Data used for periodic polling for the memory state of the device. - * Note that when system is not polling poll_handler is set to NULL, - * when polling starts poll_handler gets set and is reset back to - * NULL when polling stops. - */ -struct polling_params { - struct event_handler_info* poll_handler; - struct event_handler_info* paused_handler; - struct timespec poll_start_tm; - struct timespec last_poll_tm; - int polling_interval_ms; - enum polling_update update; -}; - -/* data required to handle events */ -struct event_handler_info { - int data; - void (*handler)(int data, uint32_t events, struct polling_params *poll_params); -}; - -/* data required to handle socket events */ -struct sock_event_handler_info { - int sock; - pid_t pid; - struct event_handler_info handler_info; -}; - -/* max supported number of data connections (AMS, init, tests) */ -#define MAX_DATA_CONN 3 - -/* socket event handler data */ -static struct sock_event_handler_info ctrl_sock; -static struct sock_event_handler_info data_sock[MAX_DATA_CONN]; - -/* vmpressure event handler data */ -static struct event_handler_info vmpressure_hinfo[VMPRESS_LEVEL_COUNT]; - -/* - * 1 ctrl listen socket, 3 ctrl data socket, 3 memory pressure levels, - * 1 lmk events + 1 fd to wait for process death - */ -#define MAX_EPOLL_EVENTS (1 + MAX_DATA_CONN + VMPRESS_LEVEL_COUNT + 1 + 1) -static int epollfd; -static int maxevents; - -/* OOM score values used by both kernel and framework */ -#define OOM_SCORE_ADJ_MIN (-1000) -#define OOM_SCORE_ADJ_MAX 1000 - -static int lowmem_adj[MAX_TARGETS]; -static int lowmem_minfree[MAX_TARGETS]; -static int lowmem_targets_size; - -/* Fields to parse in /proc/zoneinfo */ -/* zoneinfo per-zone fields */ -enum zoneinfo_zone_field { - ZI_ZONE_NR_FREE_PAGES = 0, - ZI_ZONE_MIN, - ZI_ZONE_LOW, - ZI_ZONE_HIGH, - ZI_ZONE_PRESENT, - ZI_ZONE_NR_FREE_CMA, - ZI_ZONE_FIELD_COUNT -}; - -static const char* const zoneinfo_zone_field_names[ZI_ZONE_FIELD_COUNT] = { - "nr_free_pages", - "min", - "low", - "high", - "present", - "nr_free_cma", -}; - -/* zoneinfo per-zone special fields */ -enum zoneinfo_zone_spec_field { - ZI_ZONE_SPEC_PROTECTION = 0, - ZI_ZONE_SPEC_PAGESETS, - ZI_ZONE_SPEC_FIELD_COUNT, -}; - -static const char* const zoneinfo_zone_spec_field_names[ZI_ZONE_SPEC_FIELD_COUNT] = { - "protection:", - "pagesets", -}; - -/* see __MAX_NR_ZONES definition in kernel mmzone.h */ -#define MAX_NR_ZONES 6 - -union zoneinfo_zone_fields { - struct { - int64_t nr_free_pages; - int64_t min; - int64_t low; - int64_t high; - int64_t present; - int64_t nr_free_cma; - } field; - int64_t arr[ZI_ZONE_FIELD_COUNT]; -}; - -struct zoneinfo_zone { - union zoneinfo_zone_fields fields; - int64_t protection[MAX_NR_ZONES]; - int64_t max_protection; -}; - -/* zoneinfo per-node fields */ -enum zoneinfo_node_field { - ZI_NODE_NR_INACTIVE_FILE = 0, - ZI_NODE_NR_ACTIVE_FILE, - ZI_NODE_WORKINGSET_REFAULT, - ZI_NODE_FIELD_COUNT -}; - -static const char* const zoneinfo_node_field_names[ZI_NODE_FIELD_COUNT] = { - "nr_inactive_file", - "nr_active_file", - "workingset_refault", -}; - -union zoneinfo_node_fields { - struct { - int64_t nr_inactive_file; - int64_t nr_active_file; - int64_t workingset_refault; - } field; - int64_t arr[ZI_NODE_FIELD_COUNT]; -}; - -struct zoneinfo_node { - int id; - int zone_count; - struct zoneinfo_zone zones[MAX_NR_ZONES]; - union zoneinfo_node_fields fields; -}; - -/* for now two memory nodes is more than enough */ -#define MAX_NR_NODES 2 - -struct zoneinfo { - int node_count; - struct zoneinfo_node nodes[MAX_NR_NODES]; - int64_t totalreserve_pages; - int64_t total_inactive_file; - int64_t total_active_file; - int64_t total_workingset_refault; -}; - -/* Fields to parse in /proc/meminfo */ -enum meminfo_field { - MI_NR_FREE_PAGES = 0, - MI_CACHED, - MI_SWAP_CACHED, - MI_BUFFERS, - MI_SHMEM, - MI_UNEVICTABLE, - MI_TOTAL_SWAP, - MI_FREE_SWAP, - MI_ACTIVE_ANON, - MI_INACTIVE_ANON, - MI_ACTIVE_FILE, - MI_INACTIVE_FILE, - MI_SRECLAIMABLE, - MI_SUNRECLAIM, - MI_KERNEL_STACK, - MI_PAGE_TABLES, - MI_ION_HELP, - MI_ION_HELP_POOL, - MI_CMA_FREE, - MI_FIELD_COUNT -}; - -static const char* const meminfo_field_names[MI_FIELD_COUNT] = { - "MemFree:", - "Cached:", - "SwapCached:", - "Buffers:", - "Shmem:", - "Unevictable:", - "SwapTotal:", - "SwapFree:", - "Active(anon):", - "Inactive(anon):", - "Active(file):", - "Inactive(file):", - "SReclaimable:", - "SUnreclaim:", - "KernelStack:", - "PageTables:", - "ION_heap:", - "ION_heap_pool:", - "CmaFree:", -}; - -union meminfo { - struct { - int64_t nr_free_pages; - int64_t cached; - int64_t swap_cached; - int64_t buffers; - int64_t shmem; - int64_t unevictable; - int64_t total_swap; - int64_t free_swap; - int64_t active_anon; - int64_t inactive_anon; - int64_t active_file; - int64_t inactive_file; - int64_t sreclaimable; - int64_t sunreclaimable; - int64_t kernel_stack; - int64_t page_tables; - int64_t ion_heap; - int64_t ion_heap_pool; - int64_t cma_free; - /* fields below are calculated rather than read from the file */ - int64_t nr_file_pages; - } field; - int64_t arr[MI_FIELD_COUNT]; -}; - -/* Fields to parse in /proc/vmstat */ -enum vmstat_field { - VS_FREE_PAGES, - VS_INACTIVE_FILE, - VS_ACTIVE_FILE, - VS_WORKINGSET_REFAULT, - VS_PGSCAN_KSWAPD, - VS_PGSCAN_DIRECT, - VS_PGSCAN_DIRECT_THROTTLE, - VS_FIELD_COUNT -}; - -static const char* const vmstat_field_names[MI_FIELD_COUNT] = { - "nr_free_pages", - "nr_inactive_file", - "nr_active_file", - "workingset_refault", - "pgscan_kswapd", - "pgscan_direct", - "pgscan_direct_throttle", -}; - -union vmstat { - struct { - int64_t nr_free_pages; - int64_t nr_inactive_file; - int64_t nr_active_file; - int64_t workingset_refault; - int64_t pgscan_kswapd; - int64_t pgscan_direct; - int64_t pgscan_direct_throttle; - } field; - int64_t arr[VS_FIELD_COUNT]; -}; - -enum field_match_result { - NO_MATCH, - PARSE_FAIL, - PARSE_SUCCESS -}; - -struct adjslot_list { - struct adjslot_list *next; - struct adjslot_list *prev; -}; - -struct proc { - struct adjslot_list asl; - int pid; - int pidfd; - uid_t uid; - int oomadj; - pid_t reg_pid; /* PID of the process that registered this record */ - struct proc *pidhash_next; -}; - -struct reread_data { - const char* const filename; - int fd; -}; - -#define PIDHASH_SZ 1024 -static struct proc *pidhash[PIDHASH_SZ]; -#define pid_hashfn(x) ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1)) - -#define ADJTOSLOT(adj) ((adj) + -OOM_SCORE_ADJ_MIN) -#define ADJTOSLOT_COUNT (ADJTOSLOT(OOM_SCORE_ADJ_MAX) + 1) -static struct adjslot_list procadjslot_list[ADJTOSLOT_COUNT]; - -#define MAX_DISTINCT_OOM_ADJ 32 -#define KILLCNT_INVALID_IDX 0xFF -/* - * Because killcnt array is sparse a two-level indirection is used - * to keep the size small. killcnt_idx stores index of the element in - * killcnt array. Index KILLCNT_INVALID_IDX indicates an unused slot. - */ -static uint8_t killcnt_idx[ADJTOSLOT_COUNT]; -static uint16_t killcnt[MAX_DISTINCT_OOM_ADJ]; -static int killcnt_free_idx = 0; -static uint32_t killcnt_total = 0; - -/* PAGE_SIZE / 1024 */ -static long page_k; - -static int clamp(int low, int high, int value) { - return max(min(value, high), low); -} - -static bool parse_int64(const char* str, int64_t* ret) { - char* endptr; - long long val = strtoll(str, &endptr, 10); - if (str == endptr || val > INT64_MAX) { - return false; - } - *ret = (int64_t)val; - return true; -} - -static int find_field(const char* name, const char* const field_names[], int field_count) { - for (int i = 0; i < field_count; i++) { - if (!strcmp(name, field_names[i])) { - return i; - } - } - return -1; -} - -static enum field_match_result match_field(const char* cp, const char* ap, - const char* const field_names[], - int field_count, int64_t* field, - int *field_idx) { - int i = find_field(cp, field_names, field_count); - if (i < 0) { - return NO_MATCH; - } - *field_idx = i; - return parse_int64(ap, field) ? PARSE_SUCCESS : PARSE_FAIL; -} - -/* - * Read file content from the beginning up to max_len bytes or EOF - * whichever happens first. - */ -static ssize_t read_all(int fd, char *buf, size_t max_len) -{ - ssize_t ret = 0; - off_t offset = 0; - - while (max_len > 0) { - ssize_t r = TEMP_FAILURE_RETRY(pread(fd, buf, max_len, offset)); - if (r == 0) { - break; - } - if (r == -1) { - return -1; - } - ret += r; - buf += r; - offset += r; - max_len -= r; - } - - return ret; -} - -/* - * Read a new or already opened file from the beginning. - * If the file has not been opened yet data->fd should be set to -1. - * To be used with files which are read often and possibly during high - * memory pressure to minimize file opening which by itself requires kernel - * memory allocation and might result in a stall on memory stressed system. - */ -static char *reread_file(struct reread_data *data) { - /* start with page-size buffer and increase if needed */ - static ssize_t buf_size = PAGE_SIZE; - static char *new_buf, *buf = NULL; - ssize_t size; - - if (data->fd == -1) { - /* First-time buffer initialization */ - if (!buf && (buf = malloc(buf_size)) == NULL) { - return NULL; - } - - data->fd = TEMP_FAILURE_RETRY(open(data->filename, O_RDONLY | O_CLOEXEC)); - if (data->fd < 0) { - ALOGE("%s open: %s", data->filename, strerror(errno)); - return NULL; - } - } - - while (true) { - size = read_all(data->fd, buf, buf_size - 1); - if (size < 0) { - ALOGE("%s read: %s", data->filename, strerror(errno)); - close(data->fd); - data->fd = -1; - return NULL; - } - if (size < buf_size - 1) { - break; - } - /* - * Since we are reading /proc files we can't use fstat to find out - * the real size of the file. Double the buffer size and keep retrying. - */ - if ((new_buf = realloc(buf, buf_size * 2)) == NULL) { - errno = ENOMEM; - return NULL; - } - buf = new_buf; - buf_size *= 2; - } - buf[size] = 0; - - return buf; -} - -static struct proc *pid_lookup(int pid) { - struct proc *procp; - - for (procp = pidhash[pid_hashfn(pid)]; procp && procp->pid != pid; - procp = procp->pidhash_next) - ; - - return procp; -} - -static void adjslot_insert(struct adjslot_list *head, struct adjslot_list *new) -{ - struct adjslot_list *next = head->next; - new->prev = head; - new->next = next; - next->prev = new; - head->next = new; -} - -static void adjslot_remove(struct adjslot_list *old) -{ - struct adjslot_list *prev = old->prev; - struct adjslot_list *next = old->next; - next->prev = prev; - prev->next = next; -} - -static struct adjslot_list *adjslot_tail(struct adjslot_list *head) { - struct adjslot_list *asl = head->prev; - - return asl == head ? NULL : asl; -} - -static void proc_slot(struct proc *procp) { - int adjslot = ADJTOSLOT(procp->oomadj); - - adjslot_insert(&procadjslot_list[adjslot], &procp->asl); -} - -static void proc_unslot(struct proc *procp) { - adjslot_remove(&procp->asl); -} - -static void proc_insert(struct proc *procp) { - int hval = pid_hashfn(procp->pid); - - procp->pidhash_next = pidhash[hval]; - pidhash[hval] = procp; - proc_slot(procp); -} - -static int pid_remove(int pid) { - int hval = pid_hashfn(pid); - struct proc *procp; - struct proc *prevp; - - for (procp = pidhash[hval], prevp = NULL; procp && procp->pid != pid; - procp = procp->pidhash_next) - prevp = procp; - - if (!procp) - return -1; - - if (!prevp) - pidhash[hval] = procp->pidhash_next; - else - prevp->pidhash_next = procp->pidhash_next; - - proc_unslot(procp); - /* - * Close pidfd here if we are not waiting for corresponding process to die, - * in which case stop_wait_for_proc_kill() will close the pidfd later - */ - if (procp->pidfd >= 0 && procp->pidfd != last_kill_pid_or_fd) { - close(procp->pidfd); - } - free(procp); - return 0; -} - -/* - * Write a string to a file. - * Returns false if the file does not exist. - */ -static bool writefilestring(const char *path, const char *s, - bool err_if_missing) { - int fd = open(path, O_WRONLY | O_CLOEXEC); - ssize_t len = strlen(s); - ssize_t ret; - - if (fd < 0) { - if (err_if_missing) { - ALOGE("Error opening %s; errno=%d", path, errno); - } - return false; - } - - ret = TEMP_FAILURE_RETRY(write(fd, s, len)); - if (ret < 0) { - ALOGE("Error writing %s; errno=%d", path, errno); - } else if (ret < len) { - ALOGE("Short write on %s; length=%zd", path, ret); - } - - close(fd); - return true; -} - -static inline long get_time_diff_ms(struct timespec *from, - struct timespec *to) { - return (to->tv_sec - from->tv_sec) * (long)MS_PER_SEC + - (to->tv_nsec - from->tv_nsec) / (long)NS_PER_MS; -} - -static int proc_get_tgid(int pid) { - char path[PATH_MAX]; - char buf[PAGE_SIZE]; - int fd; - ssize_t size; - char *pos; - int64_t tgid = -1; - - snprintf(path, PATH_MAX, "/proc/%d/status", pid); - fd = open(path, O_RDONLY | O_CLOEXEC); - if (fd < 0) { - return -1; - } - - size = read_all(fd, buf, sizeof(buf) - 1); - if (size < 0) { - goto out; - } - buf[size] = 0; - - pos = buf; - while (true) { - pos = strstr(pos, PROC_STATUS_TGID_FIELD); - /* Stop if TGID tag not found or found at the line beginning */ - if (pos == NULL || pos == buf || pos[-1] == '\n') { - break; - } - pos++; - } - - if (pos == NULL) { - goto out; - } - - pos += strlen(PROC_STATUS_TGID_FIELD); - while (*pos == ' ') pos++; - parse_int64(pos, &tgid); - -out: - close(fd); - return (int)tgid; -} - -static int proc_get_size(int pid) { - char path[PATH_MAX]; - char line[LINE_MAX]; - int fd; - int rss = 0; - int total; - ssize_t ret; - - /* gid containing AID_READPROC required */ - snprintf(path, PATH_MAX, "/proc/%d/statm", pid); - fd = open(path, O_RDONLY | O_CLOEXEC); - if (fd == -1) - return -1; - - ret = read_all(fd, line, sizeof(line) - 1); - if (ret < 0) { - close(fd); - return -1; - } - line[ret] = '\0'; - - sscanf(line, "%d %d ", &total, &rss); - close(fd); - return rss; -} - -static char *proc_get_name(int pid, char *buf, size_t buf_size) { - char path[PATH_MAX]; - int fd; - char *cp; - ssize_t ret; - - /* gid containing AID_READPROC required */ - snprintf(path, PATH_MAX, "/proc/%d/cmdline", pid); - fd = open(path, O_RDONLY | O_CLOEXEC); - if (fd == -1) { - return NULL; - } - ret = read_all(fd, buf, buf_size - 1); - close(fd); - if (ret < 0) { - return NULL; - } - buf[ret] = '\0'; - - cp = strchr(buf, ' '); - if (cp) { - *cp = '\0'; - } - - return buf; -} - -static bool claim_record(struct proc *procp, pid_t pid) { - if (procp->reg_pid == pid) { - /* Record already belongs to the registrant */ - return true; - } - if (procp->reg_pid == 0) { - /* Old registrant is gone, claim the record */ - procp->reg_pid = pid; - return true; - } - /* The record is owned by another registrant */ - return false; -} - -static void remove_claims(pid_t pid) { - int i; - - for (i = 0; i < PIDHASH_SZ; i++) { - struct proc *procp = pidhash[i]; - while (procp) { - if (procp->reg_pid == pid) { - procp->reg_pid = 0; - } - procp = procp->pidhash_next; - } - } -} - -static void cmd_procprio(LMKD_CTRL_PACKET packet, int field_count, struct ucred *cred) { - struct proc *procp; - char path[LINE_MAX]; - char val[20]; - int soft_limit_mult; - struct lmk_procprio params; - bool is_system_server; - struct passwd *pwdrec; - int tgid; - - lmkd_pack_get_procprio(packet, field_count, ¶ms); - - if (params.oomadj < OOM_SCORE_ADJ_MIN || - params.oomadj > OOM_SCORE_ADJ_MAX) { - ALOGE("Invalid PROCPRIO oomadj argument %d", params.oomadj); - return; - } - - if (params.ptype < PROC_TYPE_FIRST || params.ptype >= PROC_TYPE_COUNT) { - ALOGE("Invalid PROCPRIO process type argument %d", params.ptype); - return; - } - - /* Check if registered process is a thread group leader */ - tgid = proc_get_tgid(params.pid); - if (tgid >= 0 && tgid != params.pid) { - ALOGE("Attempt to register a task that is not a thread group leader (tid %d, tgid %d)", - params.pid, tgid); - return; - } - - /* gid containing AID_READPROC required */ - /* CAP_SYS_RESOURCE required */ - /* CAP_DAC_OVERRIDE required */ - snprintf(path, sizeof(path), "/proc/%d/oom_score_adj", params.pid); - snprintf(val, sizeof(val), "%d", params.oomadj); - if (!writefilestring(path, val, false)) { - ALOGW("Failed to open %s; errno=%d: process %d might have been killed", - path, errno, params.pid); - /* If this file does not exist the process is dead. */ - return; - } - - if (use_inkernel_interface) { - stats_store_taskname(params.pid, proc_get_name(params.pid, path, sizeof(path)), - kpoll_info.poll_fd); - return; - } - - /* lmkd should not change soft limits for services */ - if (params.ptype == PROC_TYPE_APP && per_app_memcg) { - if (params.oomadj >= 900) { - soft_limit_mult = 0; - } else if (params.oomadj >= 800) { - soft_limit_mult = 0; - } else if (params.oomadj >= 700) { - soft_limit_mult = 0; - } else if (params.oomadj >= 600) { - // Launcher should be perceptible, don't kill it. - params.oomadj = 200; - soft_limit_mult = 1; - } else if (params.oomadj >= 500) { - soft_limit_mult = 0; - } else if (params.oomadj >= 400) { - soft_limit_mult = 0; - } else if (params.oomadj >= 300) { - soft_limit_mult = 1; - } else if (params.oomadj >= 200) { - soft_limit_mult = 8; - } else if (params.oomadj >= 100) { - soft_limit_mult = 10; - } else if (params.oomadj >= 0) { - soft_limit_mult = 20; - } else { - // Persistent processes will have a large - // soft limit 512MB. - soft_limit_mult = 64; - } - - snprintf(path, sizeof(path), MEMCG_SYSFS_PATH - "apps/uid_%d/pid_%d/memory.soft_limit_in_bytes", - params.uid, params.pid); - snprintf(val, sizeof(val), "%d", soft_limit_mult * EIGHT_MEGA); - - /* - * system_server process has no memcg under /dev/memcg/apps but should be - * registered with lmkd. This is the best way so far to identify it. - */ - is_system_server = (params.oomadj == SYSTEM_ADJ && - (pwdrec = getpwnam("system")) != NULL && - params.uid == pwdrec->pw_uid); - writefilestring(path, val, !is_system_server); - } - - procp = pid_lookup(params.pid); - if (!procp) { - int pidfd = -1; - - if (pidfd_supported) { - pidfd = TEMP_FAILURE_RETRY(sys_pidfd_open(params.pid, 0)); - if (pidfd < 0) { - ALOGE("pidfd_open for pid %d failed; errno=%d", params.pid, errno); - return; - } - } - - procp = calloc(1, sizeof(struct proc)); - if (!procp) { - // Oh, the irony. May need to rebuild our state. - return; - } - - procp->pid = params.pid; - procp->pidfd = pidfd; - procp->uid = params.uid; - procp->reg_pid = cred->pid; - procp->oomadj = params.oomadj; - proc_insert(procp); - } else { - if (!claim_record(procp, cred->pid)) { - char buf[LINE_MAX]; - /* Only registrant of the record can remove it */ - ALOGE("%s (%d, %d) attempts to modify a process registered by another client", - proc_get_name(cred->pid, buf, sizeof(buf)), cred->uid, cred->pid); - return; - } - proc_unslot(procp); - procp->oomadj = params.oomadj; - proc_slot(procp); - } -} - -static void cmd_procremove(LMKD_CTRL_PACKET packet, struct ucred *cred) { - struct lmk_procremove params; - struct proc *procp; - - lmkd_pack_get_procremove(packet, ¶ms); - - if (use_inkernel_interface) { - stats_remove_taskname(params.pid, kpoll_info.poll_fd); - return; - } - - procp = pid_lookup(params.pid); - if (!procp) { - return; - } - - if (!claim_record(procp, cred->pid)) { - char buf[LINE_MAX]; - /* Only registrant of the record can remove it */ - ALOGE("%s (%d, %d) attempts to unregister a process registered by another client", - proc_get_name(cred->pid, buf, sizeof(buf)), cred->uid, cred->pid); - return; - } - - /* - * WARNING: After pid_remove() procp is freed and can't be used! - * Therefore placed at the end of the function. - */ - pid_remove(params.pid); -} - -static void cmd_procpurge(struct ucred *cred) { - int i; - struct proc *procp; - struct proc *next; - - if (use_inkernel_interface) { - stats_purge_tasknames(); - return; - } - - for (i = 0; i < PIDHASH_SZ; i++) { - procp = pidhash[i]; - while (procp) { - next = procp->pidhash_next; - /* Purge only records created by the requestor */ - if (claim_record(procp, cred->pid)) { - pid_remove(procp->pid); - } - procp = next; - } - } -} - -static void inc_killcnt(int oomadj) { - int slot = ADJTOSLOT(oomadj); - uint8_t idx = killcnt_idx[slot]; - - if (idx == KILLCNT_INVALID_IDX) { - /* index is not assigned for this oomadj */ - if (killcnt_free_idx < MAX_DISTINCT_OOM_ADJ) { - killcnt_idx[slot] = killcnt_free_idx; - killcnt[killcnt_free_idx] = 1; - killcnt_free_idx++; - } else { - ALOGW("Number of distinct oomadj levels exceeds %d", - MAX_DISTINCT_OOM_ADJ); - } - } else { - /* - * wraparound is highly unlikely and is detectable using total - * counter because it has to be equal to the sum of all counters - */ - killcnt[idx]++; - } - /* increment total kill counter */ - killcnt_total++; -} - -static int get_killcnt(int min_oomadj, int max_oomadj) { - int slot; - int count = 0; - - if (min_oomadj > max_oomadj) - return 0; - - /* special case to get total kill count */ - if (min_oomadj > OOM_SCORE_ADJ_MAX) - return killcnt_total; - - while (min_oomadj <= max_oomadj && - (slot = ADJTOSLOT(min_oomadj)) < ADJTOSLOT_COUNT) { - uint8_t idx = killcnt_idx[slot]; - if (idx != KILLCNT_INVALID_IDX) { - count += killcnt[idx]; - } - min_oomadj++; - } - - return count; -} - -static int cmd_getkillcnt(LMKD_CTRL_PACKET packet) { - struct lmk_getkillcnt params; - - if (use_inkernel_interface) { - /* kernel driver does not expose this information */ - return 0; - } - - lmkd_pack_get_getkillcnt(packet, ¶ms); - - return get_killcnt(params.min_oomadj, params.max_oomadj); -} - -static void cmd_target(int ntargets, LMKD_CTRL_PACKET packet) { - int i; - struct lmk_target target; - char minfree_str[PROPERTY_VALUE_MAX]; - char *pstr = minfree_str; - char *pend = minfree_str + sizeof(minfree_str); - static struct timespec last_req_tm; - struct timespec curr_tm; - - if (ntargets < 1 || ntargets > (int)ARRAY_SIZE(lowmem_adj)) - return; - - /* - * Ratelimit minfree updates to once per TARGET_UPDATE_MIN_INTERVAL_MS - * to prevent DoS attacks - */ - if (clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm) != 0) { - ALOGE("Failed to get current time"); - return; - } - - if (get_time_diff_ms(&last_req_tm, &curr_tm) < - TARGET_UPDATE_MIN_INTERVAL_MS) { - ALOGE("Ignoring frequent updated to lmkd limits"); - return; - } - - last_req_tm = curr_tm; - - for (i = 0; i < ntargets; i++) { - lmkd_pack_get_target(packet, i, &target); - lowmem_minfree[i] = target.minfree; - lowmem_adj[i] = target.oom_adj_score; - - pstr += snprintf(pstr, pend - pstr, "%d:%d,", target.minfree, - target.oom_adj_score); - if (pstr >= pend) { - /* if no more space in the buffer then terminate the loop */ - pstr = pend; - break; - } - } - - lowmem_targets_size = ntargets; - - /* Override the last extra comma */ - pstr[-1] = '\0'; - property_set("sys.lmk.minfree_levels", minfree_str); - - if (has_inkernel_module) { - char minfreestr[128]; - char killpriostr[128]; - - minfreestr[0] = '\0'; - killpriostr[0] = '\0'; - - for (i = 0; i < lowmem_targets_size; i++) { - char val[40]; - - if (i) { - strlcat(minfreestr, ",", sizeof(minfreestr)); - strlcat(killpriostr, ",", sizeof(killpriostr)); - } - - snprintf(val, sizeof(val), "%d", use_inkernel_interface ? lowmem_minfree[i] : 0); - strlcat(minfreestr, val, sizeof(minfreestr)); - snprintf(val, sizeof(val), "%d", use_inkernel_interface ? lowmem_adj[i] : 0); - strlcat(killpriostr, val, sizeof(killpriostr)); - } - - writefilestring(INKERNEL_MINFREE_PATH, minfreestr, true); - writefilestring(INKERNEL_ADJ_PATH, killpriostr, true); - } -} - -static void ctrl_data_close(int dsock_idx) { - struct epoll_event epev; - - ALOGI("closing lmkd data connection"); - if (epoll_ctl(epollfd, EPOLL_CTL_DEL, data_sock[dsock_idx].sock, &epev) == -1) { - // Log a warning and keep going - ALOGW("epoll_ctl for data connection socket failed; errno=%d", errno); - } - maxevents--; - - close(data_sock[dsock_idx].sock); - data_sock[dsock_idx].sock = -1; - - /* Mark all records of the old registrant as unclaimed */ - remove_claims(data_sock[dsock_idx].pid); -} - -static ssize_t ctrl_data_read(int dsock_idx, char *buf, size_t bufsz, struct ucred *sender_cred) { - struct iovec iov = { buf, bufsz }; - char control[CMSG_SPACE(sizeof(struct ucred))]; - struct msghdr hdr = { - NULL, 0, &iov, 1, control, sizeof(control), 0, - }; - ssize_t ret; - - ret = TEMP_FAILURE_RETRY(recvmsg(data_sock[dsock_idx].sock, &hdr, 0)); - if (ret == -1) { - ALOGE("control data socket read failed; %s", strerror(errno)); - return -1; - } - if (ret == 0) { - ALOGE("Got EOF on control data socket"); - return -1; - } - - struct ucred* cred = NULL; - struct cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr); - while (cmsg != NULL) { - if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_CREDENTIALS) { - cred = (struct ucred*)CMSG_DATA(cmsg); - break; - } - cmsg = CMSG_NXTHDR(&hdr, cmsg); - } - - if (cred == NULL) { - ALOGE("Failed to retrieve sender credentials"); - /* Close the connection */ - ctrl_data_close(dsock_idx); - return -1; - } - - memcpy(sender_cred, cred, sizeof(struct ucred)); - - /* Store PID of the peer */ - data_sock[dsock_idx].pid = cred->pid; - - return ret; -} - -static int ctrl_data_write(int dsock_idx, char *buf, size_t bufsz) { - int ret = 0; - - ret = TEMP_FAILURE_RETRY(write(data_sock[dsock_idx].sock, buf, bufsz)); - - if (ret == -1) { - ALOGE("control data socket write failed; errno=%d", errno); - } else if (ret == 0) { - ALOGE("Got EOF on control data socket"); - ret = -1; - } - - return ret; -} - -static void ctrl_command_handler(int dsock_idx) { - LMKD_CTRL_PACKET packet; - struct ucred cred; - int len; - enum lmk_cmd cmd; - int nargs; - int targets; - int kill_cnt; - - len = ctrl_data_read(dsock_idx, (char *)packet, CTRL_PACKET_MAX_SIZE, &cred); - if (len <= 0) - return; - - if (len < (int)sizeof(int)) { - ALOGE("Wrong control socket read length len=%d", len); - return; - } - - cmd = lmkd_pack_get_cmd(packet); - nargs = len / sizeof(int) - 1; - if (nargs < 0) - goto wronglen; - - switch(cmd) { - case LMK_TARGET: - targets = nargs / 2; - if (nargs & 0x1 || targets > (int)ARRAY_SIZE(lowmem_adj)) - goto wronglen; - cmd_target(targets, packet); - break; - case LMK_PROCPRIO: - /* process type field is optional for backward compatibility */ - if (nargs < 3 || nargs > 4) - goto wronglen; - cmd_procprio(packet, nargs, &cred); - break; - case LMK_PROCREMOVE: - if (nargs != 1) - goto wronglen; - cmd_procremove(packet, &cred); - break; - case LMK_PROCPURGE: - if (nargs != 0) - goto wronglen; - cmd_procpurge(&cred); - break; - case LMK_GETKILLCNT: - if (nargs != 2) - goto wronglen; - kill_cnt = cmd_getkillcnt(packet); - len = lmkd_pack_set_getkillcnt_repl(packet, kill_cnt); - if (ctrl_data_write(dsock_idx, (char *)packet, len) != len) - return; - break; - default: - ALOGE("Received unknown command code %d", cmd); - return; - } - - return; - -wronglen: - ALOGE("Wrong control socket read length cmd=%d len=%d", cmd, len); -} - -static void ctrl_data_handler(int data, uint32_t events, - struct polling_params *poll_params __unused) { - if (events & EPOLLIN) { - ctrl_command_handler(data); - } -} - -static int get_free_dsock() { - for (int i = 0; i < MAX_DATA_CONN; i++) { - if (data_sock[i].sock < 0) { - return i; - } - } - return -1; -} - -static void ctrl_connect_handler(int data __unused, uint32_t events __unused, - struct polling_params *poll_params __unused) { - struct epoll_event epev; - int free_dscock_idx = get_free_dsock(); - - if (free_dscock_idx < 0) { - /* - * Number of data connections exceeded max supported. This should not - * happen but if it does we drop all existing connections and accept - * the new one. This prevents inactive connections from monopolizing - * data socket and if we drop ActivityManager connection it will - * immediately reconnect. - */ - for (int i = 0; i < MAX_DATA_CONN; i++) { - ctrl_data_close(i); - } - free_dscock_idx = 0; - } - - data_sock[free_dscock_idx].sock = accept(ctrl_sock.sock, NULL, NULL); - if (data_sock[free_dscock_idx].sock < 0) { - ALOGE("lmkd control socket accept failed; errno=%d", errno); - return; - } - - ALOGI("lmkd data connection established"); - /* use data to store data connection idx */ - data_sock[free_dscock_idx].handler_info.data = free_dscock_idx; - data_sock[free_dscock_idx].handler_info.handler = ctrl_data_handler; - epev.events = EPOLLIN; - epev.data.ptr = (void *)&(data_sock[free_dscock_idx].handler_info); - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, data_sock[free_dscock_idx].sock, &epev) == -1) { - ALOGE("epoll_ctl for data connection socket failed; errno=%d", errno); - ctrl_data_close(free_dscock_idx); - return; - } - maxevents++; -} - -/* - * /proc/zoneinfo parsing routines - * Expected file format is: - * - * Node , zone - * ( - * per-node stats - * ( )+ - * )? - * (pages free - * ( )+ - * pagesets - * ()* - * )+ - * ... - */ -static void zoneinfo_parse_protection(char *buf, struct zoneinfo_zone *zone) { - int zone_idx; - int64_t max = 0; - char *save_ptr; - - for (buf = strtok_r(buf, "(), ", &save_ptr), zone_idx = 0; - buf && zone_idx < MAX_NR_ZONES; - buf = strtok_r(NULL, "), ", &save_ptr), zone_idx++) { - long long zoneval = strtoll(buf, &buf, 0); - if (zoneval > max) { - max = (zoneval > INT64_MAX) ? INT64_MAX : zoneval; - } - zone->protection[zone_idx] = zoneval; - } - zone->max_protection = max; -} - -static int zoneinfo_parse_zone(char **buf, struct zoneinfo_zone *zone) { - for (char *line = strtok_r(NULL, "\n", buf); line; - line = strtok_r(NULL, "\n", buf)) { - char *cp; - char *ap; - char *save_ptr; - int64_t val; - int field_idx; - enum field_match_result match_res; - - cp = strtok_r(line, " ", &save_ptr); - if (!cp) { - return false; - } - - field_idx = find_field(cp, zoneinfo_zone_spec_field_names, ZI_ZONE_SPEC_FIELD_COUNT); - if (field_idx >= 0) { - /* special field */ - if (field_idx == ZI_ZONE_SPEC_PAGESETS) { - /* no mode fields we are interested in */ - return true; - } - - /* protection field */ - ap = strtok_r(NULL, ")", &save_ptr); - if (ap) { - zoneinfo_parse_protection(ap, zone); - } - continue; - } - - ap = strtok_r(NULL, " ", &save_ptr); - if (!ap) { - continue; - } - - match_res = match_field(cp, ap, zoneinfo_zone_field_names, ZI_ZONE_FIELD_COUNT, - &val, &field_idx); - if (match_res == PARSE_FAIL) { - return false; - } - if (match_res == PARSE_SUCCESS) { - zone->fields.arr[field_idx] = val; - } - if (field_idx == ZI_ZONE_PRESENT && val == 0) { - /* zone is not populated, stop parsing it */ - return true; - } - } - return false; -} - -static int zoneinfo_parse_node(char **buf, struct zoneinfo_node *node) { - int fields_to_match = ZI_NODE_FIELD_COUNT; - - for (char *line = strtok_r(NULL, "\n", buf); line; - line = strtok_r(NULL, "\n", buf)) { - char *cp; - char *ap; - char *save_ptr; - int64_t val; - int field_idx; - enum field_match_result match_res; - - cp = strtok_r(line, " ", &save_ptr); - if (!cp) { - return false; - } - - ap = strtok_r(NULL, " ", &save_ptr); - if (!ap) { - return false; - } - - match_res = match_field(cp, ap, zoneinfo_node_field_names, ZI_NODE_FIELD_COUNT, - &val, &field_idx); - if (match_res == PARSE_FAIL) { - return false; - } - if (match_res == PARSE_SUCCESS) { - node->fields.arr[field_idx] = val; - fields_to_match--; - if (!fields_to_match) { - return true; - } - } - } - return false; -} - -static int zoneinfo_parse(struct zoneinfo *zi) { - static struct reread_data file_data = { - .filename = ZONEINFO_PATH, - .fd = -1, - }; - char *buf; - char *save_ptr; - char *line; - char zone_name[LINE_MAX + 1]; - struct zoneinfo_node *node = NULL; - int node_idx = 0; - int zone_idx = 0; - - memset(zi, 0, sizeof(struct zoneinfo)); - - if ((buf = reread_file(&file_data)) == NULL) { - return -1; - } - - for (line = strtok_r(buf, "\n", &save_ptr); line; - line = strtok_r(NULL, "\n", &save_ptr)) { - int node_id; - if (sscanf(line, "Node %d, zone %" STRINGIFY(LINE_MAX) "s", &node_id, zone_name) == 2) { - if (!node || node->id != node_id) { - /* new node is found */ - if (node) { - node->zone_count = zone_idx + 1; - node_idx++; - if (node_idx == MAX_NR_NODES) { - /* max node count exceeded */ - ALOGE("%s parse error", file_data.filename); - return -1; - } - } - node = &zi->nodes[node_idx]; - node->id = node_id; - zone_idx = 0; - if (!zoneinfo_parse_node(&save_ptr, node)) { - ALOGE("%s parse error", file_data.filename); - return -1; - } - } else { - /* new zone is found */ - zone_idx++; - } - if (!zoneinfo_parse_zone(&save_ptr, &node->zones[zone_idx])) { - ALOGE("%s parse error", file_data.filename); - return -1; - } - } - } - if (!node) { - ALOGE("%s parse error", file_data.filename); - return -1; - } - node->zone_count = zone_idx + 1; - zi->node_count = node_idx + 1; - - /* calculate totals fields */ - for (node_idx = 0; node_idx < zi->node_count; node_idx++) { - node = &zi->nodes[node_idx]; - for (zone_idx = 0; zone_idx < node->zone_count; zone_idx++) { - struct zoneinfo_zone *zone = &zi->nodes[node_idx].zones[zone_idx]; - zi->totalreserve_pages += zone->max_protection + zone->fields.field.high; - } - zi->total_inactive_file += node->fields.field.nr_inactive_file; - zi->total_active_file += node->fields.field.nr_active_file; - zi->total_workingset_refault += node->fields.field.workingset_refault; - } - return 0; -} - -/* /proc/meminfo parsing routines */ -static bool meminfo_parse_line(char *line, union meminfo *mi) { - char *cp = line; - char *ap; - char *save_ptr; - int64_t val; - int field_idx; - enum field_match_result match_res; - - cp = strtok_r(line, " ", &save_ptr); - if (!cp) { - return false; - } - - ap = strtok_r(NULL, " ", &save_ptr); - if (!ap) { - return false; - } - - match_res = match_field(cp, ap, meminfo_field_names, MI_FIELD_COUNT, - &val, &field_idx); - if (match_res == PARSE_SUCCESS) { - mi->arr[field_idx] = val / page_k; - } - return (match_res != PARSE_FAIL); -} - -static int meminfo_parse(union meminfo *mi) { - static struct reread_data file_data = { - .filename = MEMINFO_PATH, - .fd = -1, - }; - char *buf; - char *save_ptr; - char *line; - - memset(mi, 0, sizeof(union meminfo)); - - if ((buf = reread_file(&file_data)) == NULL) { - return -1; - } - - for (line = strtok_r(buf, "\n", &save_ptr); line; - line = strtok_r(NULL, "\n", &save_ptr)) { - if (!meminfo_parse_line(line, mi)) { - ALOGE("%s parse error", file_data.filename); - return -1; - } - } - mi->field.nr_file_pages = mi->field.cached + mi->field.swap_cached + - mi->field.buffers; - - return 0; -} - -/* /proc/vmstat parsing routines */ -static bool vmstat_parse_line(char *line, union vmstat *vs) { - char *cp; - char *ap; - char *save_ptr; - int64_t val; - int field_idx; - enum field_match_result match_res; - - cp = strtok_r(line, " ", &save_ptr); - if (!cp) { - return false; - } - - ap = strtok_r(NULL, " ", &save_ptr); - if (!ap) { - return false; - } - - match_res = match_field(cp, ap, vmstat_field_names, VS_FIELD_COUNT, - &val, &field_idx); - if (match_res == PARSE_SUCCESS) { - vs->arr[field_idx] = val; - } - return (match_res != PARSE_FAIL); -} - -static int vmstat_parse(union vmstat *vs) { - static struct reread_data file_data = { - .filename = VMSTAT_PATH, - .fd = -1, - }; - char *buf; - char *save_ptr; - char *line; - - memset(vs, 0, sizeof(union vmstat)); - - if ((buf = reread_file(&file_data)) == NULL) { - return -1; - } - - for (line = strtok_r(buf, "\n", &save_ptr); line; - line = strtok_r(NULL, "\n", &save_ptr)) { - if (!vmstat_parse_line(line, vs)) { - ALOGE("%s parse error", file_data.filename); - return -1; - } - } - - return 0; -} - -static void killinfo_log(struct proc* procp, int min_oom_score, int tasksize, - int kill_reason, union meminfo *mi) { - /* log process information */ - android_log_write_int32(ctx, procp->pid); - android_log_write_int32(ctx, procp->uid); - android_log_write_int32(ctx, procp->oomadj); - android_log_write_int32(ctx, min_oom_score); - android_log_write_int32(ctx, (int32_t)min(tasksize * page_k, INT32_MAX)); - android_log_write_int32(ctx, kill_reason); - - /* log meminfo fields */ - for (int field_idx = 0; field_idx < MI_FIELD_COUNT; field_idx++) { - android_log_write_int32(ctx, (int32_t)min(mi->arr[field_idx] * page_k, INT32_MAX)); - } - - android_log_write_list(ctx, LOG_ID_EVENTS); - android_log_reset(ctx); -} - -static struct proc *proc_adj_lru(int oomadj) { - return (struct proc *)adjslot_tail(&procadjslot_list[ADJTOSLOT(oomadj)]); -} - -static struct proc *proc_get_heaviest(int oomadj) { - struct adjslot_list *head = &procadjslot_list[ADJTOSLOT(oomadj)]; - struct adjslot_list *curr = head->next; - struct proc *maxprocp = NULL; - int maxsize = 0; - while (curr != head) { - int pid = ((struct proc *)curr)->pid; - int tasksize = proc_get_size(pid); - if (tasksize <= 0) { - struct adjslot_list *next = curr->next; - pid_remove(pid); - curr = next; - } else { - if (tasksize > maxsize) { - maxsize = tasksize; - maxprocp = (struct proc *)curr; - } - curr = curr->next; - } - } - return maxprocp; -} - -static void set_process_group_and_prio(int pid, SchedPolicy sp, int prio) { - DIR* d; - char proc_path[PATH_MAX]; - struct dirent* de; - - snprintf(proc_path, sizeof(proc_path), "/proc/%d/task", pid); - if (!(d = opendir(proc_path))) { - ALOGW("Failed to open %s; errno=%d: process pid(%d) might have died", proc_path, errno, - pid); - return; - } - - while ((de = readdir(d))) { - int t_pid; - - if (de->d_name[0] == '.') continue; - t_pid = atoi(de->d_name); - - if (!t_pid) { - ALOGW("Failed to get t_pid for '%s' of pid(%d)", de->d_name, pid); - continue; - } - - if (setpriority(PRIO_PROCESS, t_pid, prio) && errno != ESRCH) { - ALOGW("Unable to raise priority of killing t_pid (%d): errno=%d", t_pid, errno); - } - - if (set_cpuset_policy(t_pid, sp)) { - ALOGW("Failed to set_cpuset_policy on pid(%d) t_pid(%d) to %d", pid, t_pid, (int)sp); - continue; - } - } - closedir(d); -} - -static bool is_kill_pending(void) { - char buf[24]; - - if (last_kill_pid_or_fd < 0) { - return false; - } - - if (pidfd_supported) { - return true; - } - - /* when pidfd is not supported base the decision on /proc/ existence */ - snprintf(buf, sizeof(buf), "/proc/%d/", last_kill_pid_or_fd); - if (access(buf, F_OK) == 0) { - return true; - } - - return false; -} - -static bool is_waiting_for_kill(void) { - return pidfd_supported && last_kill_pid_or_fd >= 0; -} - -static void stop_wait_for_proc_kill(bool finished) { - struct epoll_event epev; - - if (last_kill_pid_or_fd < 0) { - return; - } - - if (debug_process_killing) { - struct timespec curr_tm; - - if (clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm) != 0) { - /* - * curr_tm is used here merely to report kill duration, so this failure is not fatal. - * Log an error and continue. - */ - ALOGE("Failed to get current time"); - } - - if (finished) { - ALOGI("Process got killed in %ldms", - get_time_diff_ms(&last_kill_tm, &curr_tm)); - } else { - ALOGI("Stop waiting for process kill after %ldms", - get_time_diff_ms(&last_kill_tm, &curr_tm)); - } - } - - if (pidfd_supported) { - /* unregister fd */ - if (epoll_ctl(epollfd, EPOLL_CTL_DEL, last_kill_pid_or_fd, &epev) != 0) { - ALOGE("epoll_ctl for last killed process failed; errno=%d", errno); - return; - } - maxevents--; - close(last_kill_pid_or_fd); - } - - last_kill_pid_or_fd = -1; -} - -static void kill_done_handler(int data __unused, uint32_t events __unused, - struct polling_params *poll_params) { - stop_wait_for_proc_kill(true); - poll_params->update = POLLING_RESUME; -} - -static void start_wait_for_proc_kill(int pid_or_fd) { - static struct event_handler_info kill_done_hinfo = { 0, kill_done_handler }; - struct epoll_event epev; - - if (last_kill_pid_or_fd >= 0) { - /* Should not happen but if it does we should stop previous wait */ - ALOGE("Attempt to wait for a kill while another wait is in progress"); - stop_wait_for_proc_kill(false); - } - - last_kill_pid_or_fd = pid_or_fd; - - if (!pidfd_supported) { - /* If pidfd is not supported just store PID and exit */ - return; - } - - epev.events = EPOLLIN; - epev.data.ptr = (void *)&kill_done_hinfo; - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, last_kill_pid_or_fd, &epev) != 0) { - ALOGE("epoll_ctl for last kill failed; errno=%d", errno); - close(last_kill_pid_or_fd); - last_kill_pid_or_fd = -1; - return; - } - maxevents++; -} - -/* Kill one process specified by procp. Returns the size of the process killed */ -static int kill_one_process(struct proc* procp, int min_oom_score, int kill_reason, - const char *kill_desc, union meminfo *mi, struct timespec *tm) { - int pid = procp->pid; - int pidfd = procp->pidfd; - uid_t uid = procp->uid; - int tgid; - char *taskname; - int tasksize; - int r; - int result = -1; - struct memory_stat *mem_st; - char buf[LINE_MAX]; - - tgid = proc_get_tgid(pid); - if (tgid >= 0 && tgid != pid) { - ALOGE("Possible pid reuse detected (pid %d, tgid %d)!", pid, tgid); - goto out; - } - - taskname = proc_get_name(pid, buf, sizeof(buf)); - if (!taskname) { - goto out; - } - - tasksize = proc_get_size(pid); - if (tasksize <= 0) { - goto out; - } - - mem_st = stats_read_memory_stat(per_app_memcg, pid, uid); - - TRACE_KILL_START(pid); - - /* CAP_KILL required */ - if (pidfd < 0) { - start_wait_for_proc_kill(pid); - r = kill(pid, SIGKILL); - } else { - start_wait_for_proc_kill(pidfd); - r = sys_pidfd_send_signal(pidfd, SIGKILL, NULL, 0); - } - - TRACE_KILL_END(); - - if (r) { - stop_wait_for_proc_kill(false); - ALOGE("kill(%d): errno=%d", pid, errno); - /* Delete process record even when we fail to kill so that we don't get stuck on it */ - goto out; - } - - set_process_group_and_prio(pid, SP_FOREGROUND, ANDROID_PRIORITY_HIGHEST); - - last_kill_tm = *tm; - - inc_killcnt(procp->oomadj); - - killinfo_log(procp, min_oom_score, tasksize, kill_reason, mi); - - if (kill_desc) { - ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB; reason: %s", taskname, pid, - uid, procp->oomadj, tasksize * page_k, kill_desc); - } else { - ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB", taskname, pid, - uid, procp->oomadj, tasksize * page_k); - } - - stats_write_lmk_kill_occurred(LMK_KILL_OCCURRED, uid, taskname, - procp->oomadj, min_oom_score, tasksize, mem_st); - - result = tasksize; - -out: - /* - * WARNING: After pid_remove() procp is freed and can't be used! - * Therefore placed at the end of the function. - */ - pid_remove(pid); - return result; -} - -/* - * Find one process to kill at or above the given oom_adj level. - * Returns size of the killed process. - */ -static int find_and_kill_process(int min_score_adj, int kill_reason, const char *kill_desc, - union meminfo *mi, struct timespec *tm) { - int i; - int killed_size = 0; - bool lmk_state_change_start = false; - - for (i = OOM_SCORE_ADJ_MAX; i >= min_score_adj; i--) { - struct proc *procp; - - while (true) { - procp = kill_heaviest_task ? - proc_get_heaviest(i) : proc_adj_lru(i); - - if (!procp) - break; - - killed_size = kill_one_process(procp, min_score_adj, kill_reason, kill_desc, mi, tm); - if (killed_size >= 0) { - if (!lmk_state_change_start) { - lmk_state_change_start = true; - stats_write_lmk_state_changed(LMK_STATE_CHANGED, - LMK_STATE_CHANGE_START); - } - break; - } - } - if (killed_size) { - break; - } - } - - if (lmk_state_change_start) { - stats_write_lmk_state_changed(LMK_STATE_CHANGED, LMK_STATE_CHANGE_STOP); - } - - return killed_size; -} - -static int64_t get_memory_usage(struct reread_data *file_data) { - int ret; - int64_t mem_usage; - char *buf; - - if ((buf = reread_file(file_data)) == NULL) { - return -1; - } - - if (!parse_int64(buf, &mem_usage)) { - ALOGE("%s parse error", file_data->filename); - return -1; - } - if (mem_usage == 0) { - ALOGE("No memory!"); - return -1; - } - return mem_usage; -} - -void record_low_pressure_levels(union meminfo *mi) { - if (low_pressure_mem.min_nr_free_pages == -1 || - low_pressure_mem.min_nr_free_pages > mi->field.nr_free_pages) { - if (debug_process_killing) { - ALOGI("Low pressure min memory update from %" PRId64 " to %" PRId64, - low_pressure_mem.min_nr_free_pages, mi->field.nr_free_pages); - } - low_pressure_mem.min_nr_free_pages = mi->field.nr_free_pages; - } - /* - * Free memory at low vmpressure events occasionally gets spikes, - * possibly a stale low vmpressure event with memory already - * freed up (no memory pressure should have been reported). - * Ignore large jumps in max_nr_free_pages that would mess up our stats. - */ - if (low_pressure_mem.max_nr_free_pages == -1 || - (low_pressure_mem.max_nr_free_pages < mi->field.nr_free_pages && - mi->field.nr_free_pages - low_pressure_mem.max_nr_free_pages < - low_pressure_mem.max_nr_free_pages * 0.1)) { - if (debug_process_killing) { - ALOGI("Low pressure max memory update from %" PRId64 " to %" PRId64, - low_pressure_mem.max_nr_free_pages, mi->field.nr_free_pages); - } - low_pressure_mem.max_nr_free_pages = mi->field.nr_free_pages; - } -} - -enum vmpressure_level upgrade_level(enum vmpressure_level level) { - return (enum vmpressure_level)((level < VMPRESS_LEVEL_CRITICAL) ? - level + 1 : level); -} - -enum vmpressure_level downgrade_level(enum vmpressure_level level) { - return (enum vmpressure_level)((level > VMPRESS_LEVEL_LOW) ? - level - 1 : level); -} - -enum zone_watermark { - WMARK_MIN = 0, - WMARK_LOW, - WMARK_HIGH, - WMARK_NONE -}; - -struct zone_watermarks { - long high_wmark; - long low_wmark; - long min_wmark; -}; - -/* - * Returns lowest breached watermark or WMARK_NONE. - */ -static enum zone_watermark get_lowest_watermark(union meminfo *mi, - struct zone_watermarks *watermarks) -{ - int64_t nr_free_pages = mi->field.nr_free_pages - mi->field.cma_free; - - if (nr_free_pages < watermarks->min_wmark) { - return WMARK_MIN; - } - if (nr_free_pages < watermarks->low_wmark) { - return WMARK_LOW; - } - if (nr_free_pages < watermarks->high_wmark) { - return WMARK_HIGH; - } - return WMARK_NONE; -} - -void calc_zone_watermarks(struct zoneinfo *zi, struct zone_watermarks *watermarks) { - memset(watermarks, 0, sizeof(struct zone_watermarks)); - - for (int node_idx = 0; node_idx < zi->node_count; node_idx++) { - struct zoneinfo_node *node = &zi->nodes[node_idx]; - for (int zone_idx = 0; zone_idx < node->zone_count; zone_idx++) { - struct zoneinfo_zone *zone = &node->zones[zone_idx]; - - if (!zone->fields.field.present) { - continue; - } - - watermarks->high_wmark += zone->max_protection + zone->fields.field.high; - watermarks->low_wmark += zone->max_protection + zone->fields.field.low; - watermarks->min_wmark += zone->max_protection + zone->fields.field.min; - } - } -} - -static void mp_event_psi(int data, uint32_t events, struct polling_params *poll_params) { - enum kill_reasons { - NONE = -1, /* To denote no kill condition */ - PRESSURE_AFTER_KILL = 0, - NOT_RESPONDING, - LOW_SWAP_AND_THRASHING, - LOW_MEM_AND_SWAP, - LOW_MEM_AND_THRASHING, - DIRECT_RECL_AND_THRASHING, - KILL_REASON_COUNT - }; - enum reclaim_state { - NO_RECLAIM = 0, - KSWAPD_RECLAIM, - DIRECT_RECLAIM, - }; - static int64_t init_ws_refault; - static int64_t base_file_lru; - static int64_t init_pgscan_kswapd; - static int64_t init_pgscan_direct; - static int64_t swap_low_threshold; - static bool killing; - static int thrashing_limit; - static bool in_reclaim; - static struct zone_watermarks watermarks; - static struct timespec wmark_update_tm; - - union meminfo mi; - union vmstat vs; - struct timespec curr_tm; - int64_t thrashing = 0; - bool swap_is_low = false; - enum vmpressure_level level = (enum vmpressure_level)data; - enum kill_reasons kill_reason = NONE; - bool cycle_after_kill = false; - enum reclaim_state reclaim = NO_RECLAIM; - enum zone_watermark wmark = WMARK_NONE; - char kill_desc[LINE_MAX]; - bool cut_thrashing_limit = false; - int min_score_adj = 0; - - /* Skip while still killing a process */ - if (is_kill_pending()) { - goto no_kill; - } - /* - * Process is dead, stop waiting. This has no effect if pidfds are supported and - * death notification already caused waiting to stop. - */ - stop_wait_for_proc_kill(true); - - if (clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm) != 0) { - ALOGE("Failed to get current time"); - return; - } - - if (vmstat_parse(&vs) < 0) { - ALOGE("Failed to parse vmstat!"); - return; - } - - if (meminfo_parse(&mi) < 0) { - ALOGE("Failed to parse meminfo!"); - return; - } - - /* Reset states after process got killed */ - if (killing) { - killing = false; - cycle_after_kill = true; - /* Reset file-backed pagecache size and refault amounts after a kill */ - base_file_lru = vs.field.nr_inactive_file + vs.field.nr_active_file; - init_ws_refault = vs.field.workingset_refault; - } - - /* Check free swap levels */ - if (swap_free_low_percentage) { - if (!swap_low_threshold) { - swap_low_threshold = mi.field.total_swap * swap_free_low_percentage / 100; - } - swap_is_low = mi.field.free_swap < swap_low_threshold; - } - - /* Identify reclaim state */ - if (vs.field.pgscan_direct > init_pgscan_direct) { - init_pgscan_direct = vs.field.pgscan_direct; - init_pgscan_kswapd = vs.field.pgscan_kswapd; - reclaim = DIRECT_RECLAIM; - } else if (vs.field.pgscan_kswapd > init_pgscan_kswapd) { - init_pgscan_kswapd = vs.field.pgscan_kswapd; - reclaim = KSWAPD_RECLAIM; - } else { - in_reclaim = false; - /* Skip if system is not reclaiming */ - goto no_kill; - } - - if (!in_reclaim) { - /* Record file-backed pagecache size when entering reclaim cycle */ - base_file_lru = vs.field.nr_inactive_file + vs.field.nr_active_file; - init_ws_refault = vs.field.workingset_refault; - thrashing_limit = thrashing_limit_pct; - } else { - /* Calculate what % of the file-backed pagecache refaulted so far */ - thrashing = (vs.field.workingset_refault - init_ws_refault) * 100 / base_file_lru; - } - in_reclaim = true; - - /* - * Refresh watermarks once per min in case user updated one of the margins. - * TODO: b/140521024 replace this periodic update with an API for AMS to notify LMKD - * that zone watermarks were changed by the system software. - */ - if (watermarks.high_wmark == 0 || get_time_diff_ms(&wmark_update_tm, &curr_tm) > 60000) { - struct zoneinfo zi; - - if (zoneinfo_parse(&zi) < 0) { - ALOGE("Failed to parse zoneinfo!"); - return; - } - - calc_zone_watermarks(&zi, &watermarks); - wmark_update_tm = curr_tm; - } - - /* Find out which watermark is breached if any */ - wmark = get_lowest_watermark(&mi, &watermarks); - - /* - * TODO: move this logic into a separate function - * Decide if killing a process is necessary and record the reason - */ - if (cycle_after_kill && wmark < WMARK_LOW) { - /* - * Prevent kills not freeing enough memory which might lead to OOM kill. - * This might happen when a process is consuming memory faster than reclaim can - * free even after a kill. Mostly happens when running memory stress tests. - */ - kill_reason = PRESSURE_AFTER_KILL; - strncpy(kill_desc, "min watermark is breached even after kill", sizeof(kill_desc)); - } else if (level == VMPRESS_LEVEL_CRITICAL && events != 0) { - /* - * Device is too busy reclaiming memory which might lead to ANR. - * Critical level is triggered when PSI complete stall (all tasks are blocked because - * of the memory congestion) breaches the configured threshold. - */ - kill_reason = NOT_RESPONDING; - strncpy(kill_desc, "device is not responding", sizeof(kill_desc)); - } else if (swap_is_low && thrashing > thrashing_limit_pct) { - /* Page cache is thrashing while swap is low */ - kill_reason = LOW_SWAP_AND_THRASHING; - snprintf(kill_desc, sizeof(kill_desc), "device is low on swap (%" PRId64 - "kB < %" PRId64 "kB) and thrashing (%" PRId64 "%%)", - mi.field.free_swap * page_k, swap_low_threshold * page_k, thrashing); - } else if (swap_is_low && wmark < WMARK_HIGH) { - /* Both free memory and swap are low */ - kill_reason = LOW_MEM_AND_SWAP; - snprintf(kill_desc, sizeof(kill_desc), "%s watermark is breached and swap is low (%" - PRId64 "kB < %" PRId64 "kB)", wmark > WMARK_LOW ? "min" : "low", - mi.field.free_swap * page_k, swap_low_threshold * page_k); - } else if (wmark < WMARK_HIGH && thrashing > thrashing_limit) { - /* Page cache is thrashing while memory is low */ - kill_reason = LOW_MEM_AND_THRASHING; - snprintf(kill_desc, sizeof(kill_desc), "%s watermark is breached and thrashing (%" - PRId64 "%%)", wmark > WMARK_LOW ? "min" : "low", thrashing); - cut_thrashing_limit = true; - /* Do not kill perceptible apps because of thrashing */ - min_score_adj = PERCEPTIBLE_APP_ADJ; - } else if (reclaim == DIRECT_RECLAIM && thrashing > thrashing_limit) { - /* Page cache is thrashing while in direct reclaim (mostly happens on lowram devices) */ - kill_reason = DIRECT_RECL_AND_THRASHING; - snprintf(kill_desc, sizeof(kill_desc), "device is in direct reclaim and thrashing (%" - PRId64 "%%)", thrashing); - cut_thrashing_limit = true; - /* Do not kill perceptible apps because of thrashing */ - min_score_adj = PERCEPTIBLE_APP_ADJ; - } - - /* Kill a process if necessary */ - if (kill_reason != NONE) { - int pages_freed = find_and_kill_process(min_score_adj, kill_reason, kill_desc, &mi, - &curr_tm); - if (pages_freed > 0) { - killing = true; - if (cut_thrashing_limit) { - /* - * Cut thrasing limit by thrashing_limit_decay_pct percentage of the current - * thrashing limit until the system stops thrashing. - */ - thrashing_limit = (thrashing_limit * (100 - thrashing_limit_decay_pct)) / 100; - } - } - } - -no_kill: - /* Do not poll if kernel supports pidfd waiting */ - if (is_waiting_for_kill()) { - /* Pause polling if we are waiting for process death notification */ - poll_params->update = POLLING_PAUSE; - return; - } - - /* - * Start polling after initial PSI event; - * extend polling while device is in direct reclaim or process is being killed; - * do not extend when kswapd reclaims because that might go on for a long time - * without causing memory pressure - */ - if (events || killing || reclaim == DIRECT_RECLAIM) { - poll_params->update = POLLING_START; - } - - /* Decide the polling interval */ - if (swap_is_low || killing) { - /* Fast polling during and after a kill or when swap is low */ - poll_params->polling_interval_ms = PSI_POLL_PERIOD_SHORT_MS; - } else { - /* By default use long intervals */ - poll_params->polling_interval_ms = PSI_POLL_PERIOD_LONG_MS; - } -} - -static void mp_event_common(int data, uint32_t events, struct polling_params *poll_params) { - int ret; - unsigned long long evcount; - int64_t mem_usage, memsw_usage; - int64_t mem_pressure; - enum vmpressure_level lvl; - union meminfo mi; - struct zoneinfo zi; - struct timespec curr_tm; - static unsigned long kill_skip_count = 0; - enum vmpressure_level level = (enum vmpressure_level)data; - long other_free = 0, other_file = 0; - int min_score_adj; - int minfree = 0; - static struct reread_data mem_usage_file_data = { - .filename = MEMCG_MEMORY_USAGE, - .fd = -1, - }; - static struct reread_data memsw_usage_file_data = { - .filename = MEMCG_MEMORYSW_USAGE, - .fd = -1, - }; - - if (debug_process_killing) { - ALOGI("%s memory pressure event is triggered", level_name[level]); - } - - if (!use_psi_monitors) { - /* - * Check all event counters from low to critical - * and upgrade to the highest priority one. By reading - * eventfd we also reset the event counters. - */ - for (lvl = VMPRESS_LEVEL_LOW; lvl < VMPRESS_LEVEL_COUNT; lvl++) { - if (mpevfd[lvl] != -1 && - TEMP_FAILURE_RETRY(read(mpevfd[lvl], - &evcount, sizeof(evcount))) > 0 && - evcount > 0 && lvl > level) { - level = lvl; - } - } - } - - /* Start polling after initial PSI event */ - if (use_psi_monitors && events) { - /* Override polling params only if current event is more critical */ - if (!poll_params->poll_handler || data > poll_params->poll_handler->data) { - poll_params->polling_interval_ms = PSI_POLL_PERIOD_SHORT_MS; - poll_params->update = POLLING_START; - } - } - - if (clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm) != 0) { - ALOGE("Failed to get current time"); - return; - } - - if (kill_timeout_ms && get_time_diff_ms(&last_kill_tm, &curr_tm) < kill_timeout_ms) { - /* - * If we're within the no-kill timeout, see if there's pending reclaim work - * from the last killed process. If so, skip killing for now. - */ - if (is_kill_pending()) { - kill_skip_count++; - return; - } - /* - * Process is dead, stop waiting. This has no effect if pidfds are supported and - * death notification already caused waiting to stop. - */ - stop_wait_for_proc_kill(true); - } else { - /* - * Killing took longer than no-kill timeout. Stop waiting for the last process - * to die because we are ready to kill again. - */ - stop_wait_for_proc_kill(false); - } - - if (kill_skip_count > 0) { - ALOGI("%lu memory pressure events were skipped after a kill!", - kill_skip_count); - kill_skip_count = 0; - } - - if (meminfo_parse(&mi) < 0 || zoneinfo_parse(&zi) < 0) { - ALOGE("Failed to get free memory!"); - return; - } - - if (use_minfree_levels) { - int i; - - other_free = mi.field.nr_free_pages - zi.totalreserve_pages; - if (mi.field.nr_file_pages > (mi.field.shmem + mi.field.unevictable + mi.field.swap_cached)) { - other_file = (mi.field.nr_file_pages - mi.field.shmem - - mi.field.unevictable - mi.field.swap_cached); - } else { - other_file = 0; - } - - min_score_adj = OOM_SCORE_ADJ_MAX + 1; - for (i = 0; i < lowmem_targets_size; i++) { - minfree = lowmem_minfree[i]; - if (other_free < minfree && other_file < minfree) { - min_score_adj = lowmem_adj[i]; - break; - } - } - - if (min_score_adj == OOM_SCORE_ADJ_MAX + 1) { - if (debug_process_killing) { - ALOGI("Ignore %s memory pressure event " - "(free memory=%ldkB, cache=%ldkB, limit=%ldkB)", - level_name[level], other_free * page_k, other_file * page_k, - (long)lowmem_minfree[lowmem_targets_size - 1] * page_k); - } - return; - } - - goto do_kill; - } - - if (level == VMPRESS_LEVEL_LOW) { - record_low_pressure_levels(&mi); - } - - if (level_oomadj[level] > OOM_SCORE_ADJ_MAX) { - /* Do not monitor this pressure level */ - return; - } - - if ((mem_usage = get_memory_usage(&mem_usage_file_data)) < 0) { - goto do_kill; - } - if ((memsw_usage = get_memory_usage(&memsw_usage_file_data)) < 0) { - goto do_kill; - } - - // Calculate percent for swappinness. - mem_pressure = (mem_usage * 100) / memsw_usage; - - if (enable_pressure_upgrade && level != VMPRESS_LEVEL_CRITICAL) { - // We are swapping too much. - if (mem_pressure < upgrade_pressure) { - level = upgrade_level(level); - if (debug_process_killing) { - ALOGI("Event upgraded to %s", level_name[level]); - } - } - } - - // If we still have enough swap space available, check if we want to - // ignore/downgrade pressure events. - if (mi.field.free_swap >= - mi.field.total_swap * swap_free_low_percentage / 100) { - // If the pressure is larger than downgrade_pressure lmk will not - // kill any process, since enough memory is available. - if (mem_pressure > downgrade_pressure) { - if (debug_process_killing) { - ALOGI("Ignore %s memory pressure", level_name[level]); - } - return; - } else if (level == VMPRESS_LEVEL_CRITICAL && mem_pressure > upgrade_pressure) { - if (debug_process_killing) { - ALOGI("Downgrade critical memory pressure"); - } - // Downgrade event, since enough memory available. - level = downgrade_level(level); - } - } - -do_kill: - if (low_ram_device) { - /* For Go devices kill only one task */ - if (find_and_kill_process(level_oomadj[level], -1, NULL, &mi, &curr_tm) == 0) { - if (debug_process_killing) { - ALOGI("Nothing to kill"); - } - } - } else { - int pages_freed; - static struct timespec last_report_tm; - static unsigned long report_skip_count = 0; - - if (!use_minfree_levels) { - /* Free up enough memory to downgrate the memory pressure to low level */ - if (mi.field.nr_free_pages >= low_pressure_mem.max_nr_free_pages) { - if (debug_process_killing) { - ALOGI("Ignoring pressure since more memory is " - "available (%" PRId64 ") than watermark (%" PRId64 ")", - mi.field.nr_free_pages, low_pressure_mem.max_nr_free_pages); - } - return; - } - min_score_adj = level_oomadj[level]; - } - - pages_freed = find_and_kill_process(min_score_adj, -1, NULL, &mi, &curr_tm); - - if (pages_freed == 0) { - /* Rate limit kill reports when nothing was reclaimed */ - if (get_time_diff_ms(&last_report_tm, &curr_tm) < FAIL_REPORT_RLIMIT_MS) { - report_skip_count++; - return; - } - } - - /* Log whenever we kill or when report rate limit allows */ - if (use_minfree_levels) { - ALOGI("Reclaimed %ldkB, cache(%ldkB) and " - "free(%" PRId64 "kB)-reserved(%" PRId64 "kB) below min(%ldkB) for oom_adj %d", - pages_freed * page_k, - other_file * page_k, mi.field.nr_free_pages * page_k, - zi.totalreserve_pages * page_k, - minfree * page_k, min_score_adj); - } else { - ALOGI("Reclaimed %ldkB at oom_adj %d", - pages_freed * page_k, min_score_adj); - } - - if (report_skip_count > 0) { - ALOGI("Suppressed %lu failed kill reports", report_skip_count); - report_skip_count = 0; - } - - last_report_tm = curr_tm; - } - if (is_waiting_for_kill()) { - /* pause polling if we are waiting for process death notification */ - poll_params->update = POLLING_PAUSE; - } -} - -static bool init_mp_psi(enum vmpressure_level level, bool use_new_strategy) { - int fd; - - /* Do not register a handler if threshold_ms is not set */ - if (!psi_thresholds[level].threshold_ms) { - return true; - } - - fd = init_psi_monitor(psi_thresholds[level].stall_type, - psi_thresholds[level].threshold_ms * US_PER_MS, - PSI_WINDOW_SIZE_MS * US_PER_MS); - - if (fd < 0) { - return false; - } - - vmpressure_hinfo[level].handler = use_new_strategy ? mp_event_psi : mp_event_common; - vmpressure_hinfo[level].data = level; - if (register_psi_monitor(epollfd, fd, &vmpressure_hinfo[level]) < 0) { - destroy_psi_monitor(fd); - return false; - } - maxevents++; - mpevfd[level] = fd; - - return true; -} - -static void destroy_mp_psi(enum vmpressure_level level) { - int fd = mpevfd[level]; - - if (unregister_psi_monitor(epollfd, fd) < 0) { - ALOGE("Failed to unregister psi monitor for %s memory pressure; errno=%d", - level_name[level], errno); - } - destroy_psi_monitor(fd); - mpevfd[level] = -1; -} - -static bool init_psi_monitors() { - /* - * When PSI is used on low-ram devices or on high-end devices without memfree levels - * use new kill strategy based on zone watermarks, free swap and thrashing stats - */ - bool use_new_strategy = - property_get_bool("ro.lmk.use_new_strategy", low_ram_device || !use_minfree_levels); - - /* In default PSI mode override stall amounts using system properties */ - if (use_new_strategy) { - /* Do not use low pressure level */ - psi_thresholds[VMPRESS_LEVEL_LOW].threshold_ms = 0; - psi_thresholds[VMPRESS_LEVEL_MEDIUM].threshold_ms = psi_partial_stall_ms; - psi_thresholds[VMPRESS_LEVEL_CRITICAL].threshold_ms = psi_complete_stall_ms; - } - - if (!init_mp_psi(VMPRESS_LEVEL_LOW, use_new_strategy)) { - return false; - } - if (!init_mp_psi(VMPRESS_LEVEL_MEDIUM, use_new_strategy)) { - destroy_mp_psi(VMPRESS_LEVEL_LOW); - return false; - } - if (!init_mp_psi(VMPRESS_LEVEL_CRITICAL, use_new_strategy)) { - destroy_mp_psi(VMPRESS_LEVEL_MEDIUM); - destroy_mp_psi(VMPRESS_LEVEL_LOW); - return false; - } - return true; -} - -static bool init_mp_common(enum vmpressure_level level) { - int mpfd; - int evfd; - int evctlfd; - char buf[256]; - struct epoll_event epev; - int ret; - int level_idx = (int)level; - const char *levelstr = level_name[level_idx]; - - /* gid containing AID_SYSTEM required */ - mpfd = open(MEMCG_SYSFS_PATH "memory.pressure_level", O_RDONLY | O_CLOEXEC); - if (mpfd < 0) { - ALOGI("No kernel memory.pressure_level support (errno=%d)", errno); - goto err_open_mpfd; - } - - evctlfd = open(MEMCG_SYSFS_PATH "cgroup.event_control", O_WRONLY | O_CLOEXEC); - if (evctlfd < 0) { - ALOGI("No kernel memory cgroup event control (errno=%d)", errno); - goto err_open_evctlfd; - } - - evfd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); - if (evfd < 0) { - ALOGE("eventfd failed for level %s; errno=%d", levelstr, errno); - goto err_eventfd; - } - - ret = snprintf(buf, sizeof(buf), "%d %d %s", evfd, mpfd, levelstr); - if (ret >= (ssize_t)sizeof(buf)) { - ALOGE("cgroup.event_control line overflow for level %s", levelstr); - goto err; - } - - ret = TEMP_FAILURE_RETRY(write(evctlfd, buf, strlen(buf) + 1)); - if (ret == -1) { - ALOGE("cgroup.event_control write failed for level %s; errno=%d", - levelstr, errno); - goto err; - } - - epev.events = EPOLLIN; - /* use data to store event level */ - vmpressure_hinfo[level_idx].data = level_idx; - vmpressure_hinfo[level_idx].handler = mp_event_common; - epev.data.ptr = (void *)&vmpressure_hinfo[level_idx]; - ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, evfd, &epev); - if (ret == -1) { - ALOGE("epoll_ctl for level %s failed; errno=%d", levelstr, errno); - goto err; - } - maxevents++; - mpevfd[level] = evfd; - close(evctlfd); - return true; - -err: - close(evfd); -err_eventfd: - close(evctlfd); -err_open_evctlfd: - close(mpfd); -err_open_mpfd: - return false; -} - -static void kernel_event_handler(int data __unused, uint32_t events __unused, - struct polling_params *poll_params __unused) { - kpoll_info.handler(kpoll_info.poll_fd); -} - -static int init(void) { - static struct event_handler_info kernel_poll_hinfo = { 0, kernel_event_handler }; - struct reread_data file_data = { - .filename = ZONEINFO_PATH, - .fd = -1, - }; - struct epoll_event epev; - int pidfd; - int i; - int ret; - - page_k = sysconf(_SC_PAGESIZE); - if (page_k == -1) - page_k = PAGE_SIZE; - page_k /= 1024; - - epollfd = epoll_create(MAX_EPOLL_EVENTS); - if (epollfd == -1) { - ALOGE("epoll_create failed (errno=%d)", errno); - return -1; - } - - // mark data connections as not connected - for (int i = 0; i < MAX_DATA_CONN; i++) { - data_sock[i].sock = -1; - } - - ctrl_sock.sock = android_get_control_socket("lmkd"); - if (ctrl_sock.sock < 0) { - ALOGE("get lmkd control socket failed"); - return -1; - } - - ret = listen(ctrl_sock.sock, MAX_DATA_CONN); - if (ret < 0) { - ALOGE("lmkd control socket listen failed (errno=%d)", errno); - return -1; - } - - epev.events = EPOLLIN; - ctrl_sock.handler_info.handler = ctrl_connect_handler; - epev.data.ptr = (void *)&(ctrl_sock.handler_info); - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, ctrl_sock.sock, &epev) == -1) { - ALOGE("epoll_ctl for lmkd control socket failed (errno=%d)", errno); - return -1; - } - maxevents++; - - has_inkernel_module = !access(INKERNEL_MINFREE_PATH, W_OK); - use_inkernel_interface = has_inkernel_module; - - if (use_inkernel_interface) { - ALOGI("Using in-kernel low memory killer interface"); - if (init_poll_kernel(&kpoll_info)) { - epev.events = EPOLLIN; - epev.data.ptr = (void*)&kernel_poll_hinfo; - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, kpoll_info.poll_fd, &epev) != 0) { - ALOGE("epoll_ctl for lmk events failed (errno=%d)", errno); - close(kpoll_info.poll_fd); - kpoll_info.poll_fd = -1; - } else { - maxevents++; - } - } - } else { - /* Try to use psi monitor first if kernel has it */ - use_psi_monitors = property_get_bool("ro.lmk.use_psi", true) && - init_psi_monitors(); - /* Fall back to vmpressure */ - if (!use_psi_monitors && - (!init_mp_common(VMPRESS_LEVEL_LOW) || - !init_mp_common(VMPRESS_LEVEL_MEDIUM) || - !init_mp_common(VMPRESS_LEVEL_CRITICAL))) { - ALOGE("Kernel does not support memory pressure events or in-kernel low memory killer"); - return -1; - } - if (use_psi_monitors) { - ALOGI("Using psi monitors for memory pressure detection"); - } else { - ALOGI("Using vmpressure for memory pressure detection"); - } - } - - for (i = 0; i <= ADJTOSLOT(OOM_SCORE_ADJ_MAX); i++) { - procadjslot_list[i].next = &procadjslot_list[i]; - procadjslot_list[i].prev = &procadjslot_list[i]; - } - - memset(killcnt_idx, KILLCNT_INVALID_IDX, sizeof(killcnt_idx)); - - /* - * Read zoneinfo as the biggest file we read to create and size the initial - * read buffer and avoid memory re-allocations during memory pressure - */ - if (reread_file(&file_data) == NULL) { - ALOGE("Failed to read %s: %s", file_data.filename, strerror(errno)); - } - - /* check if kernel supports pidfd_open syscall */ - pidfd = TEMP_FAILURE_RETRY(sys_pidfd_open(getpid(), 0)); - if (pidfd < 0) { - pidfd_supported = (errno != ENOSYS); - } else { - pidfd_supported = true; - close(pidfd); - } - ALOGI("Process polling is %s", pidfd_supported ? "supported" : "not supported" ); - - return 0; -} - -static void call_handler(struct event_handler_info* handler_info, - struct polling_params *poll_params, uint32_t events) { - struct timespec curr_tm; - - handler_info->handler(handler_info->data, events, poll_params); - clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm); - poll_params->last_poll_tm = curr_tm; - - switch (poll_params->update) { - case POLLING_START: - /* - * Poll for the duration of PSI_WINDOW_SIZE_MS after the - * initial PSI event because psi events are rate-limited - * at one per sec. - */ - poll_params->poll_start_tm = curr_tm; - poll_params->poll_handler = handler_info; - break; - case POLLING_STOP: - poll_params->poll_handler = NULL; - break; - case POLLING_PAUSE: - poll_params->paused_handler = handler_info; - poll_params->poll_handler = NULL; - break; - case POLLING_RESUME: - poll_params->poll_start_tm = curr_tm; - poll_params->poll_handler = poll_params->paused_handler; - break; - case POLLING_DO_NOT_CHANGE: - if (get_time_diff_ms(&poll_params->poll_start_tm, &curr_tm) > PSI_WINDOW_SIZE_MS) { - /* Polled for the duration of PSI window, time to stop */ - poll_params->poll_handler = NULL; - } - /* WARNING: skipping the rest of the function */ - return; - } - poll_params->update = POLLING_DO_NOT_CHANGE; -} - -static void mainloop(void) { - struct event_handler_info* handler_info; - struct polling_params poll_params; - struct timespec curr_tm; - struct epoll_event *evt; - long delay = -1; - - poll_params.poll_handler = NULL; - poll_params.update = POLLING_DO_NOT_CHANGE; - - while (1) { - struct epoll_event events[maxevents]; - int nevents; - int i; - - if (poll_params.poll_handler) { - bool poll_now; - - clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm); - if (poll_params.poll_handler == poll_params.paused_handler) { - /* - * Just transitioned into POLLING_RESUME. Reset paused_handler - * and poll immediately - */ - poll_params.paused_handler = NULL; - poll_now = true; - nevents = 0; - } else { - /* Calculate next timeout */ - delay = get_time_diff_ms(&poll_params.last_poll_tm, &curr_tm); - delay = (delay < poll_params.polling_interval_ms) ? - poll_params.polling_interval_ms - delay : poll_params.polling_interval_ms; - - /* Wait for events until the next polling timeout */ - nevents = epoll_wait(epollfd, events, maxevents, delay); - - /* Update current time after wait */ - clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm); - poll_now = (get_time_diff_ms(&poll_params.last_poll_tm, &curr_tm) >= - poll_params.polling_interval_ms); - } - if (poll_now) { - call_handler(poll_params.poll_handler, &poll_params, 0); - } - } else { - /* Wait for events with no timeout */ - nevents = epoll_wait(epollfd, events, maxevents, -1); - } - - if (nevents == -1) { - if (errno == EINTR) - continue; - ALOGE("epoll_wait failed (errno=%d)", errno); - continue; - } - - /* - * First pass to see if any data socket connections were dropped. - * Dropped connection should be handled before any other events - * to deallocate data connection and correctly handle cases when - * connection gets dropped and reestablished in the same epoll cycle. - * In such cases it's essential to handle connection closures first. - */ - for (i = 0, evt = &events[0]; i < nevents; ++i, evt++) { - if ((evt->events & EPOLLHUP) && evt->data.ptr) { - ALOGI("lmkd data connection dropped"); - handler_info = (struct event_handler_info*)evt->data.ptr; - ctrl_data_close(handler_info->data); - } - } - - /* Second pass to handle all other events */ - for (i = 0, evt = &events[0]; i < nevents; ++i, evt++) { - if (evt->events & EPOLLERR) { - ALOGD("EPOLLERR on event #%d", i); - } - if (evt->events & EPOLLHUP) { - /* This case was handled in the first pass */ - continue; - } - if (evt->data.ptr) { - handler_info = (struct event_handler_info*)evt->data.ptr; - call_handler(handler_info, &poll_params, evt->events); - } - } - } -} - -int main(int argc __unused, char **argv __unused) { - struct sched_param param = { - .sched_priority = 1, - }; - - /* By default disable low level vmpressure events */ - level_oomadj[VMPRESS_LEVEL_LOW] = - property_get_int32("ro.lmk.low", OOM_SCORE_ADJ_MAX + 1); - level_oomadj[VMPRESS_LEVEL_MEDIUM] = - property_get_int32("ro.lmk.medium", 800); - level_oomadj[VMPRESS_LEVEL_CRITICAL] = - property_get_int32("ro.lmk.critical", 0); - debug_process_killing = property_get_bool("ro.lmk.debug", false); - - /* By default disable upgrade/downgrade logic */ - enable_pressure_upgrade = - property_get_bool("ro.lmk.critical_upgrade", false); - upgrade_pressure = - (int64_t)property_get_int32("ro.lmk.upgrade_pressure", 100); - downgrade_pressure = - (int64_t)property_get_int32("ro.lmk.downgrade_pressure", 100); - kill_heaviest_task = - property_get_bool("ro.lmk.kill_heaviest_task", false); - low_ram_device = property_get_bool("ro.config.low_ram", false); - kill_timeout_ms = - (unsigned long)property_get_int32("ro.lmk.kill_timeout_ms", 0); - use_minfree_levels = - property_get_bool("ro.lmk.use_minfree_levels", false); - per_app_memcg = - property_get_bool("ro.config.per_app_memcg", low_ram_device); - swap_free_low_percentage = clamp(0, 100, property_get_int32("ro.lmk.swap_free_low_percentage", - low_ram_device ? DEF_LOW_SWAP_LOWRAM : DEF_LOW_SWAP)); - psi_partial_stall_ms = property_get_int32("ro.lmk.psi_partial_stall_ms", - low_ram_device ? DEF_PARTIAL_STALL_LOWRAM : DEF_PARTIAL_STALL); - psi_complete_stall_ms = property_get_int32("ro.lmk.psi_complete_stall_ms", - DEF_COMPLETE_STALL); - thrashing_limit_pct = max(0, property_get_int32("ro.lmk.thrashing_limit", - low_ram_device ? DEF_THRASHING_LOWRAM : DEF_THRASHING)); - thrashing_limit_decay_pct = clamp(0, 100, property_get_int32("ro.lmk.thrashing_limit_decay", - low_ram_device ? DEF_THRASHING_DECAY_LOWRAM : DEF_THRASHING_DECAY)); - - ctx = create_android_logger(KILLINFO_LOG_TAG); - - statslog_init(); - - if (!init()) { - if (!use_inkernel_interface) { - /* - * MCL_ONFAULT pins pages as they fault instead of loading - * everything immediately all at once. (Which would be bad, - * because as of this writing, we have a lot of mapped pages we - * never use.) Old kernels will see MCL_ONFAULT and fail with - * EINVAL; we ignore this failure. - * - * N.B. read the man page for mlockall. MCL_CURRENT | MCL_ONFAULT - * pins ⊆ MCL_CURRENT, converging to just MCL_CURRENT as we fault - * in pages. - */ - /* CAP_IPC_LOCK required */ - if (mlockall(MCL_CURRENT | MCL_FUTURE | MCL_ONFAULT) && (errno != EINVAL)) { - ALOGW("mlockall failed %s", strerror(errno)); - } - - /* CAP_NICE required */ - if (sched_setscheduler(0, SCHED_FIFO, ¶m)) { - ALOGW("set SCHED_FIFO failed %s", strerror(errno)); - } - } - - mainloop(); - } - - statslog_destroy(); - - android_log_destroy(&ctx); - - ALOGI("exiting"); - return 0; -} diff --git a/lmkd/lmkd.rc b/lmkd/lmkd.rc deleted file mode 100644 index 982a188fc..000000000 --- a/lmkd/lmkd.rc +++ /dev/null @@ -1,8 +0,0 @@ -service lmkd /system/bin/lmkd - class core - user lmkd - group lmkd system readproc - capabilities DAC_OVERRIDE KILL IPC_LOCK SYS_NICE SYS_RESOURCE - critical - socket lmkd seqpacket+passcred 0660 system system - writepid /dev/cpuset/system-background/tasks diff --git a/lmkd/statslog.c b/lmkd/statslog.c deleted file mode 100644 index c0fd6df83..000000000 --- a/lmkd/statslog.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright 2018 Google, Inc - * - * 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 -#include -#include -#include -#include -#include -#include - -#ifdef LMKD_LOG_STATS - -#define LINE_MAX 128 -#define STRINGIFY(x) STRINGIFY_INTERNAL(x) -#define STRINGIFY_INTERNAL(x) #x - -static bool enable_stats_log; -static android_log_context log_ctx; - -struct proc { - int pid; - char taskname[LINE_MAX]; - struct proc* pidhash_next; -}; - -#define PIDHASH_SZ 1024 -static struct proc** pidhash = NULL; -#define pid_hashfn(x) ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1)) - -static int64_t getElapsedRealTimeNs() { - struct timespec t; - t.tv_sec = t.tv_nsec = 0; - clock_gettime(CLOCK_BOOTTIME, &t); - return (int64_t)t.tv_sec * 1000000000LL + t.tv_nsec; -} - -void statslog_init() { - enable_stats_log = property_get_bool("ro.lmk.log_stats", false); - - if (enable_stats_log) { - log_ctx = create_android_logger(kStatsEventTag); - } -} - -void statslog_destroy() { - if (log_ctx) { - android_log_destroy(&log_ctx); - } -} - -/** - * Logs the change in LMKD state which is used as start/stop boundaries for logging - * LMK_KILL_OCCURRED event. - * Code: LMK_STATE_CHANGED = 54 - */ -int -stats_write_lmk_state_changed(int32_t code, int32_t state) { - int ret = -EINVAL; - - if (!enable_stats_log) { - return ret; - } - - assert(log_ctx != NULL); - if (!log_ctx) { - return ret; - } - - reset_log_context(log_ctx); - - if ((ret = android_log_write_int64(log_ctx, getElapsedRealTimeNs())) < 0) { - return ret; - } - - if ((ret = android_log_write_int32(log_ctx, code)) < 0) { - return ret; - } - - if ((ret = android_log_write_int32(log_ctx, state)) < 0) { - return ret; - } - - return write_to_logger(log_ctx, LOG_ID_STATS); -} - -static struct proc* pid_lookup(int pid) { - struct proc* procp; - - if (!pidhash) return NULL; - - for (procp = pidhash[pid_hashfn(pid)]; procp && procp->pid != pid; procp = procp->pidhash_next) - ; - - return procp; -} - -/** - * Logs the event when LMKD kills a process to reduce memory pressure. - * Code: LMK_KILL_OCCURRED = 51 - */ -int -stats_write_lmk_kill_occurred(int32_t code, int32_t uid, char const* process_name, - int32_t oom_score, int32_t min_oom_score, int tasksize, - struct memory_stat *mem_st) { - int ret = -EINVAL; - if (!enable_stats_log) { - return ret; - } - if (!log_ctx) { - return ret; - } - reset_log_context(log_ctx); - - if ((ret = android_log_write_int64(log_ctx, getElapsedRealTimeNs())) < 0) { - return ret; - } - - if ((ret = android_log_write_int32(log_ctx, code)) < 0) { - return ret; - } - - if ((ret = android_log_write_int32(log_ctx, uid)) < 0) { - return ret; - } - - if ((ret = android_log_write_string8(log_ctx, (process_name == NULL) ? "" : process_name)) < 0) { - return ret; - } - - if ((ret = android_log_write_int32(log_ctx, oom_score)) < 0) { - return ret; - } - - if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->pgfault : -1)) < 0) { - return ret; - } - - if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->pgmajfault : -1)) < 0) { - return ret; - } - - if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->rss_in_bytes - : tasksize * BYTES_IN_KILOBYTE)) < 0) { - return ret; - } - - if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->cache_in_bytes : -1)) < 0) { - return ret; - } - - if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->swap_in_bytes : -1)) < 0) { - return ret; - } - - if ((ret = android_log_write_int64(log_ctx, mem_st ? mem_st->process_start_time_ns - : -1)) < 0) { - return ret; - } - - if ((ret = android_log_write_int32(log_ctx, min_oom_score)) < 0) { - return ret; - } - - return write_to_logger(log_ctx, LOG_ID_STATS); -} - -static int stats_write_lmk_kill_occurred_pid(int32_t code, int32_t uid, int pid, - int32_t oom_score, int32_t min_oom_score, int tasksize, - struct memory_stat *mem_st) { - struct proc* proc = pid_lookup(pid); - if (!proc) return -EINVAL; - - return stats_write_lmk_kill_occurred(code, uid, proc->taskname, oom_score, min_oom_score, - tasksize, mem_st); -} - -static void memory_stat_parse_line(char* line, struct memory_stat* mem_st) { - char key[LINE_MAX + 1]; - int64_t value; - - sscanf(line, "%" STRINGIFY(LINE_MAX) "s %" SCNd64 "", key, &value); - - if (strcmp(key, "total_") < 0) { - return; - } - - if (!strcmp(key, "total_pgfault")) - mem_st->pgfault = value; - else if (!strcmp(key, "total_pgmajfault")) - mem_st->pgmajfault = value; - else if (!strcmp(key, "total_rss")) - mem_st->rss_in_bytes = value; - else if (!strcmp(key, "total_cache")) - mem_st->cache_in_bytes = value; - else if (!strcmp(key, "total_swap")) - mem_st->swap_in_bytes = value; -} - -static int memory_stat_from_cgroup(struct memory_stat* mem_st, int pid, uid_t uid) { - FILE *fp; - char buf[PATH_MAX]; - - snprintf(buf, sizeof(buf), MEMCG_PROCESS_MEMORY_STAT_PATH, uid, pid); - - fp = fopen(buf, "r"); - - if (fp == NULL) { - return -1; - } - - while (fgets(buf, PAGE_SIZE, fp) != NULL) { - memory_stat_parse_line(buf, mem_st); - } - fclose(fp); - - return 0; -} - -static int memory_stat_from_procfs(struct memory_stat* mem_st, int pid) { - char path[PATH_MAX]; - char buffer[PROC_STAT_BUFFER_SIZE]; - int fd, ret; - - snprintf(path, sizeof(path), PROC_STAT_FILE_PATH, pid); - if ((fd = open(path, O_RDONLY | O_CLOEXEC)) < 0) { - return -1; - } - - ret = read(fd, buffer, sizeof(buffer)); - if (ret < 0) { - close(fd); - return -1; - } - close(fd); - - // field 10 is pgfault - // field 12 is pgmajfault - // field 22 is starttime - // field 24 is rss_in_pages - int64_t pgfault = 0, pgmajfault = 0, starttime = 0, rss_in_pages = 0; - if (sscanf(buffer, - "%*u %*s %*s %*d %*d %*d %*d %*d %*d %" SCNd64 " %*d " - "%" SCNd64 " %*d %*u %*u %*d %*d %*d %*d %*d %*d " - "%" SCNd64 " %*d %" SCNd64 "", - &pgfault, &pgmajfault, &starttime, &rss_in_pages) != 4) { - return -1; - } - mem_st->pgfault = pgfault; - mem_st->pgmajfault = pgmajfault; - mem_st->rss_in_bytes = (rss_in_pages * PAGE_SIZE); - mem_st->process_start_time_ns = starttime * (NS_PER_SEC / sysconf(_SC_CLK_TCK)); - - return 0; -} - -struct memory_stat *stats_read_memory_stat(bool per_app_memcg, int pid, uid_t uid) { - static struct memory_stat mem_st = {}; - - if (!enable_stats_log) { - return NULL; - } - - if (per_app_memcg) { - if (memory_stat_from_cgroup(&mem_st, pid, uid) == 0) { - return &mem_st; - } - } else { - if (memory_stat_from_procfs(&mem_st, pid) == 0) { - return &mem_st; - } - } - - return NULL; -} - -static void poll_kernel(int poll_fd) { - if (poll_fd == -1) { - // not waiting - return; - } - - while (1) { - char rd_buf[256]; - int bytes_read = - TEMP_FAILURE_RETRY(pread(poll_fd, (void*)rd_buf, sizeof(rd_buf), 0)); - if (bytes_read <= 0) break; - rd_buf[bytes_read] = '\0'; - - int64_t pid; - int64_t uid; - int64_t group_leader_pid; - int64_t rss_in_pages; - struct memory_stat mem_st = {}; - int16_t oom_score_adj; - int16_t min_score_adj; - int64_t starttime; - char* taskname = 0; - - int fields_read = sscanf(rd_buf, - "%" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 " %" SCNd64 - " %" SCNd64 " %" SCNd16 " %" SCNd16 " %" SCNd64 "\n%m[^\n]", - &pid, &uid, &group_leader_pid, &mem_st.pgfault, - &mem_st.pgmajfault, &rss_in_pages, &oom_score_adj, - &min_score_adj, &starttime, &taskname); - - /* only the death of the group leader process is logged */ - if (fields_read == 10 && group_leader_pid == pid) { - mem_st.process_start_time_ns = starttime * (NS_PER_SEC / sysconf(_SC_CLK_TCK)); - mem_st.rss_in_bytes = rss_in_pages * PAGE_SIZE; - stats_write_lmk_kill_occurred_pid(LMK_KILL_OCCURRED, uid, pid, oom_score_adj, - min_score_adj, 0, &mem_st); - } - - free(taskname); - } -} - -bool init_poll_kernel(struct kernel_poll_info *poll_info) { - if (!enable_stats_log) { - return false; - } - - poll_info->poll_fd = - TEMP_FAILURE_RETRY(open("/proc/lowmemorykiller", O_RDONLY | O_NONBLOCK | O_CLOEXEC)); - - if (poll_info->poll_fd < 0) { - ALOGE("kernel lmk event file could not be opened; errno=%d", errno); - return false; - } - poll_info->handler = poll_kernel; - - return true; -} - -static void proc_insert(struct proc* procp) { - if (!pidhash) { - pidhash = calloc(PIDHASH_SZ, sizeof(struct proc)); - } - - int hval = pid_hashfn(procp->pid); - procp->pidhash_next = pidhash[hval]; - pidhash[hval] = procp; -} - -void stats_remove_taskname(int pid, int poll_fd) { - if (!enable_stats_log || !pidhash) { - return; - } - - /* - * Perform an extra check before the pid is removed, after which it - * will be impossible for poll_kernel to get the taskname. poll_kernel() - * is potentially a long-running blocking function; however this method - * handles AMS requests but does not block AMS. - */ - poll_kernel(poll_fd); - - int hval = pid_hashfn(pid); - struct proc* procp; - struct proc* prevp; - - for (procp = pidhash[hval], prevp = NULL; procp && procp->pid != pid; - procp = procp->pidhash_next) - prevp = procp; - - if (!procp) - return; - - if (!prevp) - pidhash[hval] = procp->pidhash_next; - else - prevp->pidhash_next = procp->pidhash_next; - - free(procp); -} - -void stats_store_taskname(int pid, const char* taskname, int poll_fd) { - if (!enable_stats_log) { - return; - } - - struct proc* procp = pid_lookup(pid); - if (procp != NULL) { - if (strcmp(procp->taskname, taskname) == 0) { - return; - } - stats_remove_taskname(pid, poll_fd); - } - procp = malloc(sizeof(struct proc)); - procp->pid = pid; - strncpy(procp->taskname, taskname, LINE_MAX - 1); - procp->taskname[LINE_MAX - 1] = '\0'; - proc_insert(procp); -} - -void stats_purge_tasknames() { - if (!enable_stats_log || !pidhash) { - return; - } - - struct proc* procp; - struct proc* next; - int i; - for (i = 0; i < PIDHASH_SZ; i++) { - procp = pidhash[i]; - while (procp) { - next = procp->pidhash_next; - free(procp); - procp = next; - } - } - memset(pidhash, 0, PIDHASH_SZ * sizeof(struct proc)); -} - -#endif /* LMKD_LOG_STATS */ diff --git a/lmkd/statslog.h b/lmkd/statslog.h deleted file mode 100644 index a09c7dd91..000000000 --- a/lmkd/statslog.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2018 Google, Inc - * - * 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 _STATSLOG_H_ -#define _STATSLOG_H_ - -#include -#include -#include -#include -#include - -#include - -__BEGIN_DECLS - -struct memory_stat { - int64_t pgfault; - int64_t pgmajfault; - int64_t rss_in_bytes; - int64_t cache_in_bytes; - int64_t swap_in_bytes; - int64_t process_start_time_ns; -}; - -struct kernel_poll_info { - int poll_fd; - void (*handler)(int poll_fd); -}; - -/* - * These are defined in - * http://cs/android/frameworks/base/cmds/statsd/src/atoms.proto - */ -#define LMK_KILL_OCCURRED 51 -#define LMK_STATE_CHANGED 54 -#define LMK_STATE_CHANGE_START 1 -#define LMK_STATE_CHANGE_STOP 2 - -#ifdef LMKD_LOG_STATS - -/* - * The single event tag id for all stats logs. - * Keep this in sync with system/core/logcat/event.logtags - */ -const static int kStatsEventTag = 1937006964; - -void statslog_init(); - -void statslog_destroy(); - -#define MEMCG_PROCESS_MEMORY_STAT_PATH "/dev/memcg/apps/uid_%u/pid_%u/memory.stat" -#define PROC_STAT_FILE_PATH "/proc/%d/stat" -#define PROC_STAT_BUFFER_SIZE 1024 -#define BYTES_IN_KILOBYTE 1024 - -/** - * Logs the change in LMKD state which is used as start/stop boundaries for logging - * LMK_KILL_OCCURRED event. - * Code: LMK_STATE_CHANGED = 54 - */ -int -stats_write_lmk_state_changed(int32_t code, int32_t state); - -/** - * Logs the event when LMKD kills a process to reduce memory pressure. - * Code: LMK_KILL_OCCURRED = 51 - */ -int -stats_write_lmk_kill_occurred(int32_t code, int32_t uid, - char const* process_name, int32_t oom_score, int32_t min_oom_score, - int tasksize, struct memory_stat *mem_st); - -struct memory_stat *stats_read_memory_stat(bool per_app_memcg, int pid, uid_t uid); - -/** - * Registers a process taskname by pid, while it is still alive. - */ -void stats_store_taskname(int pid, const char* taskname, int poll_fd); - -/** - * Unregister all process tasknames. - */ -void stats_purge_tasknames(); - -/** - * Unregister a process taskname, e.g. after it has been killed. - */ -void stats_remove_taskname(int pid, int poll_fd); - -bool init_poll_kernel(struct kernel_poll_info *poll_info); - -#else /* LMKD_LOG_STATS */ - -static inline void statslog_init() {} -static inline void statslog_destroy() {} - -static inline int -stats_write_lmk_state_changed(int32_t code __unused, int32_t state __unused) { return -EINVAL; } - -static inline int -stats_write_lmk_kill_occurred(int32_t code __unused, int32_t uid __unused, - char const* process_name __unused, int32_t oom_score __unused, - int32_t min_oom_score __unused, int tasksize __unused, - struct memory_stat *mem_st __unused) { return -EINVAL; } - -static inline struct memory_stat *stats_read_memory_stat(bool per_app_memcg __unused, - int pid __unused, uid_t uid __unused) { return NULL; } - -static inline void stats_store_taskname(int pid __unused, const char* taskname __unused, - int poll_fd __unused) {} - -static inline void stats_purge_tasknames() {} - -static inline void stats_remove_taskname(int pid __unused, int poll_fd __unused) {} - -static inline bool init_poll_kernel(struct kernel_poll_info *poll_info __unused) { return false; } - -#endif /* LMKD_LOG_STATS */ - -__END_DECLS - -#endif /* _STATSLOG_H_ */ diff --git a/lmkd/tests/Android.bp b/lmkd/tests/Android.bp deleted file mode 100644 index 4e845fdeb..000000000 --- a/lmkd/tests/Android.bp +++ /dev/null @@ -1,41 +0,0 @@ -// 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: "lmkd_unit_test", - - shared_libs: [ - "libbase", - "liblog", - "libcutils", - ], - - static_libs: [ - "liblmkd_utils", - ], - - target: { - android: { - srcs: ["lmkd_test.cpp"], - }, - }, - - cflags: [ - "-Wall", - "-Wextra", - "-Werror", - ], - - compile_multilib: "first", -} diff --git a/lmkd/tests/lmkd_test.cpp b/lmkd/tests/lmkd_test.cpp deleted file mode 100644 index f54b25cf7..000000000 --- a/lmkd/tests/lmkd_test.cpp +++ /dev/null @@ -1,374 +0,0 @@ -/* - * 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 -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace android::base; - -#define INKERNEL_MINFREE_PATH "/sys/module/lowmemorykiller/parameters/minfree" -#define LMKDTEST_RESPAWN_FLAG "LMKDTEST_RESPAWN" - -#define LMKD_LOGCAT_MARKER "lowmemorykiller" -#define LMKD_KILL_MARKER_TEMPLATE LMKD_LOGCAT_MARKER ": Kill '%s'" -#define OOM_MARKER "Out of memory" -#define OOM_KILL_MARKER "Killed process" -#define MIN_LOG_SIZE 100 - -#define ONE_MB (1 << 20) - -/* Test constant parameters */ -#define OOM_ADJ_MAX 1000 -#define OOM_ADJ_MIN 0 -#define OOM_ADJ_STEP 100 -#define STEP_COUNT ((OOM_ADJ_MAX - OOM_ADJ_MIN) / OOM_ADJ_STEP + 1) - -#define ALLOC_STEP (ONE_MB) -#define ALLOC_DELAY 1000 - -/* Utility functions */ -std::string readCommand(const std::string& command) { - FILE* fp = popen(command.c_str(), "r"); - std::string content; - ReadFdToString(fileno(fp), &content); - pclose(fp); - return content; -} - -std::string readLogcat(const std::string& marker) { - std::string content = readCommand("logcat -d -b all"); - size_t pos = content.find(marker); - if (pos == std::string::npos) return ""; - content.erase(0, pos); - return content; -} - -bool writeFile(const std::string& file, const std::string& string) { - if (getuid() == static_cast(AID_ROOT)) { - return WriteStringToFile(string, file); - } - return string == readCommand( - "echo -n '" + string + "' | su root tee " + file + " 2>&1"); -} - -bool writeKmsg(const std::string& marker) { - return writeFile("/dev/kmsg", marker); -} - -std::string getTextAround(const std::string& text, size_t pos, - size_t lines_before, size_t lines_after) { - size_t start_pos = pos; - - // find start position - // move up lines_before number of lines - while (lines_before > 0 && - (start_pos = text.rfind('\n', start_pos)) != std::string::npos) { - lines_before--; - } - // move to the beginning of the line - start_pos = text.rfind('\n', start_pos); - start_pos = (start_pos == std::string::npos) ? 0 : start_pos + 1; - - // find end position - // move down lines_after number of lines - while (lines_after > 0 && - (pos = text.find('\n', pos)) != std::string::npos) { - pos++; - lines_after--; - } - return text.substr(start_pos, (pos == std::string::npos) ? - std::string::npos : pos - start_pos); -} - -bool getExecPath(std::string &path) { - char buf[PATH_MAX + 1]; - int ret = readlink("/proc/self/exe", buf, sizeof(buf) - 1); - if (ret < 0) { - return false; - } - buf[ret] = '\0'; - path = buf; - return true; -} - -/* Child synchronization primitives */ -#define STATE_INIT 0 -#define STATE_CHILD_READY 1 -#define STATE_PARENT_READY 2 - -struct state_sync { - pthread_mutex_t mutex; - pthread_cond_t condition; - int state; -}; - -struct state_sync * init_state_sync_obj() { - struct state_sync *ssync; - - ssync = (struct state_sync*)mmap(NULL, sizeof(struct state_sync), - PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0); - if (ssync == MAP_FAILED) { - return NULL; - } - - pthread_mutexattr_t mattr; - pthread_mutexattr_init(&mattr); - pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); - pthread_mutex_init(&ssync->mutex, &mattr); - - pthread_condattr_t cattr; - pthread_condattr_init(&cattr); - pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED); - pthread_cond_init(&ssync->condition, &cattr); - - ssync->state = STATE_INIT; - return ssync; -} - -void destroy_state_sync_obj(struct state_sync *ssync) { - pthread_cond_destroy(&ssync->condition); - pthread_mutex_destroy(&ssync->mutex); - munmap(ssync, sizeof(struct state_sync)); -} - -void signal_state(struct state_sync *ssync, int state) { - pthread_mutex_lock(&ssync->mutex); - ssync->state = state; - pthread_cond_signal(&ssync->condition); - pthread_mutex_unlock(&ssync->mutex); -} - -void wait_for_state(struct state_sync *ssync, int state) { - pthread_mutex_lock(&ssync->mutex); - while (ssync->state != state) { - pthread_cond_wait(&ssync->condition, &ssync->mutex); - } - pthread_mutex_unlock(&ssync->mutex); -} - -/* Memory allocation and data sharing */ -struct shared_data { - size_t allocated; - bool finished; - size_t total_size; - size_t step_size; - size_t step_delay; - int oomadj; -}; - -volatile void *gptr; -void add_pressure(struct shared_data *data) { - volatile void *ptr; - size_t allocated_size = 0; - - data->finished = false; - while (allocated_size < data->total_size) { - ptr = mmap(NULL, data->step_size, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, 0, 0); - if (ptr != MAP_FAILED) { - /* create ptr aliasing to prevent compiler optimizing the access */ - gptr = ptr; - /* make data non-zero */ - memset((void*)ptr, (int)(allocated_size + 1), data->step_size); - allocated_size += data->step_size; - data->allocated = allocated_size; - } - usleep(data->step_delay); - } - data->finished = (allocated_size >= data->total_size); -} - -/* Memory stress test main body */ -void runMemStressTest() { - struct shared_data *data; - struct state_sync *ssync; - int sock; - pid_t pid; - uid_t uid = getuid(); - - // check if in-kernel LMK driver is present - if (!access(INKERNEL_MINFREE_PATH, W_OK)) { - GTEST_LOG_(INFO) << "Must not have kernel lowmemorykiller driver," - << " terminating test"; - return; - } - - ASSERT_FALSE((sock = lmkd_connect()) < 0) - << "Failed to connect to lmkd process, err=" << strerror(errno); - - /* allocate shared memory to communicate params with a child */ - data = (struct shared_data*)mmap(NULL, sizeof(struct shared_data), - PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0); - ASSERT_FALSE(data == MAP_FAILED) << "Memory allocation failure"; - data->total_size = (size_t)-1; /* allocate until killed */ - data->step_size = ALLOC_STEP; - data->step_delay = ALLOC_DELAY; - - /* allocate state sync object */ - ASSERT_FALSE((ssync = init_state_sync_obj()) == NULL) - << "Memory allocation failure"; - - /* run the test gradually decreasing oomadj */ - data->oomadj = OOM_ADJ_MAX; - while (data->oomadj >= OOM_ADJ_MIN) { - ASSERT_FALSE((pid = fork()) < 0) - << "Failed to spawn a child process, err=" << strerror(errno); - if (pid != 0) { - /* Parent */ - struct lmk_procprio params; - /* wait for child to start and get ready */ - wait_for_state(ssync, STATE_CHILD_READY); - params.pid = pid; - params.uid = uid; - params.oomadj = data->oomadj; - ASSERT_FALSE(lmkd_register_proc(sock, ¶ms) < 0) - << "Failed to communicate with lmkd, err=" << strerror(errno); - // signal the child it can proceed - signal_state(ssync, STATE_PARENT_READY); - waitpid(pid, NULL, 0); - if (data->finished) { - GTEST_LOG_(INFO) << "Child [pid=" << pid << "] allocated " - << data->allocated / ONE_MB << "MB"; - } else { - GTEST_LOG_(INFO) << "Child [pid=" << pid << "] allocated " - << data->allocated / ONE_MB - << "MB before being killed"; - } - data->oomadj -= OOM_ADJ_STEP; - } else { - /* Child */ - pid = getpid(); - GTEST_LOG_(INFO) << "Child [pid=" << pid - << "] is running at oomadj=" - << data->oomadj; - data->allocated = 0; - data->finished = false; - ASSERT_FALSE(create_memcg(uid, pid) != 0) - << "Child [pid=" << pid << "] failed to create a cgroup"; - signal_state(ssync, STATE_CHILD_READY); - wait_for_state(ssync, STATE_PARENT_READY); - add_pressure(data); - /* should not reach here, child should be killed by OOM/LMK */ - FAIL() << "Child [pid=" << pid << "] was not killed"; - break; - } - } - destroy_state_sync_obj(ssync); - munmap(data, sizeof(struct shared_data)); - close(sock); -} - -TEST(lmkd, check_for_oom) { - // test requirements - // userdebug build - if (!__android_log_is_debuggable()) { - GTEST_LOG_(INFO) << "Must be userdebug build, terminating test"; - return; - } - - // if respawned test process then run the test and exit (no analysis) - if (getenv(LMKDTEST_RESPAWN_FLAG) != NULL) { - runMemStressTest(); - return; - } - - // Main test process - // mark the beginning of the test - std::string marker = StringPrintf( - "LMKD test start %lu\n", static_cast(time(nullptr))); - ASSERT_TRUE(writeKmsg(marker)); - - // get executable complete path - std::string test_path; - ASSERT_TRUE(getExecPath(test_path)); - - std::string test_output; - if (getuid() != static_cast(AID_ROOT)) { - // if not root respawn itself as root and capture output - std::string command = StringPrintf( - "%s=true su root %s 2>&1", LMKDTEST_RESPAWN_FLAG, - test_path.c_str()); - std::string test_output = readCommand(command); - GTEST_LOG_(INFO) << test_output; - } else { - // main test process is root, run the test - runMemStressTest(); - } - - // Analyze results - // capture logcat containind kernel logs - std::string logcat_out = readLogcat(marker); - - // 1. extract LMKD kills from logcat output, count kills - std::stringstream kill_logs; - int hit_count = 0; - size_t pos = 0; - marker = StringPrintf(LMKD_KILL_MARKER_TEMPLATE, test_path.c_str()); - - while (true) { - if ((pos = logcat_out.find(marker, pos)) != std::string::npos) { - kill_logs << getTextAround(logcat_out, pos, 0, 1); - pos += marker.length(); - hit_count++; - } else { - break; - } - } - GTEST_LOG_(INFO) << "====Logged kills====" << std::endl - << kill_logs.str(); - EXPECT_TRUE(hit_count == STEP_COUNT) << "Number of kills " << hit_count - << " is less than expected " - << STEP_COUNT; - - // 2. check kernel logs for OOM kills - pos = logcat_out.find(OOM_MARKER); - bool oom_detected = (pos != std::string::npos); - bool oom_kill_detected = (oom_detected && - logcat_out.find(OOM_KILL_MARKER, pos) != std::string::npos); - - EXPECT_FALSE(oom_kill_detected) << "OOM kill is detected!"; - if (oom_detected || oom_kill_detected) { - // capture logcat with logs around all OOMs - pos = 0; - while ((pos = logcat_out.find(OOM_MARKER, pos)) != std::string::npos) { - GTEST_LOG_(INFO) << "====Logs around OOM====" << std::endl - << getTextAround(logcat_out, pos, - MIN_LOG_SIZE / 2, MIN_LOG_SIZE / 2); - pos += strlen(OOM_MARKER); - } - } - - // output complete logcat with kernel (might get truncated) - GTEST_LOG_(INFO) << "====Complete logcat output====" << std::endl - << logcat_out; -} - From 876f64cb2f100a078b7ddfd9cc57103a0e456bc6 Mon Sep 17 00:00:00 2001 From: Muhammad Qureshi Date: Mon, 2 Dec 2019 20:27:46 -0800 Subject: [PATCH 035/388] Create libstatssocket_q Break up libstatssocket into libstatssocket_q and libstatssocket. libstatssocket_q is for Q Mainline modules. Bug: 145569088 Test: m -j Test: bit statsd_test:* Test: adb shell cmd stats print-logs && adb logcat "*:S statsd:*" Change-Id: I9d113b37640345ebad6aa269ab710db0d2179671 --- libstats/Android.bp | 44 +-- libstats/socket/Android.bp | 40 +++ libstats/{ => socket}/include/stats_event.h | 0 .../{ => socket}/include/stats_event_list.h | 0 libstats/{ => socket}/stats_event.c | 0 libstats/{ => socket}/stats_event_list.c | 0 libstats/{ => socket}/statsd_writer.c | 2 +- libstats/{ => socket}/statsd_writer.h | 0 libstats/socket_q/Android.bp | 40 +++ libstats/socket_q/include/stats_event_list.h | 250 +++++++++++++++ libstats/socket_q/stats_event_list.c | 239 +++++++++++++++ libstats/socket_q/statsd_writer.c | 285 ++++++++++++++++++ libstats/socket_q/statsd_writer.h | 45 +++ 13 files changed, 904 insertions(+), 41 deletions(-) create mode 100644 libstats/socket/Android.bp rename libstats/{ => socket}/include/stats_event.h (100%) rename libstats/{ => socket}/include/stats_event_list.h (100%) rename libstats/{ => socket}/stats_event.c (100%) rename libstats/{ => socket}/stats_event_list.c (100%) rename libstats/{ => socket}/statsd_writer.c (98%) rename libstats/{ => socket}/statsd_writer.h (100%) create mode 100644 libstats/socket_q/Android.bp create mode 100644 libstats/socket_q/include/stats_event_list.h create mode 100644 libstats/socket_q/stats_event_list.c create mode 100644 libstats/socket_q/statsd_writer.c create mode 100644 libstats/socket_q/statsd_writer.h diff --git a/libstats/Android.bp b/libstats/Android.bp index 0440087b2..89c4048b5 100644 --- a/libstats/Android.bp +++ b/libstats/Android.bp @@ -1,40 +1,4 @@ -// -// 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. -// - -// ========================================================== -// Native library to write stats log to statsd socket -// ========================================================== -cc_library { - name: "libstatssocket", - srcs: [ - "stats_event_list.c", - "statsd_writer.c", - "stats_event.c", - ], - host_supported: true, - cflags: [ - "-Wall", - "-Werror", - "-DLIBLOG_LOG_TAG=1006", - "-DWRITE_TO_STATSD=1", - "-DWRITE_TO_LOGD=0", - ], - export_include_dirs: ["include"], - shared_libs: [ - "libcutils", - "liblog", - ], -} +subdirs = [ + "socket", + "socket_q", +] diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp new file mode 100644 index 000000000..b7c07b624 --- /dev/null +++ b/libstats/socket/Android.bp @@ -0,0 +1,40 @@ +// +// 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. +// + +// ========================================================================= +// Native library to write stats log to statsd socket on Android R and later +// ========================================================================= +cc_library { + name: "libstatssocket", + srcs: [ + "stats_event.c", + "stats_event_list.c", + "statsd_writer.c", + ], + host_supported: true, + cflags: [ + "-Wall", + "-Werror", + "-DLIBLOG_LOG_TAG=1006", + "-DWRITE_TO_STATSD=1", + "-DWRITE_TO_LOGD=0", + ], + export_include_dirs: ["include"], + shared_libs: [ + "libcutils", + "liblog", + ], +} diff --git a/libstats/include/stats_event.h b/libstats/socket/include/stats_event.h similarity index 100% rename from libstats/include/stats_event.h rename to libstats/socket/include/stats_event.h diff --git a/libstats/include/stats_event_list.h b/libstats/socket/include/stats_event_list.h similarity index 100% rename from libstats/include/stats_event_list.h rename to libstats/socket/include/stats_event_list.h diff --git a/libstats/stats_event.c b/libstats/socket/stats_event.c similarity index 100% rename from libstats/stats_event.c rename to libstats/socket/stats_event.c diff --git a/libstats/stats_event_list.c b/libstats/socket/stats_event_list.c similarity index 100% rename from libstats/stats_event_list.c rename to libstats/socket/stats_event_list.c diff --git a/libstats/statsd_writer.c b/libstats/socket/statsd_writer.c similarity index 98% rename from libstats/statsd_writer.c rename to libstats/socket/statsd_writer.c index 073b67fa0..04d3b4644 100644 --- a/libstats/statsd_writer.c +++ b/libstats/socket/statsd_writer.c @@ -101,7 +101,7 @@ static int statsdOpen() { strcpy(un.sun_path, "/dev/socket/statsdw"); if (TEMP_FAILURE_RETRY( - connect(sock, (struct sockaddr*)&un, sizeof(struct sockaddr_un))) < 0) { + connect(sock, (struct sockaddr*)&un, sizeof(struct sockaddr_un))) < 0) { ret = -errno; switch (ret) { case -ENOTCONN: diff --git a/libstats/statsd_writer.h b/libstats/socket/statsd_writer.h similarity index 100% rename from libstats/statsd_writer.h rename to libstats/socket/statsd_writer.h diff --git a/libstats/socket_q/Android.bp b/libstats/socket_q/Android.bp new file mode 100644 index 000000000..6c0c65c23 --- /dev/null +++ b/libstats/socket_q/Android.bp @@ -0,0 +1,40 @@ +// +// 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. +// + +// ============================================================================ +// Native library to write stats log to statsd socket on Android Q and earlier. +// This library is only meant to be used by libstatssocket_compat. +// ============================================================================ +cc_library { + name: "libstatssocket_q", + srcs: [ + "stats_event_list.c", + "statsd_writer.c", + ], + host_supported: true, + cflags: [ + "-Wall", + "-Werror", + "-DLIBLOG_LOG_TAG=1006", + "-DWRITE_TO_STATSD=1", + "-DWRITE_TO_LOGD=0", + ], + export_include_dirs: ["include"], + shared_libs: [ + "libcutils", + "liblog", + ], +} diff --git a/libstats/socket_q/include/stats_event_list.h b/libstats/socket_q/include/stats_event_list.h new file mode 100644 index 000000000..b7ada0cfd --- /dev/null +++ b/libstats/socket_q/include/stats_event_list.h @@ -0,0 +1,250 @@ +/* + * 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. + */ + +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +void reset_log_context(android_log_context ctx); +int write_to_logger(android_log_context context, log_id_t id); +void note_log_drop(int error, int atom_tag); +void stats_log_close(); +int android_log_write_char_array(android_log_context ctx, const char* value, size_t len); +extern int (*write_to_statsd)(struct iovec* vec, size_t nr); + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +/** + * A copy of android_log_event_list class. + * + * android_log_event_list is going to be deprecated soon, so copy it here to + * avoid creating dependency on upstream code. TODO(b/78304629): Rewrite this + * code. + */ +class stats_event_list { + private: + android_log_context ctx; + int ret; + + stats_event_list(const stats_event_list&) = delete; + void operator=(const stats_event_list&) = delete; + + public: + explicit stats_event_list(int tag) : ret(0) { + ctx = create_android_logger(static_cast(tag)); + } + ~stats_event_list() { android_log_destroy(&ctx); } + + int close() { + int retval = android_log_destroy(&ctx); + if (retval < 0) { + ret = retval; + } + return retval; + } + + /* To allow above C calls to use this class as parameter */ + operator android_log_context() const { return ctx; } + + /* return errors or transmit status */ + int status() const { return ret; } + + int begin() { + int retval = android_log_write_list_begin(ctx); + if (retval < 0) { + ret = retval; + } + return ret; + } + int end() { + int retval = android_log_write_list_end(ctx); + if (retval < 0) { + ret = retval; + } + return ret; + } + + stats_event_list& operator<<(int32_t value) { + int retval = android_log_write_int32(ctx, value); + if (retval < 0) { + ret = retval; + } + return *this; + } + + stats_event_list& operator<<(uint32_t value) { + int retval = android_log_write_int32(ctx, static_cast(value)); + if (retval < 0) { + ret = retval; + } + return *this; + } + + stats_event_list& operator<<(bool value) { + int retval = android_log_write_int32(ctx, value ? 1 : 0); + if (retval < 0) { + ret = retval; + } + return *this; + } + + stats_event_list& operator<<(int64_t value) { + int retval = android_log_write_int64(ctx, value); + if (retval < 0) { + ret = retval; + } + return *this; + } + + stats_event_list& operator<<(uint64_t value) { + int retval = android_log_write_int64(ctx, static_cast(value)); + if (retval < 0) { + ret = retval; + } + return *this; + } + + stats_event_list& operator<<(const char* value) { + int retval = android_log_write_string8(ctx, value); + if (retval < 0) { + ret = retval; + } + return *this; + } + + stats_event_list& operator<<(const std::string& value) { + int retval = android_log_write_string8_len(ctx, value.data(), value.length()); + if (retval < 0) { + ret = retval; + } + return *this; + } + + stats_event_list& operator<<(float value) { + int retval = android_log_write_float32(ctx, value); + if (retval < 0) { + ret = retval; + } + return *this; + } + + int write(log_id_t id = LOG_ID_EVENTS) { + /* facilitate -EBUSY retry */ + if ((ret == -EBUSY) || (ret > 0)) { + ret = 0; + } + int retval = write_to_logger(ctx, id); + /* existing errors trump transmission errors */ + if (!ret) { + ret = retval; + } + return ret; + } + + /* + * Append methods removes any integer promotion + * confusion, and adds access to string with length. + * Append methods are also added for all types for + * convenience. + */ + + bool AppendInt(int32_t value) { + int retval = android_log_write_int32(ctx, value); + if (retval < 0) { + ret = retval; + } + return ret >= 0; + } + + bool AppendLong(int64_t value) { + int retval = android_log_write_int64(ctx, value); + if (retval < 0) { + ret = retval; + } + return ret >= 0; + } + + bool AppendString(const char* value) { + int retval = android_log_write_string8(ctx, value); + if (retval < 0) { + ret = retval; + } + return ret >= 0; + } + + bool AppendString(const char* value, size_t len) { + int retval = android_log_write_string8_len(ctx, value, len); + if (retval < 0) { + ret = retval; + } + return ret >= 0; + } + + bool AppendString(const std::string& value) { + int retval = android_log_write_string8_len(ctx, value.data(), value.length()); + if (retval < 0) { + ret = retval; + } + return ret; + } + + bool Append(const std::string& value) { + int retval = android_log_write_string8_len(ctx, value.data(), value.length()); + if (retval < 0) { + ret = retval; + } + return ret; + } + + bool AppendFloat(float value) { + int retval = android_log_write_float32(ctx, value); + if (retval < 0) { + ret = retval; + } + return ret >= 0; + } + + template + bool Append(Tvalue value) { + *this << value; + return ret >= 0; + } + + bool Append(const char* value, size_t len) { + int retval = android_log_write_string8_len(ctx, value, len); + if (retval < 0) { + ret = retval; + } + return ret >= 0; + } + + bool AppendCharArray(const char* value, size_t len) { + int retval = android_log_write_char_array(ctx, value, len); + if (retval < 0) { + ret = retval; + } + return ret >= 0; + } +}; + +#endif diff --git a/libstats/socket_q/stats_event_list.c b/libstats/socket_q/stats_event_list.c new file mode 100644 index 000000000..ae12cbeaa --- /dev/null +++ b/libstats/socket_q/stats_event_list.c @@ -0,0 +1,239 @@ +/* + * 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/stats_event_list.h" + +#include +#include +#include "statsd_writer.h" + +#define MAX_EVENT_PAYLOAD (LOGGER_ENTRY_MAX_PAYLOAD - sizeof(int32_t)) + +typedef struct { + uint32_t tag; + unsigned pos; /* Read/write position into buffer */ + unsigned count[ANDROID_MAX_LIST_NEST_DEPTH + 1]; /* Number of elements */ + unsigned list[ANDROID_MAX_LIST_NEST_DEPTH + 1]; /* pos for list counter */ + unsigned list_nest_depth; + unsigned len; /* Length or raw buffer. */ + bool overflow; + bool list_stop; /* next call decrement list_nest_depth and issue a stop */ + enum { + kAndroidLoggerRead = 1, + kAndroidLoggerWrite = 2, + } read_write_flag; + uint8_t storage[LOGGER_ENTRY_MAX_PAYLOAD]; +} android_log_context_internal; + +extern struct android_log_transport_write statsdLoggerWrite; + +static int __write_to_statsd_init(struct iovec* vec, size_t nr); +int (*write_to_statsd)(struct iovec* vec, size_t nr) = __write_to_statsd_init; + +// Similar to create_android_logger(), but instead of allocation a new buffer, +// this function resets the buffer for resuse. +void reset_log_context(android_log_context ctx) { + if (!ctx) { + return; + } + android_log_context_internal* context = (android_log_context_internal*)(ctx); + uint32_t tag = context->tag; + memset(context, 0, sizeof(android_log_context_internal)); + + context->tag = tag; + context->read_write_flag = kAndroidLoggerWrite; + size_t needed = sizeof(uint8_t) + sizeof(uint8_t); + if ((context->pos + needed) > MAX_EVENT_PAYLOAD) { + context->overflow = true; + } + /* Everything is a list */ + context->storage[context->pos + 0] = EVENT_TYPE_LIST; + context->list[0] = context->pos + 1; + context->pos += needed; +} + +int stats_write_list(android_log_context ctx) { + android_log_context_internal* context; + const char* msg; + ssize_t len; + + context = (android_log_context_internal*)(ctx); + if (!context || (kAndroidLoggerWrite != context->read_write_flag)) { + return -EBADF; + } + + if (context->list_nest_depth) { + return -EIO; + } + + /* NB: if there was overflow, then log is truncated. Nothing reported */ + context->storage[1] = context->count[0]; + len = context->len = context->pos; + msg = (const char*)context->storage; + /* it's not a list */ + if (context->count[0] <= 1) { + len -= sizeof(uint8_t) + sizeof(uint8_t); + if (len < 0) { + len = 0; + } + msg += sizeof(uint8_t) + sizeof(uint8_t); + } + + struct iovec vec[2]; + vec[0].iov_base = &context->tag; + vec[0].iov_len = sizeof(context->tag); + vec[1].iov_base = (void*)msg; + vec[1].iov_len = len; + return write_to_statsd(vec, 2); +} + +int write_to_logger(android_log_context ctx, log_id_t id) { + int retValue = 0; + + if (WRITE_TO_LOGD) { + retValue = android_log_write_list(ctx, id); + } + + if (WRITE_TO_STATSD) { + // log_event_list's cast operator is overloaded. + int ret = stats_write_list(ctx); + // In debugging phase, we may write to both logd and statsd. Prefer to + // return statsd socket write error code here. + if (ret < 0) { + retValue = ret; + } + } + + return retValue; +} + +void note_log_drop(int error, int tag) { + statsdLoggerWrite.noteDrop(error, tag); +} + +void stats_log_close() { + statsd_writer_init_lock(); + write_to_statsd = __write_to_statsd_init; + if (statsdLoggerWrite.close) { + (*statsdLoggerWrite.close)(); + } + statsd_writer_init_unlock(); +} + +/* log_init_lock assumed */ +static int __write_to_statsd_initialize_locked() { + if (!statsdLoggerWrite.open || ((*statsdLoggerWrite.open)() < 0)) { + if (statsdLoggerWrite.close) { + (*statsdLoggerWrite.close)(); + return -ENODEV; + } + } + return 1; +} + +static int __write_to_stats_daemon(struct iovec* vec, size_t nr) { + int save_errno; + struct timespec ts; + size_t len, i; + + for (len = i = 0; i < nr; ++i) { + len += vec[i].iov_len; + } + if (!len) { + return -EINVAL; + } + + save_errno = errno; +#if defined(__ANDROID__) + clock_gettime(CLOCK_REALTIME, &ts); +#else + struct timeval tv; + gettimeofday(&tv, NULL); + ts.tv_sec = tv.tv_sec; + ts.tv_nsec = tv.tv_usec * 1000; +#endif + + int ret = (int)(*statsdLoggerWrite.write)(&ts, vec, nr); + errno = save_errno; + return ret; +} + +static int __write_to_statsd_init(struct iovec* vec, size_t nr) { + int ret, save_errno = errno; + + statsd_writer_init_lock(); + + if (write_to_statsd == __write_to_statsd_init) { + ret = __write_to_statsd_initialize_locked(); + if (ret < 0) { + statsd_writer_init_unlock(); + errno = save_errno; + return ret; + } + + write_to_statsd = __write_to_stats_daemon; + } + + statsd_writer_init_unlock(); + + ret = write_to_statsd(vec, nr); + errno = save_errno; + return ret; +} + +static inline void copy4LE(uint8_t* buf, uint32_t val) { + buf[0] = val & 0xFF; + buf[1] = (val >> 8) & 0xFF; + buf[2] = (val >> 16) & 0xFF; + buf[3] = (val >> 24) & 0xFF; +} + +// Note: this function differs from android_log_write_string8_len in that the length passed in +// should be treated as actual length and not max length. +int android_log_write_char_array(android_log_context ctx, const char* value, size_t actual_len) { + size_t needed; + ssize_t len = actual_len; + android_log_context_internal* context; + + context = (android_log_context_internal*)ctx; + if (!context || (kAndroidLoggerWrite != context->read_write_flag)) { + return -EBADF; + } + if (context->overflow) { + return -EIO; + } + if (!value) { + value = ""; + len = 0; + } + needed = sizeof(uint8_t) + sizeof(int32_t) + len; + if ((context->pos + needed) > MAX_EVENT_PAYLOAD) { + /* Truncate string for delivery */ + len = MAX_EVENT_PAYLOAD - context->pos - 1 - sizeof(int32_t); + if (len <= 0) { + context->overflow = true; + return -EIO; + } + } + context->count[context->list_nest_depth]++; + context->storage[context->pos + 0] = EVENT_TYPE_STRING; + copy4LE(&context->storage[context->pos + 1], len); + if (len) { + memcpy(&context->storage[context->pos + 5], value, len); + } + context->pos += needed; + return len; +} diff --git a/libstats/socket_q/statsd_writer.c b/libstats/socket_q/statsd_writer.c new file mode 100644 index 000000000..04d3b4644 --- /dev/null +++ b/libstats/socket_q/statsd_writer.c @@ -0,0 +1,285 @@ +/* + * 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 "statsd_writer.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER; +static atomic_int dropped = 0; +static atomic_int log_error = 0; +static atomic_int atom_tag = 0; + +void statsd_writer_init_lock() { + /* + * If we trigger a signal handler in the middle of locked activity and the + * signal handler logs a message, we could get into a deadlock state. + */ + pthread_mutex_lock(&log_init_lock); +} + +int statd_writer_trylock() { + return pthread_mutex_trylock(&log_init_lock); +} + +void statsd_writer_init_unlock() { + pthread_mutex_unlock(&log_init_lock); +} + +static int statsdAvailable(); +static int statsdOpen(); +static void statsdClose(); +static int statsdWrite(struct timespec* ts, struct iovec* vec, size_t nr); +static void statsdNoteDrop(); + +struct android_log_transport_write statsdLoggerWrite = { + .name = "statsd", + .sock = -EBADF, + .available = statsdAvailable, + .open = statsdOpen, + .close = statsdClose, + .write = statsdWrite, + .noteDrop = statsdNoteDrop, +}; + +/* log_init_lock assumed */ +static int statsdOpen() { + int i, ret = 0; + + i = atomic_load(&statsdLoggerWrite.sock); + if (i < 0) { + int flags = SOCK_DGRAM; +#ifdef SOCK_CLOEXEC + flags |= SOCK_CLOEXEC; +#endif +#ifdef SOCK_NONBLOCK + flags |= SOCK_NONBLOCK; +#endif + int sock = TEMP_FAILURE_RETRY(socket(PF_UNIX, flags, 0)); + if (sock < 0) { + ret = -errno; + } else { + int sndbuf = 1 * 1024 * 1024; // set max send buffer size 1MB + socklen_t bufLen = sizeof(sndbuf); + // SO_RCVBUF does not have an effect on unix domain socket, but SO_SNDBUF does. + // Proceed to connect even setsockopt fails. + setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &sndbuf, bufLen); + struct sockaddr_un un; + memset(&un, 0, sizeof(struct sockaddr_un)); + un.sun_family = AF_UNIX; + strcpy(un.sun_path, "/dev/socket/statsdw"); + + if (TEMP_FAILURE_RETRY( + connect(sock, (struct sockaddr*)&un, sizeof(struct sockaddr_un))) < 0) { + ret = -errno; + switch (ret) { + case -ENOTCONN: + case -ECONNREFUSED: + case -ENOENT: + i = atomic_exchange(&statsdLoggerWrite.sock, ret); + /* FALLTHRU */ + default: + break; + } + close(sock); + } else { + ret = atomic_exchange(&statsdLoggerWrite.sock, sock); + if ((ret >= 0) && (ret != sock)) { + close(ret); + } + ret = 0; + } + } + } + + return ret; +} + +static void __statsdClose(int negative_errno) { + int sock = atomic_exchange(&statsdLoggerWrite.sock, negative_errno); + if (sock >= 0) { + close(sock); + } +} + +static void statsdClose() { + __statsdClose(-EBADF); +} + +static int statsdAvailable() { + if (atomic_load(&statsdLoggerWrite.sock) < 0) { + if (access("/dev/socket/statsdw", W_OK) == 0) { + return 0; + } + return -EBADF; + } + return 1; +} + +static void statsdNoteDrop(int error, int tag) { + atomic_fetch_add_explicit(&dropped, 1, memory_order_relaxed); + atomic_exchange_explicit(&log_error, error, memory_order_relaxed); + atomic_exchange_explicit(&atom_tag, tag, memory_order_relaxed); +} + +static int statsdWrite(struct timespec* ts, struct iovec* vec, size_t nr) { + ssize_t ret; + int sock; + static const unsigned headerLength = 1; + struct iovec newVec[nr + headerLength]; + android_log_header_t header; + size_t i, payloadSize; + + sock = atomic_load(&statsdLoggerWrite.sock); + if (sock < 0) switch (sock) { + case -ENOTCONN: + case -ECONNREFUSED: + case -ENOENT: + break; + default: + return -EBADF; + } + /* + * struct { + * // what we provide to socket + * android_log_header_t header; + * // caller provides + * union { + * struct { + * char prio; + * char payload[]; + * } string; + * struct { + * uint32_t tag + * char payload[]; + * } binary; + * }; + * }; + */ + + header.tid = gettid(); + header.realtime.tv_sec = ts->tv_sec; + header.realtime.tv_nsec = ts->tv_nsec; + + newVec[0].iov_base = (unsigned char*)&header; + newVec[0].iov_len = sizeof(header); + + // If we dropped events before, try to tell statsd. + if (sock >= 0) { + int32_t snapshot = atomic_exchange_explicit(&dropped, 0, memory_order_relaxed); + if (snapshot) { + android_log_event_long_t buffer; + header.id = LOG_ID_STATS; + // store the last log error in the tag field. This tag field is not used by statsd. + buffer.header.tag = atomic_load(&log_error); + buffer.payload.type = EVENT_TYPE_LONG; + // format: + // |atom_tag|dropped_count| + int64_t composed_long = atomic_load(&atom_tag); + // Send 2 int32's via an int64. + composed_long = ((composed_long << 32) | ((int64_t)snapshot)); + buffer.payload.data = composed_long; + + newVec[headerLength].iov_base = &buffer; + newVec[headerLength].iov_len = sizeof(buffer); + + ret = TEMP_FAILURE_RETRY(writev(sock, newVec, 2)); + if (ret != (ssize_t)(sizeof(header) + sizeof(buffer))) { + atomic_fetch_add_explicit(&dropped, snapshot, memory_order_relaxed); + } + } + } + + header.id = LOG_ID_STATS; + + for (payloadSize = 0, i = headerLength; i < nr + headerLength; i++) { + newVec[i].iov_base = vec[i - headerLength].iov_base; + payloadSize += newVec[i].iov_len = vec[i - headerLength].iov_len; + + if (payloadSize > LOGGER_ENTRY_MAX_PAYLOAD) { + newVec[i].iov_len -= payloadSize - LOGGER_ENTRY_MAX_PAYLOAD; + if (newVec[i].iov_len) { + ++i; + } + break; + } + } + + /* + * The write below could be lost, but will never block. + * + * ENOTCONN occurs if statsd has died. + * ENOENT occurs if statsd is not running and socket is missing. + * ECONNREFUSED occurs if we can not reconnect to statsd. + * EAGAIN occurs if statsd is overloaded. + */ + if (sock < 0) { + ret = sock; + } else { + ret = TEMP_FAILURE_RETRY(writev(sock, newVec, i)); + if (ret < 0) { + ret = -errno; + } + } + switch (ret) { + case -ENOTCONN: + case -ECONNREFUSED: + case -ENOENT: + if (statd_writer_trylock()) { + return ret; /* in a signal handler? try again when less stressed + */ + } + __statsdClose(ret); + ret = statsdOpen(); + statsd_writer_init_unlock(); + + if (ret < 0) { + return ret; + } + + ret = TEMP_FAILURE_RETRY(writev(atomic_load(&statsdLoggerWrite.sock), newVec, i)); + if (ret < 0) { + ret = -errno; + } + /* FALLTHRU */ + default: + break; + } + + if (ret > (ssize_t)sizeof(header)) { + ret -= sizeof(header); + } + + return ret; +} diff --git a/libstats/socket_q/statsd_writer.h b/libstats/socket_q/statsd_writer.h new file mode 100644 index 000000000..fe2d37cbc --- /dev/null +++ b/libstats/socket_q/statsd_writer.h @@ -0,0 +1,45 @@ +/* + * 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_STATS_LOG_STATS_WRITER_H +#define ANDROID_STATS_LOG_STATS_WRITER_H + +#include +#include +#include + +/** + * Internal lock should not be exposed. This is bad design. + * TODO: rewrite it in c++ code and encapsulate the functionality in a + * StatsdWriter class. + */ +void statsd_writer_init_lock(); +int statsd_writer_init_trylock(); +void statsd_writer_init_unlock(); + +struct android_log_transport_write { + const char* name; /* human name to describe the transport */ + atomic_int sock; + int (*available)(); /* Does not cause resources to be taken */ + int (*open)(); /* can be called multiple times, reusing current resources */ + void (*close)(); /* free up resources */ + /* write log to transport, returns number of bytes propagated, or -errno */ + int (*write)(struct timespec* ts, struct iovec* vec, size_t nr); + /* note one log drop */ + void (*noteDrop)(int error, int tag); +}; + +#endif // ANDROID_STATS_LOG_STATS_WRITER_H From f9b24aef5fe21e75f1bf2a3021debcd8b2dfd8b1 Mon Sep 17 00:00:00 2001 From: Muhammad Qureshi Date: Wed, 6 Nov 2019 15:15:23 -0800 Subject: [PATCH 036/388] Create stats_buffer_writer Move iovec* construction and noteLogLoss from stats_event_list to stats_buffer_writer.h. Expose write_buffer_to_statsd that takes in a byte array and writes it to the statsd socket. Currently exposed for StatsLog.write JNI call. This change also allows getting rid of stats_event_list once all clients have migrated to stats_event Bug: 145619049 Test: m -j libstatssocket Change-Id: I0048e392c2f5039eb70dacf4e91a43d3f32e8749 --- libstats/socket/Android.bp | 3 + libstats/socket/include/stats_buffer_writer.h | 29 ++++ libstats/socket/include/stats_event.h | 4 +- libstats/socket/include/stats_event_list.h | 4 +- libstats/socket/stats_buffer_writer.c | 130 ++++++++++++++++++ libstats/socket/stats_event.c | 10 +- libstats/socket/stats_event_list.c | 88 +----------- 7 files changed, 169 insertions(+), 99 deletions(-) create mode 100644 libstats/socket/include/stats_buffer_writer.h create mode 100644 libstats/socket/stats_buffer_writer.c diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index b7c07b624..beb009cbe 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -20,7 +20,10 @@ cc_library { name: "libstatssocket", srcs: [ + "stats_buffer_writer.c", "stats_event.c", + // TODO(b/145573568): Remove stats_event_list once stats_event + // migration is complete. "stats_event_list.c", "statsd_writer.c", ], diff --git a/libstats/socket/include/stats_buffer_writer.h b/libstats/socket/include/stats_buffer_writer.h new file mode 100644 index 000000000..de4a5e21d --- /dev/null +++ b/libstats/socket/include/stats_buffer_writer.h @@ -0,0 +1,29 @@ +/* + * 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 +#include + +#ifdef __cplusplus +extern "C" { +#endif // __CPLUSPLUS +void stats_log_close(); +int write_buffer_to_statsd(void* buffer, size_t size, uint32_t atomId); +#ifdef __cplusplus +} +#endif // __CPLUSPLUS diff --git a/libstats/socket/include/stats_event.h b/libstats/socket/include/stats_event.h index 89cb420bd..1760e7e12 100644 --- a/libstats/socket/include/stats_event.h +++ b/libstats/socket/include/stats_event.h @@ -76,7 +76,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif // __CPLUSPLUS struct stats_event; @@ -132,6 +132,6 @@ uint32_t stats_event_get_errors(struct stats_event* event); #ifdef __cplusplus } -#endif +#endif // __CPLUSPLUS #endif // ANDROID_STATS_LOG_STATS_EVENT_H diff --git a/libstats/socket/include/stats_event_list.h b/libstats/socket/include/stats_event_list.h index b7ada0cfd..7a26536d8 100644 --- a/libstats/socket/include/stats_event_list.h +++ b/libstats/socket/include/stats_event_list.h @@ -24,11 +24,9 @@ extern "C" { #endif void reset_log_context(android_log_context ctx); int write_to_logger(android_log_context context, log_id_t id); -void note_log_drop(int error, int atom_tag); +void note_log_drop(int error, int atomId); void stats_log_close(); int android_log_write_char_array(android_log_context ctx, const char* value, size_t len); -extern int (*write_to_statsd)(struct iovec* vec, size_t nr); - #ifdef __cplusplus } #endif diff --git a/libstats/socket/stats_buffer_writer.c b/libstats/socket/stats_buffer_writer.c new file mode 100644 index 000000000..c5c591d78 --- /dev/null +++ b/libstats/socket/stats_buffer_writer.c @@ -0,0 +1,130 @@ +/* + * 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 "include/stats_buffer_writer.h" +#ifdef __ANDROID__ +#include +#endif +#include +#include +#include +#include "statsd_writer.h" + +static const uint32_t kStatsEventTag = 1937006964; + +extern struct android_log_transport_write statsdLoggerWrite; + +static int __write_to_statsd_init(struct iovec* vec, size_t nr); +static int (*__write_to_statsd)(struct iovec* vec, size_t nr) = __write_to_statsd_init; + +void note_log_drop(int error, int atomId) { + statsdLoggerWrite.noteDrop(error, atomId); +} + +void stats_log_close() { + statsd_writer_init_lock(); + __write_to_statsd = __write_to_statsd_init; + if (statsdLoggerWrite.close) { + (*statsdLoggerWrite.close)(); + } + statsd_writer_init_unlock(); +} + +int write_buffer_to_statsd(void* buffer, size_t size, uint32_t atomId) { + int ret = 1; + +#ifdef __ANDROID__ + bool statsdEnabled = property_get_bool("ro.statsd.enable", true); +#else + bool statsdEnabled = false; +#endif + + if (statsdEnabled) { + struct iovec vecs[2]; + vecs[0].iov_base = (void*)&kStatsEventTag; + vecs[0].iov_len = sizeof(kStatsEventTag); + vecs[1].iov_base = buffer; + vecs[1].iov_len = size; + + ret = __write_to_statsd(vecs, 2); + + if (ret < 0) { + note_log_drop(ret, atomId); + } + } + + return ret; +} + +static int __write_to_stats_daemon(struct iovec* vec, size_t nr) { + int save_errno; + struct timespec ts; + size_t len, i; + + for (len = i = 0; i < nr; ++i) { + len += vec[i].iov_len; + } + if (!len) { + return -EINVAL; + } + + save_errno = errno; +#if defined(__ANDROID__) + clock_gettime(CLOCK_REALTIME, &ts); +#else + struct timeval tv; + gettimeofday(&tv, NULL); + ts.tv_sec = tv.tv_sec; + ts.tv_nsec = tv.tv_usec * 1000; +#endif + + int ret = (int)(*statsdLoggerWrite.write)(&ts, vec, nr); + errno = save_errno; + return ret; +} + +static int __write_to_statsd_initialize_locked() { + if (!statsdLoggerWrite.open || ((*statsdLoggerWrite.open)() < 0)) { + if (statsdLoggerWrite.close) { + (*statsdLoggerWrite.close)(); + return -ENODEV; + } + } + return 1; +} + +static int __write_to_statsd_init(struct iovec* vec, size_t nr) { + int ret, save_errno = errno; + + statsd_writer_init_lock(); + + if (__write_to_statsd == __write_to_statsd_init) { + ret = __write_to_statsd_initialize_locked(); + if (ret < 0) { + statsd_writer_init_unlock(); + errno = save_errno; + return ret; + } + + __write_to_statsd = __write_to_stats_daemon; + } + + statsd_writer_init_unlock(); + + ret = __write_to_statsd(vec, nr); + errno = save_errno; + return ret; +} diff --git a/libstats/socket/stats_event.c b/libstats/socket/stats_event.c index 35081dc3f..dfd587ada 100644 --- a/libstats/socket/stats_event.c +++ b/libstats/socket/stats_event.c @@ -18,7 +18,7 @@ #include #include #include -#include "include/stats_event_list.h" +#include "stats_buffer_writer.h" #define STATS_EVENT_TAG 1937006964 #define LOGGER_ENTRY_MAX_PAYLOAD 4068 @@ -323,11 +323,5 @@ void stats_event_build(struct stats_event* event) { void stats_event_write(struct stats_event* event) { stats_event_build(event); - // Prepare iovecs for write to statsd. - struct iovec vecs[2]; - vecs[0].iov_base = &event->tag; - vecs[0].iov_len = sizeof(event->tag); - vecs[1].iov_base = &event->buf; - vecs[1].iov_len = event->size; - write_to_statsd(vecs, 2); + write_buffer_to_statsd(&event->buf, event->size, event->atomId); } diff --git a/libstats/socket/stats_event_list.c b/libstats/socket/stats_event_list.c index ae12cbeaa..661a2237f 100644 --- a/libstats/socket/stats_event_list.c +++ b/libstats/socket/stats_event_list.c @@ -18,7 +18,7 @@ #include #include -#include "statsd_writer.h" +#include "stats_buffer_writer.h" #define MAX_EVENT_PAYLOAD (LOGGER_ENTRY_MAX_PAYLOAD - sizeof(int32_t)) @@ -38,11 +38,6 @@ typedef struct { uint8_t storage[LOGGER_ENTRY_MAX_PAYLOAD]; } android_log_context_internal; -extern struct android_log_transport_write statsdLoggerWrite; - -static int __write_to_statsd_init(struct iovec* vec, size_t nr); -int (*write_to_statsd)(struct iovec* vec, size_t nr) = __write_to_statsd_init; - // Similar to create_android_logger(), but instead of allocation a new buffer, // this function resets the buffer for resuse. void reset_log_context(android_log_context ctx) { @@ -92,12 +87,7 @@ int stats_write_list(android_log_context ctx) { msg += sizeof(uint8_t) + sizeof(uint8_t); } - struct iovec vec[2]; - vec[0].iov_base = &context->tag; - vec[0].iov_len = sizeof(context->tag); - vec[1].iov_base = (void*)msg; - vec[1].iov_len = len; - return write_to_statsd(vec, 2); + return write_buffer_to_statsd((void*)msg, len, 0); } int write_to_logger(android_log_context ctx, log_id_t id) { @@ -120,80 +110,6 @@ int write_to_logger(android_log_context ctx, log_id_t id) { return retValue; } -void note_log_drop(int error, int tag) { - statsdLoggerWrite.noteDrop(error, tag); -} - -void stats_log_close() { - statsd_writer_init_lock(); - write_to_statsd = __write_to_statsd_init; - if (statsdLoggerWrite.close) { - (*statsdLoggerWrite.close)(); - } - statsd_writer_init_unlock(); -} - -/* log_init_lock assumed */ -static int __write_to_statsd_initialize_locked() { - if (!statsdLoggerWrite.open || ((*statsdLoggerWrite.open)() < 0)) { - if (statsdLoggerWrite.close) { - (*statsdLoggerWrite.close)(); - return -ENODEV; - } - } - return 1; -} - -static int __write_to_stats_daemon(struct iovec* vec, size_t nr) { - int save_errno; - struct timespec ts; - size_t len, i; - - for (len = i = 0; i < nr; ++i) { - len += vec[i].iov_len; - } - if (!len) { - return -EINVAL; - } - - save_errno = errno; -#if defined(__ANDROID__) - clock_gettime(CLOCK_REALTIME, &ts); -#else - struct timeval tv; - gettimeofday(&tv, NULL); - ts.tv_sec = tv.tv_sec; - ts.tv_nsec = tv.tv_usec * 1000; -#endif - - int ret = (int)(*statsdLoggerWrite.write)(&ts, vec, nr); - errno = save_errno; - return ret; -} - -static int __write_to_statsd_init(struct iovec* vec, size_t nr) { - int ret, save_errno = errno; - - statsd_writer_init_lock(); - - if (write_to_statsd == __write_to_statsd_init) { - ret = __write_to_statsd_initialize_locked(); - if (ret < 0) { - statsd_writer_init_unlock(); - errno = save_errno; - return ret; - } - - write_to_statsd = __write_to_stats_daemon; - } - - statsd_writer_init_unlock(); - - ret = write_to_statsd(vec, nr); - errno = save_errno; - return ret; -} - static inline void copy4LE(uint8_t* buf, uint32_t val) { buf[0] = val & 0xFF; buf[1] = (val >> 8) & 0xFF; From c8ef71b4255aba984c9d32478606ed33010a3911 Mon Sep 17 00:00:00 2001 From: Muhammad Qureshi Date: Wed, 4 Dec 2019 08:17:25 -0800 Subject: [PATCH 037/388] Make stats_event write function parameters const Bug: 143968790 Test: bit statsd_test:* Change-Id: I2660cad5400a0e819c60b9caa706bb66ca2eef4f --- libstats/socket/include/stats_event.h | 6 +++--- libstats/socket/stats_event.c | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libstats/socket/include/stats_event.h b/libstats/socket/include/stats_event.h index 1760e7e12..6a33d543d 100644 --- a/libstats/socket/include/stats_event.h +++ b/libstats/socket/include/stats_event.h @@ -95,14 +95,14 @@ void stats_event_write_int64(struct stats_event* event, int64_t value); void stats_event_write_float(struct stats_event* event, float value); void stats_event_write_bool(struct stats_event* event, bool value); -void stats_event_write_byte_array(struct stats_event* event, uint8_t* buf, size_t numBytes); +void stats_event_write_byte_array(struct stats_event* event, const uint8_t* buf, size_t numBytes); // Buf must be null-terminated. void stats_event_write_string8(struct stats_event* event, const char* buf); // Tags must be null-terminated. -void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, - const char** tags, uint8_t numNodes); +void stats_event_write_attribution_chain(struct stats_event* event, const uint32_t* uids, + const char* const* tags, uint8_t numNodes); /* key_value_pair struct can be constructed as follows: * struct key_value_pair pair = {.key = key, .valueType = STRING_TYPE, diff --git a/libstats/socket/stats_event.c b/libstats/socket/stats_event.c index dfd587ada..ef887e3ea 100644 --- a/libstats/socket/stats_event.c +++ b/libstats/socket/stats_event.c @@ -132,7 +132,7 @@ static void append_float(struct stats_event* event, float value) { } } -static void append_byte_array(struct stats_event* event, uint8_t* buf, size_t size) { +static void append_byte_array(struct stats_event* event, const uint8_t* buf, size_t size) { if (!overflows(event, size)) { memcpy(&event->buf[event->size], buf, size); event->size += size; @@ -185,7 +185,7 @@ void stats_event_write_bool(struct stats_event* event, bool value) { append_bool(event, value); } -void stats_event_write_byte_array(struct stats_event* event, uint8_t* buf, size_t numBytes) { +void stats_event_write_byte_array(struct stats_event* event, const uint8_t* buf, size_t numBytes) { if (event->errors) return; start_field(event, BYTE_ARRAY_TYPE); @@ -202,8 +202,8 @@ void stats_event_write_string8(struct stats_event* event, const char* buf) { } // Tags are assumed to be encoded using UTF8 -void stats_event_write_attribution_chain(struct stats_event* event, uint32_t* uids, - const char** tags, uint8_t numNodes) { +void stats_event_write_attribution_chain(struct stats_event* event, const uint32_t* uids, + const char* const* tags, uint8_t numNodes) { if (numNodes > MAX_BYTE_VALUE) event->errors |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; if (event->errors) return; From c03d009697d44d58709d9dad91cc6088218214d7 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Thu, 21 Nov 2019 12:47:37 -0800 Subject: [PATCH 038/388] Native puller API: libstatspulled Create a new library for the native puller callback API. The library has 2 main interfaces: register_stats_pull_atom_callback, which is used to register a callback, and stats_pull_atom_callback_t, which is the callback for the puller. It also exposes pulled_stats_event_list, which is a struct wrapper around a vector of stats_event. Test: make libstatspull Bug: 142969725 Change-Id: I14fe4dc523d6f81fdeaa3fe6fad3e95aeecfe92e --- libstats/pull/Android.bp | 41 +++++ libstats/pull/OWNERS | 7 + .../pull/include/stats_pull_atom_callback.h | 46 ++++++ libstats/pull/stats_pull_atom_callback.cpp | 148 ++++++++++++++++++ 4 files changed, 242 insertions(+) create mode 100644 libstats/pull/Android.bp create mode 100644 libstats/pull/OWNERS create mode 100644 libstats/pull/include/stats_pull_atom_callback.h create mode 100644 libstats/pull/stats_pull_atom_callback.cpp diff --git a/libstats/pull/Android.bp b/libstats/pull/Android.bp new file mode 100644 index 000000000..9772da164 --- /dev/null +++ b/libstats/pull/Android.bp @@ -0,0 +1,41 @@ +// +// 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. +// + +// ========================================================== +// Native library to register a pull atom callback with statsd +// ========================================================== +cc_library_shared { + name: "libstatspull", + srcs: [ + ":statsd_aidl", + "stats_pull_atom_callback.cpp", + ], + cflags: [ + "-Wall", + "-Werror", + ], + export_include_dirs: ["include"], + shared_libs: [ + //TODO: use libbinder_ndk. + "libbinder", + "libstatssocket", + "libservices", + ], + static_libs: [ + "liblog", + "libutils", + ] +} diff --git a/libstats/pull/OWNERS b/libstats/pull/OWNERS new file mode 100644 index 000000000..7855774a7 --- /dev/null +++ b/libstats/pull/OWNERS @@ -0,0 +1,7 @@ +joeo@google.com +muhammadq@google.com +ruchirr@google.com +singhtejinder@google.com +tsaichristine@google.com +yaochen@google.com +yro@google.com diff --git a/libstats/pull/include/stats_pull_atom_callback.h b/libstats/pull/include/stats_pull_atom_callback.h new file mode 100644 index 000000000..ee69ea7a8 --- /dev/null +++ b/libstats/pull/include/stats_pull_atom_callback.h @@ -0,0 +1,46 @@ +/* + * 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 +#include + +#ifdef __cplusplus +extern "C" { +#endif +/* + * Metadata for registering a stats_pull_atom_callback. + * All fields are optional, and defaults will be used for unspecified fields. + */ +typedef struct pull_atom_metadata { + int64_t cool_down_ns; + int64_t timeout_ns; + int32_t* additive_fields; + int32_t additive_fields_size; +} pull_atom_metadata; + +typedef struct pulled_stats_event_list pulled_stats_event_list; + +typedef bool (*stats_pull_atom_callback_t)(int32_t atom_tag, pulled_stats_event_list* data, + const void* cookie); + +struct stats_event* add_stats_event_to_pull_data(pulled_stats_event_list* pull_data); +void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t* callback, + pull_atom_metadata* metadata, const void* cookie); + +#ifdef __cplusplus +} +#endif diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp new file mode 100644 index 000000000..f61d64627 --- /dev/null +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -0,0 +1,148 @@ +/* + * 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 +#include + +#include +#include + +#include +#include +#include +#include +#include +#include "include/stats_pull_atom_callback.h" + +struct pulled_stats_event_list { + std::vector data; +}; + +struct stats_event* add_stats_event_to_pull_data(pulled_stats_event_list* pull_data) { + struct stats_event* event = stats_event_obtain(); + pull_data->data.push_back(event); + return event; +} + +static const int64_t DEFAULT_COOL_DOWN_NS = 1000000000LL; // 1 second. +static const int64_t DEFAULT_TIMEOUT_NS = 10000000000LL; // 10 seconds. + +class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { + public: + StatsPullAtomCallbackInternal(const stats_pull_atom_callback_t* callback, const void* cookie, + const int64_t coolDownNs, const int64_t timeoutNs, + const std::vector additiveFields) + : mCallback(callback), + mCookie(cookie), + mCoolDownNs(coolDownNs), + mTimeoutNs(timeoutNs), + mAdditiveFields(additiveFields) {} + + ::android::binder::Status onPullAtom( + int32_t atomTag, + const ::android::sp<::android::os::IPullAtomResultReceiver>& resultReceiver) override { + pulled_stats_event_list statsEventList; + bool success = (*mCallback)(atomTag, &statsEventList, mCookie); + std::vector output; + // TODO convert stats_event into parcelable stats_event. + resultReceiver->pullFinished(atomTag, success, output); + for (int i = 0; i < statsEventList.data.size(); i++) { + stats_event_release(statsEventList.data[i]); + } + return android::binder::Status::ok(); + } + + const int64_t& getCoolDownNs() const { return mCoolDownNs; } + const int64_t& getTimeoutNs() const { return mTimeoutNs; } + const std::vector& getAdditiveFields() const { return mAdditiveFields; } + + private: + const stats_pull_atom_callback_t* mCallback; + const void* mCookie; + const int64_t mCoolDownNs; + const int64_t mTimeoutNs; + const std::vector mAdditiveFields; +}; + +static std::mutex pullAtomMutex; +static android::sp sStatsd = nullptr; + +static std::map> mPullers; +static android::sp getStatsServiceLocked(); + +class StatsDeathRecipient : public android::IBinder::DeathRecipient { + public: + StatsDeathRecipient() = default; + ~StatsDeathRecipient() override = default; + + // android::IBinder::DeathRecipient override: + void binderDied(const android::wp& /* who */) override { + std::lock_guard lock(pullAtomMutex); + if (sStatsd) { + sStatsd = nullptr; + } + android::sp statsService = getStatsServiceLocked(); + if (statsService == nullptr) { + return; + } + for (auto it : mPullers) { + statsService->registerNativePullAtomCallback(it.first, it.second->getCoolDownNs(), + it.second->getTimeoutNs(), + it.second->getAdditiveFields(), it.second); + } + } +}; + +static android::sp statsDeathRecipient = new StatsDeathRecipient(); + +static android::sp getStatsServiceLocked() { + if (!sStatsd) { + // Fetch statsd. + const android::sp binder = + android::defaultServiceManager()->checkService(android::String16("stats")); + if (!binder) { + return nullptr; + } + binder->linkToDeath(statsDeathRecipient); + sStatsd = android::interface_cast(binder); + } + return sStatsd; +} + +void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t* callback, + pull_atom_metadata* metadata, void* cookie) { + int64_t coolDownNs = metadata == nullptr ? DEFAULT_COOL_DOWN_NS : metadata->cool_down_ns; + int64_t timeoutNs = metadata == nullptr ? DEFAULT_TIMEOUT_NS : metadata->timeout_ns; + + std::vector additiveFields; + if (metadata != nullptr && metadata->additive_fields != nullptr) { + additiveFields.assign(metadata->additive_fields, + metadata->additive_fields + metadata->additive_fields_size); + } + + std::lock_guard lg(pullAtomMutex); + const android::sp statsService = getStatsServiceLocked(); + if (statsService == nullptr) { + // Error - statsd not available + return; + } + + android::sp callbackBinder = new StatsPullAtomCallbackInternal( + callback, cookie, coolDownNs, timeoutNs, additiveFields); + mPullers[atom_tag] = callbackBinder; + statsService->registerNativePullAtomCallback(atom_tag, coolDownNs, timeoutNs, additiveFields, + callbackBinder); +} From c1ecb983c4dec7c2210962f8b1ceed010b8c7e16 Mon Sep 17 00:00:00 2001 From: Muhammad Qureshi Date: Wed, 4 Dec 2019 16:49:46 -0800 Subject: [PATCH 039/388] Remove libstats/Android.bp subdirs is not needed Test: m -j Change-Id: Ia7675fdf2e9a3a19bc52396ccbcc551556958803 --- libstats/Android.bp | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 libstats/Android.bp diff --git a/libstats/Android.bp b/libstats/Android.bp deleted file mode 100644 index 89c4048b5..000000000 --- a/libstats/Android.bp +++ /dev/null @@ -1,4 +0,0 @@ -subdirs = [ - "socket", - "socket_q", -] From 9ecc986bb75bf81578cac7413934be1b2c02f05f Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Fri, 6 Dec 2019 12:42:27 -0800 Subject: [PATCH 040/388] Use StatEventParcel in libstatspull Test: m -j128 libstatspull Change-Id: Ice031f38cdde8a505a887359f6c0cb3312046929 --- libstats/pull/Android.bp | 3 +++ libstats/pull/stats_pull_atom_callback.cpp | 20 ++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/libstats/pull/Android.bp b/libstats/pull/Android.bp index 9772da164..72eb0e969 100644 --- a/libstats/pull/Android.bp +++ b/libstats/pull/Android.bp @@ -19,6 +19,9 @@ // ========================================================== cc_library_shared { name: "libstatspull", + aidl: { + include_dirs: ["frameworks/base/core/java"], + }, srcs: [ ":statsd_aidl", "stats_pull_atom_callback.cpp", diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp index f61d64627..011ab7698 100644 --- a/libstats/pull/stats_pull_atom_callback.cpp +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include "include/stats_pull_atom_callback.h" @@ -56,9 +56,21 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { const ::android::sp<::android::os::IPullAtomResultReceiver>& resultReceiver) override { pulled_stats_event_list statsEventList; bool success = (*mCallback)(atomTag, &statsEventList, mCookie); - std::vector output; - // TODO convert stats_event into parcelable stats_event. - resultReceiver->pullFinished(atomTag, success, output); + + // Convert stats_events into StatsEventParcels. + std::vector parcels; + for (int i = 0; i < statsEventList.data.size(); i++) { + size_t size; + uint8_t* buffer = stats_event_get_buffer(statsEventList.data[i], &size); + + android::util::StatsEventParcel p; + // vector.assign() creates a copy, but this is inevitable unless + // stats_event.h/c uses a vector as opposed to a buffer. + p.buffer.assign(buffer, buffer + size); + parcels.push_back(std::move(p)); + } + + resultReceiver->pullFinished(atomTag, success, parcels); for (int i = 0; i < statsEventList.data.size(); i++) { stats_event_release(statsEventList.data[i]); } From 666510a0d4f7c80aaad432f3dc7ec6b0f08f4383 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Wed, 11 Dec 2019 14:46:14 -0800 Subject: [PATCH 041/388] Rename IStatsManager to IStatsd Bug: 146075178 Test: CTS/GTS tests Change-Id: I08f1b5c6f67c9e510dfaa7b50737c2720e177ad9 --- libstats/pull/stats_pull_atom_callback.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp index 011ab7698..177bbba44 100644 --- a/libstats/pull/stats_pull_atom_callback.cpp +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include #include "include/stats_pull_atom_callback.h" @@ -90,10 +90,10 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { }; static std::mutex pullAtomMutex; -static android::sp sStatsd = nullptr; +static android::sp sStatsd = nullptr; static std::map> mPullers; -static android::sp getStatsServiceLocked(); +static android::sp getStatsServiceLocked(); class StatsDeathRecipient : public android::IBinder::DeathRecipient { public: @@ -106,7 +106,7 @@ class StatsDeathRecipient : public android::IBinder::DeathRecipient { if (sStatsd) { sStatsd = nullptr; } - android::sp statsService = getStatsServiceLocked(); + android::sp statsService = getStatsServiceLocked(); if (statsService == nullptr) { return; } @@ -120,7 +120,7 @@ class StatsDeathRecipient : public android::IBinder::DeathRecipient { static android::sp statsDeathRecipient = new StatsDeathRecipient(); -static android::sp getStatsServiceLocked() { +static android::sp getStatsServiceLocked() { if (!sStatsd) { // Fetch statsd. const android::sp binder = @@ -129,7 +129,7 @@ static android::sp getStatsServiceLocked() { return nullptr; } binder->linkToDeath(statsDeathRecipient); - sStatsd = android::interface_cast(binder); + sStatsd = android::interface_cast(binder); } return sStatsd; } @@ -146,7 +146,7 @@ void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callbac } std::lock_guard lg(pullAtomMutex); - const android::sp statsService = getStatsServiceLocked(); + const android::sp statsService = getStatsServiceLocked(); if (statsService == nullptr) { // Error - statsd not available return; From 8822a0208f4e6e1918f886787fa6d727abc47ac9 Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Tue, 10 Dec 2019 18:46:23 -0800 Subject: [PATCH 042/388] StatsEventCompat StatsEventCompat is a wrapper library that toggles between the old logging scheme and the new logging scheme. It was designed particularly for the DNS Resolver module and should not be used by others. We will merge libstatspush_compat and libstatssocket_q in a future CL. Test: m libstatspush_compat Test: bit libstatspush_compat_test:* (passes on Q and R) Bug: 145534143 Change-Id: Idf35ccb6669798166475f08b2fbab40534b5db19 --- libstats/push_compat/Android.bp | 54 +++++ libstats/push_compat/StatsEventCompat.cpp | 221 ++++++++++++++++++ .../push_compat/include/StatsEventCompat.h | 71 ++++++ .../tests/StatsEventCompat_test.cpp | 38 +++ libstats/socket/Android.bp | 6 + libstats/socket/include/stats_event.h | 28 ++- libstats/socket/stats_event.c | 32 ++- 7 files changed, 442 insertions(+), 8 deletions(-) create mode 100644 libstats/push_compat/Android.bp create mode 100644 libstats/push_compat/StatsEventCompat.cpp create mode 100644 libstats/push_compat/include/StatsEventCompat.h create mode 100644 libstats/push_compat/tests/StatsEventCompat_test.cpp diff --git a/libstats/push_compat/Android.bp b/libstats/push_compat/Android.bp new file mode 100644 index 000000000..93539903a --- /dev/null +++ b/libstats/push_compat/Android.bp @@ -0,0 +1,54 @@ +// +// 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. +// + +// ========================================================================= +// Native library that toggles between the old and new statsd socket +// protocols. This library should only be used by DNS resolver or other +// native modules on Q that log pushed atoms to statsd. +// ========================================================================= +cc_defaults { + name: "libstatspush_compat_defaults", + srcs: ["StatsEventCompat.cpp"], + cflags: [ + "-Wall", + "-Werror", + ], + header_libs: ["libstatssocket_headers"], + static_libs: [ + "libbase", + "liblog", + "libstatssocket_q", + "libutils" + ], +} + +cc_library { + name: "libstatspush_compat", + defaults: ["libstatspush_compat_defaults"], + export_include_dirs: ["include"], + static_libs: ["libgtest_prod"], +} + +cc_test { + name: "libstatspush_compat_test", + defaults: ["libstatspush_compat_defaults"], + test_suites: ["device_tests"], + srcs: [ + "tests/StatsEventCompat_test.cpp", + ], + static_libs: ["libgmock"], +} + diff --git a/libstats/push_compat/StatsEventCompat.cpp b/libstats/push_compat/StatsEventCompat.cpp new file mode 100644 index 000000000..edfa070ed --- /dev/null +++ b/libstats/push_compat/StatsEventCompat.cpp @@ -0,0 +1,221 @@ +/* + * 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 "include/StatsEventCompat.h" +#include +#include +#include +#include +#include + +using android::base::GetProperty; + +const static int kStatsEventTag = 1937006964; + +/* Checking ro.build.version.release is fragile, as the release field is + * an opaque string without structural guarantees. However, testing confirms + * that on Q devices, the property is "10," and on R, it is "R." Until + * android_get_device_api_level() is updated, this is the only solution. + * + * TODO(b/146019024): migrate to android_get_device_api_level() + */ +const bool StatsEventCompat::mPlatformAtLeastR = + GetProperty("ro.build.version.codename", "") == "R" || + android_get_device_api_level() > __ANDROID_API_Q__; + +// definitions of static class variables +bool StatsEventCompat::mAttemptedLoad = false; +struct stats_event_api_table* StatsEventCompat::mStatsEventApi = nullptr; +std::mutex StatsEventCompat::mLoadLock; + +StatsEventCompat::StatsEventCompat() : mEventQ(kStatsEventTag) { + // guard loading because StatsEventCompat might be called from multithreaded + // environment + { + std::lock_guard lg(mLoadLock); + if (!mAttemptedLoad) { + void* handle = dlopen("libstatssocket.so", RTLD_NOW); + if (handle) { + mStatsEventApi = (struct stats_event_api_table*)dlsym(handle, "table"); + } else { + ALOGE("dlopen failed: %s\n", dlerror()); + } + } + mAttemptedLoad = true; + } + + if (mStatsEventApi) { + mEventR = mStatsEventApi->obtain(); + } else if (!mPlatformAtLeastR) { + mEventQ << android::elapsedRealtimeNano(); + } +} + +StatsEventCompat::~StatsEventCompat() { + if (mStatsEventApi) mStatsEventApi->release(mEventR); +} + +void StatsEventCompat::setAtomId(int32_t atomId) { + if (mStatsEventApi) { + mStatsEventApi->set_atom_id(mEventR, (uint32_t)atomId); + } else if (!mPlatformAtLeastR) { + mEventQ << atomId; + } +} + +void StatsEventCompat::writeInt32(int32_t value) { + if (mStatsEventApi) { + mStatsEventApi->write_int32(mEventR, value); + } else if (!mPlatformAtLeastR) { + mEventQ << value; + } +} + +void StatsEventCompat::writeInt64(int64_t value) { + if (mStatsEventApi) { + mStatsEventApi->write_int64(mEventR, value); + } else if (!mPlatformAtLeastR) { + mEventQ << value; + } +} + +void StatsEventCompat::writeFloat(float value) { + if (mStatsEventApi) { + mStatsEventApi->write_float(mEventR, value); + } else if (!mPlatformAtLeastR) { + mEventQ << value; + } +} + +void StatsEventCompat::writeBool(bool value) { + if (mStatsEventApi) { + mStatsEventApi->write_bool(mEventR, value); + } else if (!mPlatformAtLeastR) { + mEventQ << value; + } +} + +void StatsEventCompat::writeByteArray(const char* buffer, size_t length) { + if (mStatsEventApi) { + mStatsEventApi->write_byte_array(mEventR, (const uint8_t*)buffer, length); + } else if (!mPlatformAtLeastR) { + mEventQ.AppendCharArray(buffer, length); + } +} + +void StatsEventCompat::writeString(const char* value) { + if (value == nullptr) value = ""; + + if (mStatsEventApi) { + mStatsEventApi->write_string8(mEventR, value); + } else if (!mPlatformAtLeastR) { + mEventQ << value; + } +} + +void StatsEventCompat::writeAttributionChain(const int32_t* uids, size_t numUids, + const vector& tags) { + if (mStatsEventApi) { + mStatsEventApi->write_attribution_chain(mEventR, (const uint32_t*)uids, tags.data(), + (uint8_t)numUids); + } else if (!mPlatformAtLeastR) { + mEventQ.begin(); + for (size_t i = 0; i < numUids; i++) { + mEventQ.begin(); + mEventQ << uids[i]; + const char* tag = tags[i] ? tags[i] : ""; + mEventQ << tag; + mEventQ.end(); + } + mEventQ.end(); + } +} + +void StatsEventCompat::writeKeyValuePairs(const map& int32Map, + const map& int64Map, + const map& stringMap, + const map& floatMap) { + if (mStatsEventApi) { + vector pairs; + + for (const auto& it : int32Map) { + pairs.push_back({.key = it.first, .valueType = INT32_TYPE, .int32Value = it.second}); + } + for (const auto& it : int64Map) { + pairs.push_back({.key = it.first, .valueType = INT64_TYPE, .int64Value = it.second}); + } + for (const auto& it : stringMap) { + pairs.push_back({.key = it.first, .valueType = STRING_TYPE, .stringValue = it.second}); + } + for (const auto& it : floatMap) { + pairs.push_back({.key = it.first, .valueType = FLOAT_TYPE, .floatValue = it.second}); + } + + mStatsEventApi->write_key_value_pairs(mEventR, pairs.data(), (uint8_t)pairs.size()); + } + + else if (!mPlatformAtLeastR) { + mEventQ.begin(); + writeKeyValuePairMap(int32Map); + writeKeyValuePairMap(int64Map); + writeKeyValuePairMap(stringMap); + writeKeyValuePairMap(floatMap); + mEventQ.end(); + } +} + +template +void StatsEventCompat::writeKeyValuePairMap(const map& keyValuePairMap) { + for (const auto& it : keyValuePairMap) { + mEventQ.begin(); + mEventQ << it.first; + mEventQ << it.second; + mEventQ.end(); + } +} + +// explicitly specify which types we're going to use +template void StatsEventCompat::writeKeyValuePairMap(const map&); +template void StatsEventCompat::writeKeyValuePairMap(const map&); +template void StatsEventCompat::writeKeyValuePairMap(const map&); +template void StatsEventCompat::writeKeyValuePairMap(const map&); + +void StatsEventCompat::addBoolAnnotation(uint8_t annotationId, bool value) { + if (mStatsEventApi) mStatsEventApi->add_bool_annotation(mEventR, annotationId, value); + // Don't do anything if on Q. +} + +void StatsEventCompat::addInt32Annotation(uint8_t annotationId, int32_t value) { + if (mStatsEventApi) mStatsEventApi->add_int32_annotation(mEventR, annotationId, value); + // Don't do anything if on Q. +} + +int StatsEventCompat::writeToSocket() { + if (mStatsEventApi) { + mStatsEventApi->build(mEventR); + return mStatsEventApi->write(mEventR); + } + + if (!mPlatformAtLeastR) return mEventQ.write(LOG_ID_STATS); + + // We reach here only if we're on R, but libstatspush_compat was unable to + // be loaded using dlopen. + return -ENOLINK; +} + +bool StatsEventCompat::usesNewSchema() { + return mStatsEventApi != nullptr; +} diff --git a/libstats/push_compat/include/StatsEventCompat.h b/libstats/push_compat/include/StatsEventCompat.h new file mode 100644 index 000000000..a8cde681c --- /dev/null +++ b/libstats/push_compat/include/StatsEventCompat.h @@ -0,0 +1,71 @@ +/* + * 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 +#include +#include +#include +#include "stats_event.h" +#include "stats_event_list.h" + +using std::map; +using std::vector; + +class StatsEventCompat { + public: + StatsEventCompat(); + ~StatsEventCompat(); + + void setAtomId(int32_t atomId); + void writeInt32(int32_t value); + void writeInt64(int64_t value); + void writeFloat(float value); + void writeBool(bool value); + void writeByteArray(const char* buffer, size_t length); + void writeString(const char* value); + + // Pre-condition: numUids == tags.size() + void writeAttributionChain(const int32_t* uids, size_t numUids, + const vector& tags); + + void writeKeyValuePairs(const map& int32Map, const map& int64Map, + const map& stringMap, + const map& floatMap); + + void addBoolAnnotation(uint8_t annotationId, bool value); + void addInt32Annotation(uint8_t annotationId, int32_t value); + + int writeToSocket(); + + private: + // static member variables + const static bool mPlatformAtLeastR; + static bool mAttemptedLoad; + static std::mutex mLoadLock; + static struct stats_event_api_table* mStatsEventApi; + + // non-static member variables + struct stats_event* mEventR = nullptr; + stats_event_list mEventQ; + + template + void writeKeyValuePairMap(const map& keyValuePairMap); + + bool usesNewSchema(); + FRIEND_TEST(StatsEventCompatTest, TestDynamicLoading); +}; diff --git a/libstats/push_compat/tests/StatsEventCompat_test.cpp b/libstats/push_compat/tests/StatsEventCompat_test.cpp new file mode 100644 index 000000000..2be24ec10 --- /dev/null +++ b/libstats/push_compat/tests/StatsEventCompat_test.cpp @@ -0,0 +1,38 @@ +/* + * 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 "include/StatsEventCompat.h" +#include +#include +#include + +using android::base::GetProperty; + +/* Checking ro.build.version.release is fragile, as the release field is + * an opaque string without structural guarantees. However, testing confirms + * that on Q devices, the property is "10," and on R, it is "R." Until + * android_get_device_api_level() is updated, this is the only solution. + * + * + * TODO(b/146019024): migrate to android_get_device_api_level() + */ +const static bool mPlatformAtLeastR = GetProperty("ro.build.version.release", "") == "R" || + android_get_device_api_level() > __ANDROID_API_Q__; + +TEST(StatsEventCompatTest, TestDynamicLoading) { + StatsEventCompat event; + EXPECT_EQ(mPlatformAtLeastR, event.usesNewSchema()); +} diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index beb009cbe..bd3d9ae6f 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -41,3 +41,9 @@ cc_library { "liblog", ], } + +cc_library_headers { + name: "libstatssocket_headers", + export_include_dirs: ["include"], + host_supported: true, +} diff --git a/libstats/socket/include/stats_event.h b/libstats/socket/include/stats_event.h index 6a33d543d..e7117d2a0 100644 --- a/libstats/socket/include/stats_event.h +++ b/libstats/socket/include/stats_event.h @@ -85,7 +85,7 @@ struct stats_event* stats_event_obtain(); // The build function can be called multiple times without error. If the event // has been built before, this function is a no-op. void stats_event_build(struct stats_event* event); -void stats_event_write(struct stats_event* event); +int stats_event_write(struct stats_event* event); void stats_event_release(struct stats_event* event); void stats_event_set_atom_id(struct stats_event* event, uint32_t atomId); @@ -98,7 +98,7 @@ void stats_event_write_bool(struct stats_event* event, bool value); void stats_event_write_byte_array(struct stats_event* event, const uint8_t* buf, size_t numBytes); // Buf must be null-terminated. -void stats_event_write_string8(struct stats_event* event, const char* buf); +void stats_event_write_string8(struct stats_event* event, const char* value); // Tags must be null-terminated. void stats_event_write_attribution_chain(struct stats_event* event, const uint32_t* uids, @@ -127,9 +127,33 @@ void stats_event_add_int32_annotation(struct stats_event* event, uint8_t annotat int32_t value); uint32_t stats_event_get_atom_id(struct stats_event* event); +// Size is an output parameter. uint8_t* stats_event_get_buffer(struct stats_event* event, size_t* size); uint32_t stats_event_get_errors(struct stats_event* event); +// This table is used by StatsEventCompat to access the stats_event API. +struct stats_event_api_table { + struct stats_event* (*obtain)(void); + void (*build)(struct stats_event*); + int (*write)(struct stats_event*); + void (*release)(struct stats_event*); + void (*set_atom_id)(struct stats_event*, uint32_t); + void (*write_int32)(struct stats_event*, int32_t); + void (*write_int64)(struct stats_event*, int64_t); + void (*write_float)(struct stats_event*, float); + void (*write_bool)(struct stats_event*, bool); + void (*write_byte_array)(struct stats_event*, const uint8_t*, size_t); + void (*write_string8)(struct stats_event*, const char*); + void (*write_attribution_chain)(struct stats_event*, const uint32_t*, const char* const*, + uint8_t); + void (*write_key_value_pairs)(struct stats_event*, struct key_value_pair*, uint8_t); + void (*add_bool_annotation)(struct stats_event*, uint8_t, bool); + void (*add_int32_annotation)(struct stats_event*, uint8_t, int32_t); + uint32_t (*get_atom_id)(struct stats_event*); + uint8_t* (*get_buffer)(struct stats_event*, size_t*); + uint32_t (*get_errors)(struct stats_event*); +}; + #ifdef __cplusplus } #endif // __CPLUSPLUS diff --git a/libstats/socket/stats_event.c b/libstats/socket/stats_event.c index ef887e3ea..409843410 100644 --- a/libstats/socket/stats_event.c +++ b/libstats/socket/stats_event.c @@ -193,12 +193,12 @@ void stats_event_write_byte_array(struct stats_event* event, const uint8_t* buf, append_byte_array(event, buf, numBytes); } -// Buf is assumed to be encoded using UTF8 -void stats_event_write_string8(struct stats_event* event, const char* buf) { +// Value is assumed to be encoded using UTF8 +void stats_event_write_string8(struct stats_event* event, const char* value) { if (event->errors) return; start_field(event, STRING_TYPE); - append_string(event, buf); + append_string(event, value); } // Tags are assumed to be encoded using UTF8 @@ -320,8 +320,28 @@ void stats_event_build(struct stats_event* event) { event->built = true; } -void stats_event_write(struct stats_event* event) { +int stats_event_write(struct stats_event* event) { stats_event_build(event); - - write_buffer_to_statsd(&event->buf, event->size, event->atomId); + return write_buffer_to_statsd(&event->buf, event->size, event->atomId); } + +struct stats_event_api_table table = { + stats_event_obtain, + stats_event_build, + stats_event_write, + stats_event_release, + stats_event_set_atom_id, + stats_event_write_int32, + stats_event_write_int64, + stats_event_write_float, + stats_event_write_bool, + stats_event_write_byte_array, + stats_event_write_string8, + stats_event_write_attribution_chain, + stats_event_write_key_value_pairs, + stats_event_add_bool_annotation, + stats_event_add_int32_annotation, + stats_event_get_atom_id, + stats_event_get_buffer, + stats_event_get_errors, +}; From f104eb94beaf0a1400cb9f10cdec56b05939db5b Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Thu, 12 Dec 2019 17:16:59 -0800 Subject: [PATCH 043/388] Improve stats_event memory usage We now truncate the buffer to the appropriate length when clients call stats_event_build(). Benchmarking tests indicate that truncating the buffer to the appropriate length increases the cost clients pay to write to the socket by 2%. This is negligible enough that I decided to truncate the buffer for both pushed and pulled atoms in order to simplify the API. Test: m libstatssocket Test: bit libstatssocket_benchmark:* Bug: 144126231 Change-Id: Ife976bb383ecff8de5064730692a95e2a3a82c9d --- libstats/socket/Android.bp | 20 +++++++ libstats/socket/benchmark/main.cpp | 19 +++++++ .../benchmark/stats_event_benchmark.cpp | 53 +++++++++++++++++++ libstats/socket/include/stats_event.h | 3 ++ libstats/socket/stats_event.c | 19 ++++--- 5 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 libstats/socket/benchmark/main.cpp create mode 100644 libstats/socket/benchmark/stats_event_benchmark.cpp diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index bd3d9ae6f..94c405dea 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -47,3 +47,23 @@ cc_library_headers { export_include_dirs: ["include"], host_supported: true, } + +cc_benchmark { + name: "libstatssocket_benchmark", + srcs: [ + "benchmark/main.cpp", + "benchmark/stats_event_benchmark.cpp", + ], + cflags: [ + "-Wall", + "-Werror", + ], + static_libs: [ + "libstatssocket", + ], + shared_libs: [ + "libcutils", + "liblog", + "libgtest_prod", + ], +} diff --git a/libstats/socket/benchmark/main.cpp b/libstats/socket/benchmark/main.cpp new file mode 100644 index 000000000..5ebdf6e9a --- /dev/null +++ b/libstats/socket/benchmark/main.cpp @@ -0,0 +1,19 @@ +/* + * 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 + +BENCHMARK_MAIN(); diff --git a/libstats/socket/benchmark/stats_event_benchmark.cpp b/libstats/socket/benchmark/stats_event_benchmark.cpp new file mode 100644 index 000000000..b487c4d4b --- /dev/null +++ b/libstats/socket/benchmark/stats_event_benchmark.cpp @@ -0,0 +1,53 @@ +/* + * 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 "benchmark/benchmark.h" +#include "stats_event.h" + +static struct stats_event* constructStatsEvent() { + struct stats_event* event = stats_event_obtain(); + stats_event_set_atom_id(event, 100); + + // randomly sample atom size + for (int i = 0; i < rand() % 800; i++) { + stats_event_write_int32(event, i); + } + + return event; +} + +static void BM_stats_event_truncate_buffer(benchmark::State& state) { + while (state.KeepRunning()) { + struct stats_event* event = constructStatsEvent(); + stats_event_build(event); + stats_event_write(event); + stats_event_release(event); + } +} + +BENCHMARK(BM_stats_event_truncate_buffer); + +static void BM_stats_event_full_buffer(benchmark::State& state) { + while (state.KeepRunning()) { + struct stats_event* event = constructStatsEvent(); + stats_event_truncate_buffer(event, false); + stats_event_build(event); + stats_event_write(event); + stats_event_release(event); + } +} + +BENCHMARK(BM_stats_event_full_buffer); diff --git a/libstats/socket/include/stats_event.h b/libstats/socket/include/stats_event.h index e7117d2a0..080e957b2 100644 --- a/libstats/socket/include/stats_event.h +++ b/libstats/socket/include/stats_event.h @@ -154,6 +154,9 @@ struct stats_event_api_table { uint32_t (*get_errors)(struct stats_event*); }; +// exposed for benchmarking only +void stats_event_truncate_buffer(struct stats_event* event, bool truncate); + #ifdef __cplusplus } #endif // __CPLUSPLUS diff --git a/libstats/socket/stats_event.c b/libstats/socket/stats_event.c index 409843410..551b392df 100644 --- a/libstats/socket/stats_event.c +++ b/libstats/socket/stats_event.c @@ -20,7 +20,6 @@ #include #include "stats_buffer_writer.h" -#define STATS_EVENT_TAG 1937006964 #define LOGGER_ENTRY_MAX_PAYLOAD 4068 // Max payload size is 4 bytes less as 4 bytes are reserved for stats_eventTag. // See android_util_Stats_Log.cpp @@ -39,13 +38,13 @@ // The stats_event struct holds the serialized encoding of an event // within a buf. Also includes other required fields. struct stats_event { - uint8_t buf[MAX_EVENT_PAYLOAD]; + uint8_t* buf; size_t lastFieldPos; // location of last field within the buf size_t size; // number of valid bytes within buffer uint32_t numElements; uint32_t atomId; uint32_t errors; - uint32_t tag; + bool truncate; bool built; }; @@ -58,12 +57,11 @@ static int64_t get_elapsed_realtime_ns() { struct stats_event* stats_event_obtain() { struct stats_event* event = malloc(sizeof(struct stats_event)); - - memset(event->buf, 0, MAX_EVENT_PAYLOAD); + event->buf = (uint8_t*)calloc(MAX_EVENT_PAYLOAD, 1); event->buf[0] = OBJECT_TYPE; event->atomId = 0; event->errors = 0; - event->tag = STATS_EVENT_TAG; + event->truncate = true; // truncate for both pulled and pushed atoms event->built = false; // place the timestamp @@ -79,6 +77,7 @@ struct stats_event* stats_event_obtain() { } void stats_event_release(struct stats_event* event) { + free(event->buf); free(event); } @@ -297,6 +296,10 @@ uint32_t stats_event_get_errors(struct stats_event* event) { return event->errors; } +void stats_event_truncate_buffer(struct stats_event* event, bool truncate) { + event->truncate = truncate; +} + void stats_event_build(struct stats_event* event) { if (event->built) return; @@ -317,6 +320,10 @@ void stats_event_build(struct stats_event* event) { event->size = POS_FIRST_FIELD + sizeof(uint8_t) + sizeof(uint32_t); } + // Truncate the buffer to the appropriate length in order to limit our + // memory usage. + if (event->truncate) event->buf = (uint8_t*)realloc(event->buf, event->size); + event->built = true; } From 5dc56738bf4131cd726b2b4a6337e0121bfa1253 Mon Sep 17 00:00:00 2001 From: Stan Iliev Date: Mon, 16 Dec 2019 12:14:08 -0500 Subject: [PATCH 044/388] Change register_stats_pull_atom_callback cookie parameter to non-const Test: Ran GRAPHICS_STATS puller Bug: 146052586 Bug: 142665516 Change-Id: I98b4cbb99e35eda50fa9dc3069b3f0ddf16f5ff9 --- libstats/pull/include/stats_pull_atom_callback.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libstats/pull/include/stats_pull_atom_callback.h b/libstats/pull/include/stats_pull_atom_callback.h index ee69ea7a8..6369b8430 100644 --- a/libstats/pull/include/stats_pull_atom_callback.h +++ b/libstats/pull/include/stats_pull_atom_callback.h @@ -39,7 +39,7 @@ typedef bool (*stats_pull_atom_callback_t)(int32_t atom_tag, pulled_stats_event_ struct stats_event* add_stats_event_to_pull_data(pulled_stats_event_list* pull_data); void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t* callback, - pull_atom_metadata* metadata, const void* cookie); + pull_atom_metadata* metadata, void* cookie); #ifdef __cplusplus } From 7070b7ac7448aea77e8ccb2047c323eacedca509 Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Mon, 16 Dec 2019 13:45:13 -0800 Subject: [PATCH 045/388] Merge libstatspush_compat and libstatssocket_q This cleanup makes it clear that there are only two acceptable ways of logging to the socket: either through libstatspush_compat or libstatssocket (which will soon be renamed to libstatspush). Test: m -j Change-Id: I6a49b4995b56df462e1be901ea5e54acfe2e8bac --- libstats/push_compat/Android.bp | 11 +++-- .../include/stats_event_list.h | 0 .../stats_event_list.c | 0 .../{socket_q => push_compat}/statsd_writer.c | 0 .../{socket_q => push_compat}/statsd_writer.h | 0 libstats/socket_q/Android.bp | 40 ------------------- 6 files changed, 8 insertions(+), 43 deletions(-) rename libstats/{socket_q => push_compat}/include/stats_event_list.h (100%) rename libstats/{socket_q => push_compat}/stats_event_list.c (100%) rename libstats/{socket_q => push_compat}/statsd_writer.c (100%) rename libstats/{socket_q => push_compat}/statsd_writer.h (100%) delete mode 100644 libstats/socket_q/Android.bp diff --git a/libstats/push_compat/Android.bp b/libstats/push_compat/Android.bp index 93539903a..465c05a37 100644 --- a/libstats/push_compat/Android.bp +++ b/libstats/push_compat/Android.bp @@ -21,17 +21,22 @@ // ========================================================================= cc_defaults { name: "libstatspush_compat_defaults", - srcs: ["StatsEventCompat.cpp"], + srcs: [ + "statsd_writer.c", + "stats_event_list.c", + "StatsEventCompat.cpp" + ], cflags: [ "-Wall", "-Werror", + "-DWRITE_TO_STATSD=1", + "-DWRITE_TO_LOGD=0", ], header_libs: ["libstatssocket_headers"], static_libs: [ "libbase", "liblog", - "libstatssocket_q", - "libutils" + "libutils", ], } diff --git a/libstats/socket_q/include/stats_event_list.h b/libstats/push_compat/include/stats_event_list.h similarity index 100% rename from libstats/socket_q/include/stats_event_list.h rename to libstats/push_compat/include/stats_event_list.h diff --git a/libstats/socket_q/stats_event_list.c b/libstats/push_compat/stats_event_list.c similarity index 100% rename from libstats/socket_q/stats_event_list.c rename to libstats/push_compat/stats_event_list.c diff --git a/libstats/socket_q/statsd_writer.c b/libstats/push_compat/statsd_writer.c similarity index 100% rename from libstats/socket_q/statsd_writer.c rename to libstats/push_compat/statsd_writer.c diff --git a/libstats/socket_q/statsd_writer.h b/libstats/push_compat/statsd_writer.h similarity index 100% rename from libstats/socket_q/statsd_writer.h rename to libstats/push_compat/statsd_writer.h diff --git a/libstats/socket_q/Android.bp b/libstats/socket_q/Android.bp deleted file mode 100644 index 6c0c65c23..000000000 --- a/libstats/socket_q/Android.bp +++ /dev/null @@ -1,40 +0,0 @@ -// -// 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. -// - -// ============================================================================ -// Native library to write stats log to statsd socket on Android Q and earlier. -// This library is only meant to be used by libstatssocket_compat. -// ============================================================================ -cc_library { - name: "libstatssocket_q", - srcs: [ - "stats_event_list.c", - "statsd_writer.c", - ], - host_supported: true, - cflags: [ - "-Wall", - "-Werror", - "-DLIBLOG_LOG_TAG=1006", - "-DWRITE_TO_STATSD=1", - "-DWRITE_TO_LOGD=0", - ], - export_include_dirs: ["include"], - shared_libs: [ - "libcutils", - "liblog", - ], -} From 21c1f9c3148c080aa2c8756c300d8d6718d11e6b Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Tue, 7 Jan 2020 09:36:04 -0800 Subject: [PATCH 046/388] stats_event.h/c tests Add unit tests for the native API to log atoms to statsd. Test: bit libstatssocket_test:* Bug: 145231901 Change-Id: If427c17319787200260cbe3b71075ca556c9a82b --- libstats/socket/Android.bp | 19 ++ libstats/socket/tests/stats_event_test.cpp | 344 +++++++++++++++++++++ 2 files changed, 363 insertions(+) create mode 100644 libstats/socket/tests/stats_event_test.cpp diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index 3b6efbb55..9fd9fbc20 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -75,3 +75,22 @@ cc_benchmark { "libgtest_prod", ], } + +cc_test { + name: "libstatssocket_test", + srcs: ["tests/stats_event_test.cpp"], + cflags: [ + "-Wall", + "-Werror", + ], + static_libs: [ + "libgmock", + "libstatssocket", + ], + shared_libs: [ + "libcutils", + "liblog", + "libutils", + ], + test_suites: ["device_tests"], +} diff --git a/libstats/socket/tests/stats_event_test.cpp b/libstats/socket/tests/stats_event_test.cpp new file mode 100644 index 000000000..cf0592c3a --- /dev/null +++ b/libstats/socket/tests/stats_event_test.cpp @@ -0,0 +1,344 @@ +/* + * 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 "stats_event.h" +#include +#include + +using std::string; +using std::vector; + +// Side-effect: this function moves the start of the buffer past the read value +template +T readNext(uint8_t** buffer) { + T value = *(T*)(*buffer); + *buffer += sizeof(T); + return value; +} + +void checkTypeHeader(uint8_t** buffer, uint8_t typeId, uint8_t numAnnotations = 0) { + uint8_t typeHeader = (numAnnotations << 4) | typeId; + EXPECT_EQ(readNext(buffer), typeHeader); +} + +template +void checkScalar(uint8_t** buffer, T expectedValue) { + EXPECT_EQ(readNext(buffer), expectedValue); +} + +void checkString(uint8_t** buffer, const string& expectedString) { + uint32_t size = readNext(buffer); + string parsedString((char*)(*buffer), size); + EXPECT_EQ(parsedString, expectedString); + *buffer += size; // move buffer past string we just read +} + +void checkByteArray(uint8_t** buffer, const vector& expectedByteArray) { + uint32_t size = readNext(buffer); + vector parsedByteArray(*buffer, *buffer + size); + EXPECT_EQ(parsedByteArray, expectedByteArray); + *buffer += size; // move buffer past byte array we just read +} + +template +void checkAnnotation(uint8_t** buffer, uint8_t annotationId, uint8_t typeId, T annotationValue) { + EXPECT_EQ(readNext(buffer), annotationId); + EXPECT_EQ(readNext(buffer), typeId); + checkScalar(buffer, annotationValue); +} + +void checkMetadata(uint8_t** buffer, uint8_t numElements, int64_t startTime, int64_t endTime, + uint32_t atomId) { + // All events start with OBJECT_TYPE id. + checkTypeHeader(buffer, OBJECT_TYPE); + + // We increment by 2 because the number of elements listed in the + // serialization accounts for the timestamp and atom id as well. + checkScalar(buffer, static_cast(numElements + 2)); + + // Check timestamp + checkTypeHeader(buffer, INT64_TYPE); + int64_t timestamp = readNext(buffer); + EXPECT_GE(timestamp, startTime); + EXPECT_LE(timestamp, endTime); + + // Check atom id + checkTypeHeader(buffer, INT32_TYPE); + checkScalar(buffer, atomId); +} + +TEST(StatsEventTest, TestScalars) { + uint32_t atomId = 100; + int32_t int32Value = -5; + int64_t int64Value = -2 * android::elapsedRealtimeNano(); + float floatValue = 2.0; + bool boolValue = false; + + int64_t startTime = android::elapsedRealtimeNano(); + struct stats_event* event = stats_event_obtain(); + stats_event_set_atom_id(event, atomId); + stats_event_write_int32(event, int32Value); + stats_event_write_int64(event, int64Value); + stats_event_write_float(event, floatValue); + stats_event_write_bool(event, boolValue); + stats_event_build(event); + int64_t endTime = android::elapsedRealtimeNano(); + + size_t bufferSize; + uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* bufferEnd = buffer + bufferSize; + + checkMetadata(&buffer, /*numElements=*/4, startTime, endTime, atomId); + + // check int32 element + checkTypeHeader(&buffer, INT32_TYPE); + checkScalar(&buffer, int32Value); + + // check int64 element + checkTypeHeader(&buffer, INT64_TYPE); + checkScalar(&buffer, int64Value); + + // check float element + checkTypeHeader(&buffer, FLOAT_TYPE); + checkScalar(&buffer, floatValue); + + // check bool element + checkTypeHeader(&buffer, BOOL_TYPE); + checkScalar(&buffer, boolValue); + + EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer + EXPECT_EQ(stats_event_get_errors(event), 0); + stats_event_release(event); +} + +TEST(StatsEventTest, TestStrings) { + uint32_t atomId = 100; + string str = "test_string"; + + int64_t startTime = android::elapsedRealtimeNano(); + struct stats_event* event = stats_event_obtain(); + stats_event_set_atom_id(event, atomId); + stats_event_write_string8(event, str.c_str()); + stats_event_build(event); + int64_t endTime = android::elapsedRealtimeNano(); + + size_t bufferSize; + uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* bufferEnd = buffer + bufferSize; + + checkMetadata(&buffer, /*numElements=*/1, startTime, endTime, atomId); + + checkTypeHeader(&buffer, STRING_TYPE); + checkString(&buffer, str); + + EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer + EXPECT_EQ(stats_event_get_errors(event), 0); + stats_event_release(event); +} + +TEST(StatsEventTest, TestByteArrays) { + uint32_t atomId = 100; + vector message = {'b', 'y', 't', '\0', 'e', 's'}; + + int64_t startTime = android::elapsedRealtimeNano(); + struct stats_event* event = stats_event_obtain(); + stats_event_set_atom_id(event, atomId); + stats_event_write_byte_array(event, message.data(), message.size()); + stats_event_build(event); + int64_t endTime = android::elapsedRealtimeNano(); + + size_t bufferSize; + uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* bufferEnd = buffer + bufferSize; + + checkMetadata(&buffer, /*numElements=*/1, startTime, endTime, atomId); + + checkTypeHeader(&buffer, BYTE_ARRAY_TYPE); + checkByteArray(&buffer, message); + + EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer + EXPECT_EQ(stats_event_get_errors(event), 0); + stats_event_release(event); +} + +TEST(StatsEventTest, TestAttributionChains) { + uint32_t atomId = 100; + + uint8_t numNodes = 50; + uint32_t uids[numNodes]; + vector tags(numNodes); // storage that cTag elements point to + const char* cTags[numNodes]; + for (int i = 0; i < (int)numNodes; i++) { + uids[i] = i; + tags.push_back("test" + std::to_string(i)); + cTags[i] = tags[i].c_str(); + } + + int64_t startTime = android::elapsedRealtimeNano(); + struct stats_event* event = stats_event_obtain(); + stats_event_set_atom_id(event, atomId); + stats_event_write_attribution_chain(event, uids, cTags, numNodes); + stats_event_build(event); + int64_t endTime = android::elapsedRealtimeNano(); + + size_t bufferSize; + uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* bufferEnd = buffer + bufferSize; + + checkMetadata(&buffer, /*numElements=*/1, startTime, endTime, atomId); + + checkTypeHeader(&buffer, ATTRIBUTION_CHAIN_TYPE); + checkScalar(&buffer, numNodes); + for (int i = 0; i < numNodes; i++) { + checkScalar(&buffer, uids[i]); + checkString(&buffer, tags[i]); + } + + EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer + EXPECT_EQ(stats_event_get_errors(event), 0); + stats_event_release(event); +} + +TEST(StatsEventTest, TestKeyValuePairs) { + uint32_t atomId = 100; + + uint8_t numPairs = 4; + struct key_value_pair pairs[numPairs]; + pairs[0] = {.key = 0, .valueType = INT32_TYPE, .int32Value = -1}; + pairs[1] = {.key = 1, .valueType = INT64_TYPE, .int64Value = 0x123456789}; + pairs[2] = {.key = 2, .valueType = FLOAT_TYPE, .floatValue = 5.5}; + string str = "test_key_value_pair_string"; + pairs[3] = {.key = 3, .valueType = STRING_TYPE, .stringValue = str.c_str()}; + + int64_t startTime = android::elapsedRealtimeNano(); + struct stats_event* event = stats_event_obtain(); + stats_event_set_atom_id(event, atomId); + stats_event_write_key_value_pairs(event, pairs, numPairs); + stats_event_build(event); + int64_t endTime = android::elapsedRealtimeNano(); + + size_t bufferSize; + uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* bufferEnd = buffer + bufferSize; + + checkMetadata(&buffer, /*numElements=*/1, startTime, endTime, atomId); + + checkTypeHeader(&buffer, KEY_VALUE_PAIRS_TYPE); + checkScalar(&buffer, numPairs); + + // first pair + checkScalar(&buffer, pairs[0].key); + checkTypeHeader(&buffer, pairs[0].valueType); + checkScalar(&buffer, pairs[0].int32Value); + + // second pair + checkScalar(&buffer, pairs[1].key); + checkTypeHeader(&buffer, pairs[1].valueType); + checkScalar(&buffer, pairs[1].int64Value); + + // third pair + checkScalar(&buffer, pairs[2].key); + checkTypeHeader(&buffer, pairs[2].valueType); + checkScalar(&buffer, pairs[2].floatValue); + + // fourth pair + checkScalar(&buffer, pairs[3].key); + checkTypeHeader(&buffer, pairs[3].valueType); + checkString(&buffer, str); + + EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer + EXPECT_EQ(stats_event_get_errors(event), 0); + stats_event_release(event); +} + +TEST(StatsEventTest, TestAnnotations) { + uint32_t atomId = 100; + + // first element information + bool boolValue = false; + uint8_t boolAnnotation1Id = 1; + uint8_t boolAnnotation2Id = 2; + bool boolAnnotation1Value = true; + int32_t boolAnnotation2Value = 3; + + // second element information + float floatValue = -5.0; + uint8_t floatAnnotation1Id = 3; + uint8_t floatAnnotation2Id = 4; + int32_t floatAnnotation1Value = 8; + bool floatAnnotation2Value = false; + + int64_t startTime = android::elapsedRealtimeNano(); + struct stats_event* event = stats_event_obtain(); + stats_event_set_atom_id(event, 100); + stats_event_write_bool(event, boolValue); + stats_event_add_bool_annotation(event, boolAnnotation1Id, boolAnnotation1Value); + stats_event_add_int32_annotation(event, boolAnnotation2Id, boolAnnotation2Value); + stats_event_write_float(event, floatValue); + stats_event_add_int32_annotation(event, floatAnnotation1Id, floatAnnotation1Value); + stats_event_add_bool_annotation(event, floatAnnotation2Id, floatAnnotation2Value); + stats_event_build(event); + int64_t endTime = android::elapsedRealtimeNano(); + + size_t bufferSize; + uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* bufferEnd = buffer + bufferSize; + + checkMetadata(&buffer, /*numElements=*/2, startTime, endTime, atomId); + + // check first element + checkTypeHeader(&buffer, BOOL_TYPE, /*numAnnotations=*/2); + checkScalar(&buffer, boolValue); + checkAnnotation(&buffer, boolAnnotation1Id, BOOL_TYPE, boolAnnotation1Value); + checkAnnotation(&buffer, boolAnnotation2Id, INT32_TYPE, boolAnnotation2Value); + + // check second element + checkTypeHeader(&buffer, FLOAT_TYPE, /*numAnnotations=*/2); + checkScalar(&buffer, floatValue); + checkAnnotation(&buffer, floatAnnotation1Id, INT32_TYPE, floatAnnotation1Value); + checkAnnotation(&buffer, floatAnnotation2Id, BOOL_TYPE, floatAnnotation2Value); + + EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer + EXPECT_EQ(stats_event_get_errors(event), 0); + stats_event_release(event); +} + +TEST(StatsEventTest, TestNoAtomIdError) { + struct stats_event* event = stats_event_obtain(); + // Don't set the atom id in order to trigger the error. + stats_event_build(event); + + uint32_t errors = stats_event_get_errors(event); + EXPECT_NE(errors | ERROR_NO_ATOM_ID, 0); + + stats_event_release(event); +} + +TEST(StatsEventTest, TestOverflowError) { + struct stats_event* event = stats_event_obtain(); + stats_event_set_atom_id(event, 100); + // Add 1000 int32s to the event. Each int32 takes 5 bytes so this will + // overflow the 4068 byte buffer. + for (int i = 0; i < 1000; i++) { + stats_event_write_int32(event, 0); + } + stats_event_build(event); + + uint32_t errors = stats_event_get_errors(event); + EXPECT_NE(errors | ERROR_OVERFLOW, 0); + + stats_event_release(event); +} From 7e1b190832d8b4afd902a23ff89e2e0f4e2ebbe0 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Thu, 9 Jan 2020 11:48:36 -0800 Subject: [PATCH 047/388] Remove extra indirection in native puller API The indirection is unneeded since we already take a function pointer. Test: builds Change-Id: Ice426d7dcb090aaf87a377ede233a4eb18f5eb30 --- libstats/pull/include/stats_pull_atom_callback.h | 2 +- libstats/pull/stats_pull_atom_callback.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libstats/pull/include/stats_pull_atom_callback.h b/libstats/pull/include/stats_pull_atom_callback.h index 6369b8430..530b48997 100644 --- a/libstats/pull/include/stats_pull_atom_callback.h +++ b/libstats/pull/include/stats_pull_atom_callback.h @@ -38,7 +38,7 @@ typedef bool (*stats_pull_atom_callback_t)(int32_t atom_tag, pulled_stats_event_ const void* cookie); struct stats_event* add_stats_event_to_pull_data(pulled_stats_event_list* pull_data); -void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t* callback, +void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t callback, pull_atom_metadata* metadata, void* cookie); #ifdef __cplusplus diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp index 177bbba44..f3a0ac54e 100644 --- a/libstats/pull/stats_pull_atom_callback.cpp +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -42,7 +42,7 @@ static const int64_t DEFAULT_TIMEOUT_NS = 10000000000LL; // 10 seconds. class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { public: - StatsPullAtomCallbackInternal(const stats_pull_atom_callback_t* callback, const void* cookie, + StatsPullAtomCallbackInternal(const stats_pull_atom_callback_t callback, const void* cookie, const int64_t coolDownNs, const int64_t timeoutNs, const std::vector additiveFields) : mCallback(callback), @@ -55,7 +55,7 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { int32_t atomTag, const ::android::sp<::android::os::IPullAtomResultReceiver>& resultReceiver) override { pulled_stats_event_list statsEventList; - bool success = (*mCallback)(atomTag, &statsEventList, mCookie); + bool success = mCallback(atomTag, &statsEventList, mCookie); // Convert stats_events into StatsEventParcels. std::vector parcels; @@ -82,7 +82,7 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { const std::vector& getAdditiveFields() const { return mAdditiveFields; } private: - const stats_pull_atom_callback_t* mCallback; + const stats_pull_atom_callback_t mCallback; const void* mCookie; const int64_t mCoolDownNs; const int64_t mTimeoutNs; @@ -134,7 +134,7 @@ static android::sp getStatsServiceLocked() { return sStatsd; } -void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t* callback, +void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t callback, pull_atom_metadata* metadata, void* cookie) { int64_t coolDownNs = metadata == nullptr ? DEFAULT_COOL_DOWN_NS : metadata->cool_down_ns; int64_t timeoutNs = metadata == nullptr ? DEFAULT_TIMEOUT_NS : metadata->timeout_ns; From dab324f6e037b02086149cddcad398976e3a0777 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Mon, 13 Jan 2020 16:03:15 -0800 Subject: [PATCH 048/388] Unregistration of native pullers Changes the API to return an int instead of a bool. Creates API to unregister pullers. Test: atest LibStatsPullTests Bug: 144373250 Change-Id: I6d395237082337a22f37190343a1fc59703d39bf --- .../pull/include/stats_pull_atom_callback.h | 16 +++++++-- libstats/pull/stats_pull_atom_callback.cpp | 33 ++++++++++++++----- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/libstats/pull/include/stats_pull_atom_callback.h b/libstats/pull/include/stats_pull_atom_callback.h index 530b48997..b779ac98a 100644 --- a/libstats/pull/include/stats_pull_atom_callback.h +++ b/libstats/pull/include/stats_pull_atom_callback.h @@ -23,7 +23,6 @@ extern "C" { #endif /* * Metadata for registering a stats_pull_atom_callback. - * All fields are optional, and defaults will be used for unspecified fields. */ typedef struct pull_atom_metadata { int64_t cool_down_ns; @@ -34,13 +33,24 @@ typedef struct pull_atom_metadata { typedef struct pulled_stats_event_list pulled_stats_event_list; -typedef bool (*stats_pull_atom_callback_t)(int32_t atom_tag, pulled_stats_event_list* data, - const void* cookie); +typedef int32_t status_pull_atom_return_t; + +enum { + STATS_PULL_SUCCESS = 0, + STATS_PULL_SKIP = 1, +}; + +typedef status_pull_atom_return_t (*stats_pull_atom_callback_t)(int32_t atom_tag, + pulled_stats_event_list* data, + void* cookie); struct stats_event* add_stats_event_to_pull_data(pulled_stats_event_list* pull_data); + void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t callback, pull_atom_metadata* metadata, void* cookie); +void unregister_stats_pull_atom_callback(int32_t atom_tag); + #ifdef __cplusplus } #endif diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp index f3a0ac54e..99233c316 100644 --- a/libstats/pull/stats_pull_atom_callback.cpp +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -42,7 +42,7 @@ static const int64_t DEFAULT_TIMEOUT_NS = 10000000000LL; // 10 seconds. class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { public: - StatsPullAtomCallbackInternal(const stats_pull_atom_callback_t callback, const void* cookie, + StatsPullAtomCallbackInternal(const stats_pull_atom_callback_t callback, void* cookie, const int64_t coolDownNs, const int64_t timeoutNs, const std::vector additiveFields) : mCallback(callback), @@ -55,7 +55,8 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { int32_t atomTag, const ::android::sp<::android::os::IPullAtomResultReceiver>& resultReceiver) override { pulled_stats_event_list statsEventList; - bool success = mCallback(atomTag, &statsEventList, mCookie); + int successInt = mCallback(atomTag, &statsEventList, mCookie); + bool success = successInt == STATS_PULL_SUCCESS; // Convert stats_events into StatsEventParcels. std::vector parcels; @@ -83,7 +84,7 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { private: const stats_pull_atom_callback_t mCallback; - const void* mCookie; + void* mCookie; const int64_t mCoolDownNs; const int64_t mTimeoutNs; const std::vector mAdditiveFields; @@ -146,15 +147,31 @@ void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callbac } std::lock_guard lg(pullAtomMutex); - const android::sp statsService = getStatsServiceLocked(); - if (statsService == nullptr) { - // Error - statsd not available - return; - } + // Always add to the map. If statsd is dead, we will add them when it comes back. android::sp callbackBinder = new StatsPullAtomCallbackInternal( callback, cookie, coolDownNs, timeoutNs, additiveFields); mPullers[atom_tag] = callbackBinder; + + const android::sp statsService = getStatsServiceLocked(); + if (statsService == nullptr) { + // Statsd not available + return; + } + statsService->registerNativePullAtomCallback(atom_tag, coolDownNs, timeoutNs, additiveFields, callbackBinder); } + +void unregister_stats_pull_atom_callback(int32_t atom_tag) { + std::lock_guard lg(pullAtomMutex); + // Always remove the puller from our map. + // If statsd is down, we will not register it when it comes back. + mPullers.erase(atom_tag); + const android::sp statsService = getStatsServiceLocked(); + if (statsService == nullptr) { + // Statsd not available + return; + } + statsService->unregisterNativePullAtomCallback(atom_tag); +} From 518d77d208f97e7f0834969fa53a1b49d4eb87fb Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Mon, 13 Jan 2020 17:56:58 -0800 Subject: [PATCH 049/388] Register pullers in separate thread This cl modifies getStatsService to use the blocking getService, but also makes the binder call in a separate thread to not block the client thread. This is needed because it is possible for pullers to be registered before statsd starts, and calling checkService before statsd is up will fail. We also would never receive the binderDied to register it, because we would never have a binder object to linkToDeath on. Bug: 147682855 Test: atest LibStatsPullTests Change-Id: I68c04bc24c7fe066eca88cab4f6a76885581c1ee --- libstats/pull/stats_pull_atom_callback.cpp | 78 ++++++++++++++-------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp index 99233c316..e8fc2ea32 100644 --- a/libstats/pull/stats_pull_atom_callback.cpp +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -25,7 +25,8 @@ #include #include #include -#include "include/stats_pull_atom_callback.h" + +#include struct pulled_stats_event_list { std::vector data; @@ -94,7 +95,7 @@ static std::mutex pullAtomMutex; static android::sp sStatsd = nullptr; static std::map> mPullers; -static android::sp getStatsServiceLocked(); +static android::sp getStatsService(); class StatsDeathRecipient : public android::IBinder::DeathRecipient { public: @@ -103,15 +104,21 @@ class StatsDeathRecipient : public android::IBinder::DeathRecipient { // android::IBinder::DeathRecipient override: void binderDied(const android::wp& /* who */) override { - std::lock_guard lock(pullAtomMutex); - if (sStatsd) { + { + std::lock_guard lock(pullAtomMutex); sStatsd = nullptr; } - android::sp statsService = getStatsServiceLocked(); + android::sp statsService = getStatsService(); if (statsService == nullptr) { return; } - for (auto it : mPullers) { + + std::map> pullersCopy; + { + std::lock_guard lock(pullAtomMutex); + pullersCopy = mPullers; + } + for (auto it : pullersCopy) { statsService->registerNativePullAtomCallback(it.first, it.second->getCoolDownNs(), it.second->getTimeoutNs(), it.second->getAdditiveFields(), it.second); @@ -121,11 +128,12 @@ class StatsDeathRecipient : public android::IBinder::DeathRecipient { static android::sp statsDeathRecipient = new StatsDeathRecipient(); -static android::sp getStatsServiceLocked() { +static android::sp getStatsService() { + std::lock_guard lock(pullAtomMutex); if (!sStatsd) { // Fetch statsd. const android::sp binder = - android::defaultServiceManager()->checkService(android::String16("stats")); + android::defaultServiceManager()->getService(android::String16("stats")); if (!binder) { return nullptr; } @@ -135,6 +143,28 @@ static android::sp getStatsServiceLocked() { return sStatsd; } +void registerStatsPullAtomCallbackBlocking(int32_t atomTag, + android::sp cb) { + const android::sp statsService = getStatsService(); + if (statsService == nullptr) { + // Statsd not available + return; + } + + statsService->registerNativePullAtomCallback(atomTag, cb->getCoolDownNs(), cb->getTimeoutNs(), + cb->getAdditiveFields(), cb); +} + +void unregisterStatsPullAtomCallbackBlocking(int32_t atomTag) { + const android::sp statsService = getStatsService(); + if (statsService == nullptr) { + // Statsd not available + return; + } + + statsService->unregisterNativePullAtomCallback(atomTag); +} + void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t callback, pull_atom_metadata* metadata, void* cookie) { int64_t coolDownNs = metadata == nullptr ? DEFAULT_COOL_DOWN_NS : metadata->cool_down_ns; @@ -146,32 +176,26 @@ void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callbac metadata->additive_fields + metadata->additive_fields_size); } - std::lock_guard lg(pullAtomMutex); - - // Always add to the map. If statsd is dead, we will add them when it comes back. android::sp callbackBinder = new StatsPullAtomCallbackInternal( callback, cookie, coolDownNs, timeoutNs, additiveFields); - mPullers[atom_tag] = callbackBinder; - const android::sp statsService = getStatsServiceLocked(); - if (statsService == nullptr) { - // Statsd not available - return; + { + std::lock_guard lg(pullAtomMutex); + // Always add to the map. If statsd is dead, we will add them when it comes back. + mPullers[atom_tag] = callbackBinder; } - statsService->registerNativePullAtomCallback(atom_tag, coolDownNs, timeoutNs, additiveFields, - callbackBinder); + std::thread registerThread(registerStatsPullAtomCallbackBlocking, atom_tag, callbackBinder); + registerThread.detach(); } void unregister_stats_pull_atom_callback(int32_t atom_tag) { - std::lock_guard lg(pullAtomMutex); - // Always remove the puller from our map. - // If statsd is down, we will not register it when it comes back. - mPullers.erase(atom_tag); - const android::sp statsService = getStatsServiceLocked(); - if (statsService == nullptr) { - // Statsd not available - return; + { + std::lock_guard lg(pullAtomMutex); + // Always remove the puller from our map. + // If statsd is down, we will not register it when it comes back. + mPullers.erase(atom_tag); } - statsService->unregisterNativePullAtomCallback(atom_tag); + std::thread unregisterThread(unregisterStatsPullAtomCallbackBlocking, atom_tag); + unregisterThread.detach(); } From 3c420c0f3400c0d565df53afefef28b9ff4e18cd Mon Sep 17 00:00:00 2001 From: Baligh Uddin Date: Wed, 22 Jan 2020 21:54:06 -0800 Subject: [PATCH 050/388] Set version to 300000000 Exempt-From-Owner-Approval: baligh@ approving to unblock TM21 train generation. Change-Id: I6eb8c2f618c41800ad9defcc7eb8f8fcb1d724df --- adb/apex/apex_manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adb/apex/apex_manifest.json b/adb/apex/apex_manifest.json index ff2df127b..04444093d 100644 --- a/adb/apex/apex_manifest.json +++ b/adb/apex/apex_manifest.json @@ -1,4 +1,4 @@ { "name": "com.android.adbd", - "version": 1 + "version": 300000000 } From ea696c4ce236572bf8a1ac3406606b0ef0172158 Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Thu, 23 Jan 2020 16:18:13 -0800 Subject: [PATCH 051/388] Revive ACgroupController_getFlags LLNDK function to detect missing cgroups ACgroupController_getFlags was reverted due to LLNDK breakage, however it allows detection of cgroups that failed to mount in a more efficient way. Revive the function as a weakly linked symbol to allow for it to be missing in case older LLNDK library is being used with the new system software. This effectively reverts the commit aa1d54f0ccbb "Remove ACgroupController_getFlags to fix API breakage"' except it declares ACgroupController_getFlags function as weak and targets it for API level 30. If LLNKD library does not contain ACgroupController_getFlags the behavior falls back to the current way of identifying cgroups that failed to mount. Test: build and verify correct operation with a missing cgroup Change-Id: I9158ef53aba97972d41d71dd3396ac43796a7004 Signed-off-by: Suren Baghdasaryan --- libprocessgroup/cgroup_map.cpp | 20 +++++++++++++++---- .../cgrouprc/cgroup_controller.cpp | 5 +++++ .../cgrouprc/include/android/cgrouprc.h | 13 +++++++++++- .../cgrouprc/libcgrouprc.llndk.txt | 7 +++++++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/libprocessgroup/cgroup_map.cpp b/libprocessgroup/cgroup_map.cpp index 20ae2be77..2fc920b54 100644 --- a/libprocessgroup/cgroup_map.cpp +++ b/libprocessgroup/cgroup_map.cpp @@ -71,7 +71,12 @@ bool CgroupController::IsUsable() { if (!HasValue()) return false; if (state_ == UNKNOWN) { - state_ = access(GetProcsFilePath("", 0, 0).c_str(), F_OK) == 0 ? USABLE : MISSING; + if (ACgroupController_getFlags != nullptr) { + uint32_t flags = ACgroupController_getFlags(controller_); + state_ = (flags & CGROUPRC_CONTROLLER_FLAG_MOUNTED) != 0 ? USABLE : MISSING; + } else { + state_ = access(GetProcsFilePath("", 0, 0).c_str(), F_OK) == 0 ? USABLE : MISSING; + } } return state_ == USABLE; @@ -161,9 +166,16 @@ void CgroupMap::Print() const { auto controller_count = ACgroupFile_getControllerCount(); for (uint32_t i = 0; i < controller_count; ++i) { const ACgroupController* controller = ACgroupFile_getController(i); - LOG(INFO) << "\t" << ACgroupController_getName(controller) << " ver " - << ACgroupController_getVersion(controller) << " path " - << ACgroupController_getPath(controller); + if (ACgroupController_getFlags != nullptr) { + LOG(INFO) << "\t" << ACgroupController_getName(controller) << " ver " + << ACgroupController_getVersion(controller) << " path " + << ACgroupController_getPath(controller) << " flags " + << ACgroupController_getFlags(controller); + } else { + LOG(INFO) << "\t" << ACgroupController_getName(controller) << " ver " + << ACgroupController_getVersion(controller) << " path " + << ACgroupController_getPath(controller); + } } } diff --git a/libprocessgroup/cgrouprc/cgroup_controller.cpp b/libprocessgroup/cgrouprc/cgroup_controller.cpp index d064d312e..5a326e55d 100644 --- a/libprocessgroup/cgrouprc/cgroup_controller.cpp +++ b/libprocessgroup/cgrouprc/cgroup_controller.cpp @@ -27,6 +27,11 @@ uint32_t ACgroupController_getVersion(const ACgroupController* controller) { return controller->version(); } +uint32_t ACgroupController_getFlags(const ACgroupController* controller) { + CHECK(controller != nullptr); + return controller->flags(); +} + const char* ACgroupController_getName(const ACgroupController* controller) { CHECK(controller != nullptr); return controller->name(); diff --git a/libprocessgroup/cgrouprc/include/android/cgrouprc.h b/libprocessgroup/cgrouprc/include/android/cgrouprc.h index 0f6a9cd5d..0ce51237a 100644 --- a/libprocessgroup/cgrouprc/include/android/cgrouprc.h +++ b/libprocessgroup/cgrouprc/include/android/cgrouprc.h @@ -66,10 +66,21 @@ __attribute__((warn_unused_result)) uint32_t ACgroupController_getVersion(const __INTRODUCED_IN(29); /** - * Flag bitmask to be used when ACgroupController_getFlags can be exported + * Flag bitmask used in ACgroupController_getFlags */ #define CGROUPRC_CONTROLLER_FLAG_MOUNTED 0x1 +#if __ANDROID_API__ >= __ANDROID_API_R__ + +/** + * Returns the flags bitmask of the given controller. + * If the given controller is null, return 0. + */ +__attribute__((warn_unused_result, weak)) uint32_t ACgroupController_getFlags( + const ACgroupController*) __INTRODUCED_IN(30); + +#endif + /** * Returns the name of the given controller. * If the given controller is null, return nullptr. diff --git a/libprocessgroup/cgrouprc/libcgrouprc.llndk.txt b/libprocessgroup/cgrouprc/libcgrouprc.llndk.txt index 91df3929d..ce5c419a3 100644 --- a/libprocessgroup/cgrouprc/libcgrouprc.llndk.txt +++ b/libprocessgroup/cgrouprc/libcgrouprc.llndk.txt @@ -9,3 +9,10 @@ LIBCGROUPRC { # introduced=29 local: *; }; + +LIBCGROUPRC_30 { # introduced=30 + global: + ACgroupController_getFlags; + local: + *; +}; From a37a2bc4151d37486374c9e223afb63e0b266115 Mon Sep 17 00:00:00 2001 From: Muhammad Qureshi Date: Thu, 30 Jan 2020 16:44:53 -0800 Subject: [PATCH 052/388] export libstatssocket_headers Add export_header_lib_headers: ["libstatssocket_headers"] to libstatspush_compat Test: m Change-Id: I70d7a214a5233c6a730b24c9c21b8bd654a78b04 --- libstats/push_compat/Android.bp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libstats/push_compat/Android.bp b/libstats/push_compat/Android.bp index 465c05a37..3e695567a 100644 --- a/libstats/push_compat/Android.bp +++ b/libstats/push_compat/Android.bp @@ -44,6 +44,9 @@ cc_library { name: "libstatspush_compat", defaults: ["libstatspush_compat_defaults"], export_include_dirs: ["include"], + export_header_lib_headers: [ + "libstatssocket_headers", + ], static_libs: ["libgtest_prod"], } From 186b5798d2686458066563dfaf0b3b7324ff45c3 Mon Sep 17 00:00:00 2001 From: Greg Kaiser Date: Fri, 31 Jan 2020 15:17:08 -0800 Subject: [PATCH 053/388] Revert "Mount binderfs" This reverts commit 8e50be74ae03d19c2a2c9e57bc5395905c6b94a6. The breaks the boot of several devices. Test: Local build and boot of wembley Bug: 148689473 Change-Id: I97e96bd86d02a9fe70c5ef02df85c604b0cfb3c3 --- rootdir/init.rc | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/rootdir/init.rc b/rootdir/init.rc index 12b9c20fc..5f4b8c3ab 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -69,19 +69,6 @@ on early-init mkdir /dev/boringssl 0755 root root mkdir /dev/boringssl/selftest 0755 root root - # Mount binderfs - mkdir /dev/binderfs - mount binder binder /dev/binderfs stats=global - chmod 0755 /dev/binderfs - - symlink /dev/binderfs/binder /dev/binder - symlink /dev/binderfs/hwbinder /dev/hwbinder - symlink /dev/binderfs/vndbinder /dev/vndbinder - - chmod 0666 /dev/binderfs/hwbinder - chmod 0666 /dev/binderfs/binder - chmod 0666 /dev/binderfs/vndbinder - # Run boringssl self test for each ABI so that later processes can skip it. http://b/139348610 on early-init && property:ro.product.cpu.abilist32=* exec_start boringssl_self_test32 From e03c360b4db46f57e414c66668c0ef2bc3fac77c Mon Sep 17 00:00:00 2001 From: Howard Ro Date: Fri, 31 Jan 2020 14:55:55 -0800 Subject: [PATCH 054/388] Remove libmetricslogger dependency from bootstats Now that bootstats metrics are migrated to statsd in ag/10082348 and in ag/9957072, we should not need these anymore.(subject to boottime team) Bug: 147777989 Bug: 148575354 Test: compiles Change-Id: I00b110dcf5cf4a0fb1673fe05004662b6f3327d0 --- bootstat/Android.bp | 2 +- bootstat/boot_event_record_store.h | 2 +- bootstat/bootstat.cpp | 32 +++++++++++++++++++----------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/bootstat/Android.bp b/bootstat/Android.bp index 5e2d171ff..edff26df5 100644 --- a/bootstat/Android.bp +++ b/bootstat/Android.bp @@ -30,8 +30,8 @@ cc_defaults { "libbase", "libcutils", "liblog", - "libmetricslogger", ], + static_libs: ["libgtest_prod"], } // bootstat static library diff --git a/bootstat/boot_event_record_store.h b/bootstat/boot_event_record_store.h index f872c85c8..e8523048f 100644 --- a/bootstat/boot_event_record_store.h +++ b/bootstat/boot_event_record_store.h @@ -69,4 +69,4 @@ class BootEventRecordStore { DISALLOW_COPY_AND_ASSIGN(BootEventRecordStore); }; -#endif // BOOT_EVENT_RECORD_STORE_H_ \ No newline at end of file +#endif // BOOT_EVENT_RECORD_STORE_H_ diff --git a/bootstat/bootstat.cpp b/bootstat/bootstat.cpp index 6409db0d5..c5fc154ad 100644 --- a/bootstat/bootstat.cpp +++ b/bootstat/bootstat.cpp @@ -44,7 +44,6 @@ #include #include #include -#include #include #include "boot_event_record_store.h" @@ -57,9 +56,10 @@ void LogBootEvents() { BootEventRecordStore boot_event_store; auto events = boot_event_store.GetAllBootEvents(); - for (auto i = events.cbegin(); i != events.cend(); ++i) { - android::metricslogger::LogHistogram(i->first, i->second); - } + // TODO(b/148575354): Replace with statsd. + // for (auto i = events.cbegin(); i != events.cend(); ++i) { + // android::metricslogger::LogHistogram(i->first, i->second); + // } } // Records the named boot |event| to the record store. If |value| is non-empty @@ -1212,13 +1212,17 @@ void RecordBootReason() { const auto reason = android::base::GetProperty(bootloader_reboot_reason_property, ""); if (reason.empty()) { + // TODO(b/148575354): Replace with statsd. // Log an empty boot reason value as '' to ensure the value is intentional // (and not corruption anywhere else in the reporting pipeline). - android::metricslogger::LogMultiAction(android::metricslogger::ACTION_BOOT, - android::metricslogger::FIELD_PLATFORM_REASON, ""); + // android::metricslogger::LogMultiAction(android::metricslogger::ACTION_BOOT, + // android::metricslogger::FIELD_PLATFORM_REASON, + // ""); } else { - android::metricslogger::LogMultiAction(android::metricslogger::ACTION_BOOT, - android::metricslogger::FIELD_PLATFORM_REASON, reason); + // TODO(b/148575354): Replace with statsd. + // android::metricslogger::LogMultiAction(android::metricslogger::ACTION_BOOT, + // android::metricslogger::FIELD_PLATFORM_REASON, + // reason); } // Log the raw bootloader_boot_reason property value. @@ -1246,9 +1250,11 @@ void RecordFactoryReset() { time_t current_time_utc = time(nullptr); if (current_time_utc < 0) { + // TODO(b/148575354): Replace with statsd. // UMA does not display negative values in buckets, so convert to positive. - android::metricslogger::LogHistogram("factory_reset_current_time_failure", - std::abs(current_time_utc)); + // Logging via BootEventRecordStore. + // android::metricslogger::LogHistogram("factory_reset_current_time_failure", + // std::abs(current_time_utc)); // Logging via BootEventRecordStore to see if using android::metricslogger::LogHistogram // is losing records somehow. @@ -1256,7 +1262,8 @@ void RecordFactoryReset() { std::abs(current_time_utc)); return; } else { - android::metricslogger::LogHistogram("factory_reset_current_time", current_time_utc); + // TODO(b/148575354): Replace with statsd. + // android::metricslogger::LogHistogram("factory_reset_current_time", current_time_utc); // Logging via BootEventRecordStore to see if using android::metricslogger::LogHistogram // is losing records somehow. @@ -1276,7 +1283,8 @@ void RecordFactoryReset() { // Calculate and record the difference in time between now and the // factory_reset time. time_t factory_reset_utc = record.second; - android::metricslogger::LogHistogram("factory_reset_record_value", factory_reset_utc); + // TODO(b/148575354): Replace with statsd. + // android::metricslogger::LogHistogram("factory_reset_record_value", factory_reset_utc); // Logging via BootEventRecordStore to see if using android::metricslogger::LogHistogram // is losing records somehow. From 317b738176c8208ca811a097fd089f4b5ccfd61b Mon Sep 17 00:00:00 2001 From: Howard Ro Date: Fri, 31 Jan 2020 16:54:24 -0800 Subject: [PATCH 055/388] Deprecate libmetricslogger There's no more usage of libmetricslogger. Bug: 147777989 Test: compiles and confirmed that there's no usage of it Change-Id: Ie990f7f1651b7717f21553481dc8635a01993777 --- libmetricslogger/Android.bp | 64 ------- libmetricslogger/OWNERS | 2 - .../include/metricslogger/metrics_logger.h | 159 ------------------ libmetricslogger/metrics_logger.cpp | 125 -------------- libmetricslogger/metrics_logger_test.cpp | 28 --- 5 files changed, 378 deletions(-) delete mode 100644 libmetricslogger/Android.bp delete mode 100644 libmetricslogger/OWNERS delete mode 100644 libmetricslogger/include/metricslogger/metrics_logger.h delete mode 100644 libmetricslogger/metrics_logger.cpp delete mode 100644 libmetricslogger/metrics_logger_test.cpp diff --git a/libmetricslogger/Android.bp b/libmetricslogger/Android.bp deleted file mode 100644 index 7d7554b43..000000000 --- a/libmetricslogger/Android.bp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2017 The Android Open Source Project - -metricslogger_lib_src_files = [ - "metrics_logger.cpp", -] - -cc_defaults { - name: "metricslogger_defaults", - - host_supported: true, - - export_include_dirs: ["include"], - local_include_dirs: ["include"], - shared_libs: [ - "libbase", - "liblog", - "libstatssocket", - ], - whole_static_libs: ["libgtest_prod"], - - cflags: [ - "-Wall", - "-Wextra", - "-Werror", - ], -} - -// metricslogger shared library -// ----------------------------------------------------------------------------- -cc_library { - name: "libmetricslogger", - srcs: metricslogger_lib_src_files, - defaults: ["metricslogger_defaults"], - export_shared_lib_headers: ["libstatssocket"], -} - -// metricslogger shared library, debug -// ----------------------------------------------------------------------------- -cc_library_shared { - name: "libmetricslogger_debug", - srcs: metricslogger_lib_src_files, - defaults: ["metricslogger_defaults"], - - target: { - host: { - cflags: ["-UNDEBUG"], - }, - }, -} - -// Native tests -// ----------------------------------------------------------------------------- -cc_test { - name: "metricslogger_tests", - isolated: true, - defaults: ["metricslogger_defaults"], - shared_libs: [ - "libbase", - "libmetricslogger_debug", - ], - srcs: [ - "metrics_logger_test.cpp", - ], -} diff --git a/libmetricslogger/OWNERS b/libmetricslogger/OWNERS deleted file mode 100644 index 6a6fba2ad..000000000 --- a/libmetricslogger/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -cwren@google.com -jhawkins@google.com diff --git a/libmetricslogger/include/metricslogger/metrics_logger.h b/libmetricslogger/include/metricslogger/metrics_logger.h deleted file mode 100644 index 71c04a6ab..000000000 --- a/libmetricslogger/include/metricslogger/metrics_logger.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2017 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 - -namespace android { -namespace metricslogger { - -// Logs a Tron histogram metric named |event| containing |data| to the Tron log -// buffer. -void LogHistogram(const std::string& event, int32_t data); - -// Logs a Tron counter metric named |name| containing |val| count to the Tron -// log buffer. -void LogCounter(const std::string& name, int32_t val); - -// Logs a Tron multi_action with category|category| containing the string -// |value| in the field |field|. -void LogMultiAction(int32_t category, int32_t field, const std::string& value); - -// Logs a Tron complex event. -// -// A complex event can include data in a structure not suppored by the other -// log event types above. -// -// Note that instances of this class are single use. You must call Record() -// to write the event to the event log. -class ComplexEventLogger { - private: - android_log_event_list logger; - stats_event_list stats_logger; - - public: - // Create a complex event with category|category|. - explicit ComplexEventLogger(int category); - // Set the package name that this event originates from. - void SetPackageName(const std::string& package_name); - // Add tagged data to the event, with the given tag and integer value. - void AddTaggedData(int tag, int32_t value); - // Add tagged data to the event, with the given tag and string value. - void AddTaggedData(int tag, const std::string& value); - // Add tagged data to the event, with the given tag and integer value. - void AddTaggedData(int tag, int64_t value); - // Add tagged data to the event, with the given tag and float value. - void AddTaggedData(int tag, float value); - // Record this event. This method can only be used once per instance - // of ComplexEventLogger. Do not made any subsequent calls to AddTaggedData - // after recording an event. - void Record(); -}; - -// TODO: replace these with the metric_logger.proto definitions -enum { - LOGBUILDER_CATEGORY = 757, - LOGBUILDER_TYPE = 758, - LOGBUILDER_NAME = 799, - LOGBUILDER_BUCKET = 801, - LOGBUILDER_VALUE = 802, - LOGBUILDER_COUNTER = 803, - LOGBUILDER_HISTOGRAM = 804, - LOGBUILDER_PACKAGENAME = 806, - - ACTION_BOOT = 1098, - FIELD_PLATFORM_REASON = 1099, - - FIELD_DURATION_MILLIS = 1304, - - FIELD_END_BATTERY_PERCENT = 1308, - - ACTION_HIDDEN_API_ACCESSED = 1391, - FIELD_HIDDEN_API_ACCESS_METHOD = 1392, - FIELD_HIDDEN_API_ACCESS_DENIED = 1393, - FIELD_HIDDEN_API_SIGNATURE = 1394, - - ACTION_USB_CONNECTOR_CONNECTED = 1422, - ACTION_USB_CONNECTOR_DISCONNECTED = 1423, - ACTION_USB_AUDIO_CONNECTED = 1424, - FIELD_USB_AUDIO_VIDPID = 1425, - ACTION_USB_AUDIO_DISCONNECTED = 1426, - ACTION_HARDWARE_FAILED = 1427, - FIELD_HARDWARE_TYPE = 1428, - FIELD_HARDWARE_FAILURE_CODE = 1429, - ACTION_PHYSICAL_DROP = 1430, - FIELD_CONFIDENCE_PERCENT = 1431, - FIELD_ACCEL_MILLI_G = 1432, - ACTION_BATTERY_HEALTH = 1433, - FIELD_BATTERY_HEALTH_SNAPSHOT_TYPE = 1434, - FIELD_BATTERY_TEMPERATURE_DECI_C = 1435, - FIELD_BATTERY_VOLTAGE_UV = 1436, - FIELD_BATTERY_OPEN_CIRCUIT_VOLTAGE_UV = 1437, - ACTION_BATTERY_CHARGE_CYCLES = 1438, - FIELD_BATTERY_CHARGE_CYCLES = 1439, - - ACTION_SLOW_IO = 1442, - FIELD_IO_OPERATION_TYPE = 1443, - FIELD_IO_OPERATION_COUNT = 1444, - ACTION_SPEAKER_IMPEDANCE = 1445, - FIELD_SPEAKER_IMPEDANCE_MILLIOHMS = 1446, - FIELD_SPEAKER_LOCATION = 1447, - FIELD_BATTERY_RESISTANCE_UOHMS = 1448, - FIELD_BATTERY_CURRENT_UA = 1449, - FIELD_HARDWARE_LOCATION = 1450, - ACTION_BATTERY_CAUSED_SHUTDOWN = 1451, -}; - -enum { - TYPE_ACTION = 4, -}; - -enum { - ACCESS_METHOD_NONE = 0, - ACCESS_METHOD_REFLECTION = 1, - ACCESS_METHOD_JNI = 2, - ACCESS_METHOD_LINKING = 3, -}; - -enum HardwareType { - HARDWARE_UNKNOWN = 0, - HARDWARE_MICROPHONE = 1, - HARDWARE_CODEC = 2, - HARDWARE_SPEAKER = 3, - HARDWARE_FINGERPRINT = 4, -}; - -enum HardwareFailureCode { - HARDWARE_FAILURE_UNKNOWN = 0, - HARDWARE_FAILURE_COMPLETE = 1, - HARDWARE_FAILURE_SPEAKER_HIGH_Z = 2, - HARDWARE_FAILURE_SPEAKER_SHORT = 3, - HARDWARE_FAILURE_FINGERPRINT_SENSOR_BROKEN = 4, - HARDWARE_FAILURE_FINGERPRINT_TOO_MANY_DEAD_PIXELS = 5, -}; - -enum IoOperation { - IOOP_UNKNOWN = 0, - IOOP_READ = 1, - IOOP_WRITE = 2, - IOOP_UNMAP = 3, - IOOP_SYNC = 4, -}; - -} // namespace metricslogger -} // namespace android diff --git a/libmetricslogger/metrics_logger.cpp b/libmetricslogger/metrics_logger.cpp deleted file mode 100644 index 2a1b13705..000000000 --- a/libmetricslogger/metrics_logger.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2017 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 "metricslogger/metrics_logger.h" - -#include - -#include -#include - -using namespace android; - -namespace { - -const static int kStatsEventTag = 1937006964; -const static int kKeyValuePairAtomId = 83; -#ifdef __ANDROID__ -EventTagMap* kEventTagMap = android_openEventTagMap(nullptr); -const int kSysuiMultiActionTag = android_lookupEventTagNum( - kEventTagMap, "sysui_multi_action", "(content|4)", ANDROID_LOG_UNKNOWN); -#else -// android_openEventTagMap does not work on host builds. -const int kSysuiMultiActionTag = 0; -#endif - -int64_t getElapsedTimeNanoSinceBoot() { - return std::chrono::duration_cast( - android::base::boot_clock::now().time_since_epoch()) - .count(); -} - -} // namespace - -namespace android { -namespace metricslogger { - -// Mirror com.android.internal.logging.MetricsLogger#histogram(). -void LogHistogram(const std::string& event, int32_t data) { - android_log_event_list log(kSysuiMultiActionTag); - log << LOGBUILDER_CATEGORY << LOGBUILDER_HISTOGRAM << LOGBUILDER_NAME << event - << LOGBUILDER_BUCKET << data << LOGBUILDER_VALUE << 1 << LOG_ID_EVENTS; - - stats_event_list stats_log(kStatsEventTag); - stats_log << getElapsedTimeNanoSinceBoot() << kKeyValuePairAtomId << LOGBUILDER_CATEGORY - << LOGBUILDER_HISTOGRAM << LOGBUILDER_NAME << event << LOGBUILDER_BUCKET << data - << LOGBUILDER_VALUE << 1; - stats_log.write(LOG_ID_STATS); -} - -// Mirror com.android.internal.logging.MetricsLogger#count(). -void LogCounter(const std::string& name, int32_t val) { - android_log_event_list log(kSysuiMultiActionTag); - log << LOGBUILDER_CATEGORY << LOGBUILDER_COUNTER << LOGBUILDER_NAME << name << LOGBUILDER_VALUE - << val << LOG_ID_EVENTS; - - stats_event_list stats_log(kStatsEventTag); - stats_log << getElapsedTimeNanoSinceBoot() << kKeyValuePairAtomId << LOGBUILDER_CATEGORY - << LOGBUILDER_COUNTER << LOGBUILDER_NAME << name << LOGBUILDER_VALUE << val; - stats_log.write(LOG_ID_STATS); -} - -// Mirror com.android.internal.logging.MetricsLogger#action(). -void LogMultiAction(int32_t category, int32_t field, const std::string& value) { - android_log_event_list log(kSysuiMultiActionTag); - log << LOGBUILDER_CATEGORY << category << LOGBUILDER_TYPE << TYPE_ACTION - << field << value << LOG_ID_EVENTS; - - stats_event_list stats_log(kStatsEventTag); - stats_log << getElapsedTimeNanoSinceBoot() << kKeyValuePairAtomId << LOGBUILDER_CATEGORY - << category << LOGBUILDER_TYPE << TYPE_ACTION << field << value; - stats_log.write(LOG_ID_STATS); -} - -ComplexEventLogger::ComplexEventLogger(int category) - : logger(kSysuiMultiActionTag), stats_logger(kStatsEventTag) { - logger << LOGBUILDER_CATEGORY << category; - stats_logger << getElapsedTimeNanoSinceBoot() << kKeyValuePairAtomId << LOGBUILDER_CATEGORY - << category; -} - -void ComplexEventLogger::SetPackageName(const std::string& package_name) { - logger << LOGBUILDER_PACKAGENAME << package_name; - stats_logger << LOGBUILDER_PACKAGENAME << package_name; -} - -void ComplexEventLogger::AddTaggedData(int tag, int32_t value) { - logger << tag << value; - stats_logger << tag << value; -} - -void ComplexEventLogger::AddTaggedData(int tag, const std::string& value) { - logger << tag << value; - stats_logger << tag << value; -} - -void ComplexEventLogger::AddTaggedData(int tag, int64_t value) { - logger << tag << value; - stats_logger << tag << value; -} - -void ComplexEventLogger::AddTaggedData(int tag, float value) { - logger << tag << value; - stats_logger << tag << value; -} - -void ComplexEventLogger::Record() { - logger << LOG_ID_EVENTS; - stats_logger.write(LOG_ID_STATS); -} - -} // namespace metricslogger -} // namespace android diff --git a/libmetricslogger/metrics_logger_test.cpp b/libmetricslogger/metrics_logger_test.cpp deleted file mode 100644 index 440645cb8..000000000 --- a/libmetricslogger/metrics_logger_test.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2016 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 "metricslogger/metrics_logger.h" - -#include - -TEST(MetricsLoggerTest, AddSingleBootEvent) { - android::metricslogger::LogHistogram("test_event", 42); - // TODO(jhawkins): Verify the EventLog is updated. -} - -TEST(MetricsLoggerTest, AddCounterVal) { - android::metricslogger::LogCounter("test_count", 10); -} From a8fd39d83ffe19051909ead5a8a18230eb43f5bd Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Tue, 14 Jan 2020 13:46:27 -0800 Subject: [PATCH 056/388] Expose libstatspull as a stable C API Libstatspull will ship as a part of the statsd apex in R. Also update libstatssocket to have version 30 to align with api level, as per native api council feedback. Change both libraries to use NDK style naming conventions (AStatsEvent, AStatsManager), and remove unneeded APIs in libstatssocket. Remove KeyValuePairs from libstatssocket. KeyValuePairs will not be supported in native code. Bug: 147499386 Test: make libstatspull Test: make libstatssocket Test: atest libstatssocket_test Change-Id: Ie79771461215a057529aaac91db95e4334c3960e --- libstats/pull/Android.bp | 11 +- .../pull/include/stats_pull_atom_callback.h | 119 ++++++++-- libstats/pull/libstatspull.map.txt | 13 ++ libstats/pull/stats_pull_atom_callback.cpp | 67 ++++-- libstats/push_compat/StatsEventCompat.cpp | 63 +++-- .../push_compat/include/StatsEventCompat.h | 5 +- libstats/socket/Android.bp | 2 +- .../benchmark/stats_event_benchmark.cpp | 26 +-- libstats/socket/include/stats_event.h | 217 +++++++++--------- libstats/socket/libstatssocket.map.txt | 32 ++- libstats/socket/stats_event.c | 148 +++++------- libstats/socket/tests/stats_event_test.cpp | 186 +++++++-------- 12 files changed, 482 insertions(+), 407 deletions(-) create mode 100644 libstats/pull/libstatspull.map.txt diff --git a/libstats/pull/Android.bp b/libstats/pull/Android.bp index 72eb0e969..2171aa47f 100644 --- a/libstats/pull/Android.bp +++ b/libstats/pull/Android.bp @@ -32,7 +32,7 @@ cc_library_shared { ], export_include_dirs: ["include"], shared_libs: [ - //TODO: use libbinder_ndk. + //TODO: use libbinder_ndk. Remove libservices. "libbinder", "libstatssocket", "libservices", @@ -40,5 +40,12 @@ cc_library_shared { static_libs: [ "liblog", "libutils", - ] + ], + // enumerate stable entry points for APEX use + stubs: { + symbol_file: "libstatspull.map.txt", + versions: [ + "30", + ], + }, } diff --git a/libstats/pull/include/stats_pull_atom_callback.h b/libstats/pull/include/stats_pull_atom_callback.h index b779ac98a..ad9b04edc 100644 --- a/libstats/pull/include/stats_pull_atom_callback.h +++ b/libstats/pull/include/stats_pull_atom_callback.h @@ -15,41 +15,122 @@ */ #pragma once +#include + #include #include #ifdef __cplusplus extern "C" { #endif -/* - * Metadata for registering a stats_pull_atom_callback. + +/** + * Opaque struct representing the metadata for registering an AStatsManager_PullAtomCallback. */ -typedef struct pull_atom_metadata { - int64_t cool_down_ns; - int64_t timeout_ns; - int32_t* additive_fields; - int32_t additive_fields_size; -} pull_atom_metadata; +struct AStatsManager_PullAtomMetadata; +typedef struct AStatsManager_PullAtomMetadata AStatsManager_PullAtomMetadata; -typedef struct pulled_stats_event_list pulled_stats_event_list; +/** + * Allocate and initialize new PullAtomMetadata. + * + * Must call AStatsManager_PullAtomMetadata_release to free the memory. + */ +AStatsManager_PullAtomMetadata* AStatsManager_PullAtomMetadata_obtain(); -typedef int32_t status_pull_atom_return_t; +/** + * Frees the memory held by this PullAtomMetadata + * + * After calling this, the PullAtomMetadata must not be used or modified in any way. + */ +void AStatsManager_PullAtomMetadata_release(AStatsManager_PullAtomMetadata* metadata); +/** + * Set the cool down time of the pull in nanoseconds. If two successive pulls are issued + * within the cool down, a cached version of the first will be used for the second. + */ +void AStatsManager_PullAtomMetadata_setCoolDownNs(AStatsManager_PullAtomMetadata* metadata, + int64_t cool_down_ns); + +/** + * Set the maximum time the pull can take in nanoseconds. + */ +void AStatsManager_PullAtomMetadata_setTimeoutNs(AStatsManager_PullAtomMetadata* metadata, + int64_t timeout_ns); + +/** + * Set the additive fields of this pulled atom. + * + * This is only applicable for atoms which have a uid field. When tasks are run in + * isolated processes, the data will be attributed to the host uid. Additive fields + * will be combined when the non-additive fields are the same. + */ +void AStatsManager_PullAtomMetadata_setAdditiveFields(AStatsManager_PullAtomMetadata* metadata, + int* additive_fields, int num_fields); + +/** + * Return codes for the result of a pull. + */ +typedef int32_t AStatsManager_PullAtomCallbackReturn; enum { - STATS_PULL_SUCCESS = 0, - STATS_PULL_SKIP = 1, + // Value indicating that this pull was successful and that the result should be used. + AStatsManager_PULL_SUCCESS = 0, + // Value indicating that this pull was unsuccessful and that the result should not be used. + AStatsManager_PULL_SKIP = 1, }; -typedef status_pull_atom_return_t (*stats_pull_atom_callback_t)(int32_t atom_tag, - pulled_stats_event_list* data, - void* cookie); +/** + * Opaque struct representing a list of AStatsEvent objects. + */ +struct AStatsEventList; +typedef struct AStatsEventList AStatsEventList; -struct stats_event* add_stats_event_to_pull_data(pulled_stats_event_list* pull_data); +/** + * Appends and returns an AStatsEvent to the end of the AStatsEventList. + * + * If an AStatsEvent is obtained in this manner, the memory is internally managed and + * AStatsEvent_release does not need to be called. The lifetime of the AStatsEvent is that of the + * AStatsEventList. + * + * The AStatsEvent does still need to be built by calling AStatsEvent_build. + */ +AStatsEvent* AStatsEventList_addStatsEvent(AStatsEventList* pull_data); -void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t callback, - pull_atom_metadata* metadata, void* cookie); +/** + * Callback interface for pulling atoms requested by the stats service. + * + * \param atom_tag the tag of the atom to pull. + * \param data an output parameter in which the caller should fill the results of the pull. This + * param cannot be NULL and it's lifetime is as long as the execution of the callback. + * It must not be accessed or modified after returning from the callback. + * \param cookie the opaque pointer passed in AStatsManager_registerPullAtomCallback. + * \return AStatsManager_PULL_SUCCESS if the pull was successful, or AStatsManager_PULL_SKIP if not. + */ +typedef AStatsManager_PullAtomCallbackReturn (*AStatsManager_PullAtomCallback)( + int32_t atom_tag, AStatsEventList* data, void* cookie); +/** + * Registers a callback for an atom when that atom is to be pulled. The stats service will + * invoke the callback when the stats service determines that this atom needs to be + * pulled. + * + * \param atom_tag The tag of the atom for this pull atom callback. + * \param metadata Optional metadata specifying the timeout, cool down time, and + * additive fields for mapping isolated to host uids. + * This param is nullable, in which case defaults will be used. + * \param callback The callback to be invoked when the stats service pulls the atom. + * \param cookie A pointer that will be passed back to the callback. + * It has no meaning to statsd. + */ +void AStatsManager_registerPullAtomCallback(int32_t atom_tag, + AStatsManager_PullAtomCallback callback, + AStatsManager_PullAtomMetadata* metadata, void* cookie); -void unregister_stats_pull_atom_callback(int32_t atom_tag); +/** + * Unregisters a callback for an atom when that atom is to be pulled. Note that any ongoing + * pulls will still occur. + * + * \param atomTag The tag of the atom of which to unregister + */ +void AStatsManager_unregisterPullAtomCallback(int32_t atom_tag); #ifdef __cplusplus } diff --git a/libstats/pull/libstatspull.map.txt b/libstats/pull/libstatspull.map.txt new file mode 100644 index 000000000..dc3fd8b04 --- /dev/null +++ b/libstats/pull/libstatspull.map.txt @@ -0,0 +1,13 @@ +LIBSTATSPULL { + global: + AStatsManager_PullAtomMetadata_obtain; # apex # introduced=30 + AStatsManager_PullAtomMetadata_release; # apex # introduced=30 + AStatsManager_PullAtomMetadata_setCoolDownNs; # apex # introduced=30 + AStatsManager_PullAtomMetadata_setTimeoutNs; # apex # introduced=30 + AStatsManager_PullAtomMetadata_setAdditiveFields; # apex # introduced=30 + AStatsEventList_addStatsEvent; # apex # introduced=30 + AStatsManager_registerPullAtomCallback; # apex # introduced=30 + AStatsManager_unregisterPullAtomCallback; # apex # introduced=30 + local: + *; +}; diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp index e8fc2ea32..9c497b8ea 100644 --- a/libstats/pull/stats_pull_atom_callback.cpp +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -28,12 +28,12 @@ #include -struct pulled_stats_event_list { - std::vector data; +struct AStatsEventList { + std::vector data; }; -struct stats_event* add_stats_event_to_pull_data(pulled_stats_event_list* pull_data) { - struct stats_event* event = stats_event_obtain(); +AStatsEvent* AStatsEventList_addStatsEvent(AStatsEventList* pull_data) { + AStatsEvent* event = AStatsEvent_obtain(); pull_data->data.push_back(event); return event; } @@ -41,9 +41,42 @@ struct stats_event* add_stats_event_to_pull_data(pulled_stats_event_list* pull_d static const int64_t DEFAULT_COOL_DOWN_NS = 1000000000LL; // 1 second. static const int64_t DEFAULT_TIMEOUT_NS = 10000000000LL; // 10 seconds. +struct AStatsManager_PullAtomMetadata { + int64_t cool_down_ns; + int64_t timeout_ns; + std::vector additive_fields; +}; + +AStatsManager_PullAtomMetadata* AStatsManager_PullAtomMetadata_obtain() { + AStatsManager_PullAtomMetadata* metadata = new AStatsManager_PullAtomMetadata(); + metadata->cool_down_ns = DEFAULT_COOL_DOWN_NS; + metadata->timeout_ns = DEFAULT_TIMEOUT_NS; + metadata->additive_fields = std::vector(); + return metadata; +} + +void AStatsManager_PullAtomMetadata_release(AStatsManager_PullAtomMetadata* metadata) { + delete metadata; +} + +void AStatsManager_PullAtomMetadata_setCoolDownNs(AStatsManager_PullAtomMetadata* metadata, + int64_t cool_down_ns) { + metadata->cool_down_ns = cool_down_ns; +} + +void AStatsManager_PullAtomMetadata_setTimeoutNs(AStatsManager_PullAtomMetadata* metadata, + int64_t timeout_ns) { + metadata->timeout_ns = timeout_ns; +} + +void AStatsManager_PullAtomMetadata_setAdditiveFields(AStatsManager_PullAtomMetadata* metadata, + int* additive_fields, int num_fields) { + metadata->additive_fields.assign(additive_fields, additive_fields + num_fields); +} + class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { public: - StatsPullAtomCallbackInternal(const stats_pull_atom_callback_t callback, void* cookie, + StatsPullAtomCallbackInternal(const AStatsManager_PullAtomCallback callback, void* cookie, const int64_t coolDownNs, const int64_t timeoutNs, const std::vector additiveFields) : mCallback(callback), @@ -55,15 +88,16 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { ::android::binder::Status onPullAtom( int32_t atomTag, const ::android::sp<::android::os::IPullAtomResultReceiver>& resultReceiver) override { - pulled_stats_event_list statsEventList; + AStatsEventList statsEventList; + statsEventList.data.clear(); int successInt = mCallback(atomTag, &statsEventList, mCookie); - bool success = successInt == STATS_PULL_SUCCESS; + bool success = successInt == AStatsManager_PULL_SUCCESS; // Convert stats_events into StatsEventParcels. std::vector parcels; for (int i = 0; i < statsEventList.data.size(); i++) { size_t size; - uint8_t* buffer = stats_event_get_buffer(statsEventList.data[i], &size); + uint8_t* buffer = AStatsEvent_getBuffer(statsEventList.data[i], &size); android::util::StatsEventParcel p; // vector.assign() creates a copy, but this is inevitable unless @@ -74,7 +108,7 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { resultReceiver->pullFinished(atomTag, success, parcels); for (int i = 0; i < statsEventList.data.size(); i++) { - stats_event_release(statsEventList.data[i]); + AStatsEvent_release(statsEventList.data[i]); } return android::binder::Status::ok(); } @@ -84,7 +118,7 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { const std::vector& getAdditiveFields() const { return mAdditiveFields; } private: - const stats_pull_atom_callback_t mCallback; + const AStatsManager_PullAtomCallback mCallback; void* mCookie; const int64_t mCoolDownNs; const int64_t mTimeoutNs; @@ -165,15 +199,16 @@ void unregisterStatsPullAtomCallbackBlocking(int32_t atomTag) { statsService->unregisterNativePullAtomCallback(atomTag); } -void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callback_t callback, - pull_atom_metadata* metadata, void* cookie) { +void AStatsManager_registerPullAtomCallback(int32_t atom_tag, + AStatsManager_PullAtomCallback callback, + AStatsManager_PullAtomMetadata* metadata, + void* cookie) { int64_t coolDownNs = metadata == nullptr ? DEFAULT_COOL_DOWN_NS : metadata->cool_down_ns; int64_t timeoutNs = metadata == nullptr ? DEFAULT_TIMEOUT_NS : metadata->timeout_ns; std::vector additiveFields; - if (metadata != nullptr && metadata->additive_fields != nullptr) { - additiveFields.assign(metadata->additive_fields, - metadata->additive_fields + metadata->additive_fields_size); + if (metadata != nullptr) { + additiveFields = metadata->additive_fields; } android::sp callbackBinder = new StatsPullAtomCallbackInternal( @@ -189,7 +224,7 @@ void register_stats_pull_atom_callback(int32_t atom_tag, stats_pull_atom_callbac registerThread.detach(); } -void unregister_stats_pull_atom_callback(int32_t atom_tag) { +void AStatsManager_unregisterPullAtomCallback(int32_t atom_tag) { { std::lock_guard lg(pullAtomMutex); // Always remove the puller from our map. diff --git a/libstats/push_compat/StatsEventCompat.cpp b/libstats/push_compat/StatsEventCompat.cpp index edfa070ed..de458b3e5 100644 --- a/libstats/push_compat/StatsEventCompat.cpp +++ b/libstats/push_compat/StatsEventCompat.cpp @@ -38,7 +38,7 @@ const bool StatsEventCompat::mPlatformAtLeastR = // definitions of static class variables bool StatsEventCompat::mAttemptedLoad = false; -struct stats_event_api_table* StatsEventCompat::mStatsEventApi = nullptr; +void* StatsEventCompat::mStatsEventApi = nullptr; std::mutex StatsEventCompat::mLoadLock; StatsEventCompat::StatsEventCompat() : mEventQ(kStatsEventTag) { @@ -49,7 +49,8 @@ StatsEventCompat::StatsEventCompat() : mEventQ(kStatsEventTag) { if (!mAttemptedLoad) { void* handle = dlopen("libstatssocket.so", RTLD_NOW); if (handle) { - mStatsEventApi = (struct stats_event_api_table*)dlsym(handle, "table"); + // mStatsEventApi = (struct AStatsEvent_apiTable*)dlsym(handle, + // "table"); } else { ALOGE("dlopen failed: %s\n", dlerror()); } @@ -58,19 +59,19 @@ StatsEventCompat::StatsEventCompat() : mEventQ(kStatsEventTag) { } if (mStatsEventApi) { - mEventR = mStatsEventApi->obtain(); + // mEventR = mStatsEventApi->obtain(); } else if (!mPlatformAtLeastR) { mEventQ << android::elapsedRealtimeNano(); } } StatsEventCompat::~StatsEventCompat() { - if (mStatsEventApi) mStatsEventApi->release(mEventR); + // if (mStatsEventApi) mStatsEventApi->release(mEventR); } void StatsEventCompat::setAtomId(int32_t atomId) { if (mStatsEventApi) { - mStatsEventApi->set_atom_id(mEventR, (uint32_t)atomId); + // mStatsEventApi->setAtomId(mEventR, (uint32_t)atomId); } else if (!mPlatformAtLeastR) { mEventQ << atomId; } @@ -78,7 +79,7 @@ void StatsEventCompat::setAtomId(int32_t atomId) { void StatsEventCompat::writeInt32(int32_t value) { if (mStatsEventApi) { - mStatsEventApi->write_int32(mEventR, value); + // mStatsEventApi->writeInt32(mEventR, value); } else if (!mPlatformAtLeastR) { mEventQ << value; } @@ -86,7 +87,7 @@ void StatsEventCompat::writeInt32(int32_t value) { void StatsEventCompat::writeInt64(int64_t value) { if (mStatsEventApi) { - mStatsEventApi->write_int64(mEventR, value); + // mStatsEventApi->writeInt64(mEventR, value); } else if (!mPlatformAtLeastR) { mEventQ << value; } @@ -94,7 +95,7 @@ void StatsEventCompat::writeInt64(int64_t value) { void StatsEventCompat::writeFloat(float value) { if (mStatsEventApi) { - mStatsEventApi->write_float(mEventR, value); + // mStatsEventApi->writeFloat(mEventR, value); } else if (!mPlatformAtLeastR) { mEventQ << value; } @@ -102,7 +103,7 @@ void StatsEventCompat::writeFloat(float value) { void StatsEventCompat::writeBool(bool value) { if (mStatsEventApi) { - mStatsEventApi->write_bool(mEventR, value); + // mStatsEventApi->writeBool(mEventR, value); } else if (!mPlatformAtLeastR) { mEventQ << value; } @@ -110,7 +111,7 @@ void StatsEventCompat::writeBool(bool value) { void StatsEventCompat::writeByteArray(const char* buffer, size_t length) { if (mStatsEventApi) { - mStatsEventApi->write_byte_array(mEventR, (const uint8_t*)buffer, length); + // mStatsEventApi->writeByteArray(mEventR, (const uint8_t*)buffer, length); } else if (!mPlatformAtLeastR) { mEventQ.AppendCharArray(buffer, length); } @@ -120,7 +121,7 @@ void StatsEventCompat::writeString(const char* value) { if (value == nullptr) value = ""; if (mStatsEventApi) { - mStatsEventApi->write_string8(mEventR, value); + // mStatsEventApi->writeString(mEventR, value); } else if (!mPlatformAtLeastR) { mEventQ << value; } @@ -129,8 +130,8 @@ void StatsEventCompat::writeString(const char* value) { void StatsEventCompat::writeAttributionChain(const int32_t* uids, size_t numUids, const vector& tags) { if (mStatsEventApi) { - mStatsEventApi->write_attribution_chain(mEventR, (const uint32_t*)uids, tags.data(), - (uint8_t)numUids); + // mStatsEventApi->writeAttributionChain(mEventR, (const uint32_t*)uids, tags.data(), + // (uint8_t)numUids); } else if (!mPlatformAtLeastR) { mEventQ.begin(); for (size_t i = 0; i < numUids; i++) { @@ -148,26 +149,8 @@ void StatsEventCompat::writeKeyValuePairs(const map& int32Map, const map& int64Map, const map& stringMap, const map& floatMap) { - if (mStatsEventApi) { - vector pairs; - - for (const auto& it : int32Map) { - pairs.push_back({.key = it.first, .valueType = INT32_TYPE, .int32Value = it.second}); - } - for (const auto& it : int64Map) { - pairs.push_back({.key = it.first, .valueType = INT64_TYPE, .int64Value = it.second}); - } - for (const auto& it : stringMap) { - pairs.push_back({.key = it.first, .valueType = STRING_TYPE, .stringValue = it.second}); - } - for (const auto& it : floatMap) { - pairs.push_back({.key = it.first, .valueType = FLOAT_TYPE, .floatValue = it.second}); - } - - mStatsEventApi->write_key_value_pairs(mEventR, pairs.data(), (uint8_t)pairs.size()); - } - - else if (!mPlatformAtLeastR) { + // Key value pairs are not supported with AStatsEvent. + if (!mPlatformAtLeastR) { mEventQ.begin(); writeKeyValuePairMap(int32Map); writeKeyValuePairMap(int64Map); @@ -194,19 +177,25 @@ template void StatsEventCompat::writeKeyValuePairMap(const map(const map&); void StatsEventCompat::addBoolAnnotation(uint8_t annotationId, bool value) { - if (mStatsEventApi) mStatsEventApi->add_bool_annotation(mEventR, annotationId, value); + // Workaround for unused params. + (void)annotationId; + (void)value; + // if (mStatsEventApi) mStatsEventApi->addBoolAnnotation(mEventR, annotationId, value); // Don't do anything if on Q. } void StatsEventCompat::addInt32Annotation(uint8_t annotationId, int32_t value) { - if (mStatsEventApi) mStatsEventApi->add_int32_annotation(mEventR, annotationId, value); + // Workaround for unused params. + (void)annotationId; + (void)value; + // if (mStatsEventApi) mStatsEventApi->addInt32Annotation(mEventR, annotationId, value); // Don't do anything if on Q. } int StatsEventCompat::writeToSocket() { if (mStatsEventApi) { - mStatsEventApi->build(mEventR); - return mStatsEventApi->write(mEventR); + // mStatsEventApi->build(mEventR); + // return mStatsEventApi->write(mEventR); } if (!mPlatformAtLeastR) return mEventQ.write(LOG_ID_STATS); diff --git a/libstats/push_compat/include/StatsEventCompat.h b/libstats/push_compat/include/StatsEventCompat.h index a8cde681c..ad423a1c9 100644 --- a/libstats/push_compat/include/StatsEventCompat.h +++ b/libstats/push_compat/include/StatsEventCompat.h @@ -57,10 +57,11 @@ class StatsEventCompat { const static bool mPlatformAtLeastR; static bool mAttemptedLoad; static std::mutex mLoadLock; - static struct stats_event_api_table* mStatsEventApi; + // static struct AStatsEvent_apiTable* mStatsEventApi; + static void* mStatsEventApi; // non-static member variables - struct stats_event* mEventR = nullptr; + AStatsEvent* mEventR = nullptr; stats_event_list mEventQ; template diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index 9fd9fbc20..d76a5e779 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -45,7 +45,7 @@ cc_library { stubs: { symbol_file: "libstatssocket.map.txt", versions: [ - "1", + "30", ], } } diff --git a/libstats/socket/benchmark/stats_event_benchmark.cpp b/libstats/socket/benchmark/stats_event_benchmark.cpp index 9488168b5..3fc6e551f 100644 --- a/libstats/socket/benchmark/stats_event_benchmark.cpp +++ b/libstats/socket/benchmark/stats_event_benchmark.cpp @@ -17,14 +17,14 @@ #include "benchmark/benchmark.h" #include "stats_event.h" -static struct stats_event* constructStatsEvent() { - struct stats_event* event = stats_event_obtain(); - stats_event_set_atom_id(event, 100); +static AStatsEvent* constructStatsEvent() { + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, 100); // randomly sample atom size int numElements = rand() % 800; for (int i = 0; i < numElements; i++) { - stats_event_write_int32(event, i); + AStatsEvent_writeInt32(event, i); } return event; @@ -32,10 +32,10 @@ static struct stats_event* constructStatsEvent() { static void BM_stats_event_truncate_buffer(benchmark::State& state) { while (state.KeepRunning()) { - struct stats_event* event = constructStatsEvent(); - stats_event_build(event); - stats_event_write(event); - stats_event_release(event); + AStatsEvent* event = constructStatsEvent(); + AStatsEvent_build(event); + AStatsEvent_write(event); + AStatsEvent_release(event); } } @@ -43,11 +43,11 @@ BENCHMARK(BM_stats_event_truncate_buffer); static void BM_stats_event_full_buffer(benchmark::State& state) { while (state.KeepRunning()) { - struct stats_event* event = constructStatsEvent(); - stats_event_truncate_buffer(event, false); - stats_event_build(event); - stats_event_write(event); - stats_event_release(event); + AStatsEvent* event = constructStatsEvent(); + AStatsEvent_truncateBuffer(event, false); + AStatsEvent_build(event); + AStatsEvent_write(event); + AStatsEvent_release(event); } } diff --git a/libstats/socket/include/stats_event.h b/libstats/socket/include/stats_event.h index 080e957b2..6a2d9cd6e 100644 --- a/libstats/socket/include/stats_event.h +++ b/libstats/socket/include/stats_event.h @@ -26,17 +26,17 @@ * This code defines and encapsulates the socket protocol. * * Usage: - * struct stats_event* event = stats_event_obtain(); + * AStatsEvent* event = AStatsEvent_obtain(); * - * stats_event_set_atom_id(event, atomId); - * stats_event_write_int32(event, 24); - * stats_event_add_bool_annotation(event, 1, true); // annotations apply to the previous field - * stats_event_add_int32_annotation(event, 2, 128); - * stats_event_write_float(event, 2.0); + * AStatsEvent_setAtomId(event, atomId); + * AStatsEvent_writeInt32(event, 24); + * AStatsEvent_addBoolAnnotation(event, 1, true); // annotations apply to the previous field + * AStatsEvent_addInt32Annotation(event, 2, 128); + * AStatsEvent_writeFloat(event, 2.0); * - * stats_event_build(event); - * stats_event_write(event); - * stats_event_release(event); + * AStatsEvent_build(event); + * AStatsEvent_write(event); + * AStatsEvent_release(event); * * Notes: * (a) write_() and add__annotation() should be called in the order that fields @@ -47,115 +47,118 @@ * (e) All strings should be encoded using UTF8. */ -/* ERRORS */ -#define ERROR_NO_TIMESTAMP 0x1 -#define ERROR_NO_ATOM_ID 0x2 -#define ERROR_OVERFLOW 0x4 -#define ERROR_ATTRIBUTION_CHAIN_TOO_LONG 0x8 -#define ERROR_TOO_MANY_KEY_VALUE_PAIRS 0x10 -#define ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD 0x20 -#define ERROR_INVALID_ANNOTATION_ID 0x40 -#define ERROR_ANNOTATION_ID_TOO_LARGE 0x80 -#define ERROR_TOO_MANY_ANNOTATIONS 0x100 -#define ERROR_TOO_MANY_FIELDS 0x200 -#define ERROR_INVALID_VALUE_TYPE 0x400 -#define ERROR_STRING_NOT_NULL_TERMINATED 0x800 - -/* TYPE IDS */ -#define INT32_TYPE 0x00 -#define INT64_TYPE 0x01 -#define STRING_TYPE 0x02 -#define LIST_TYPE 0x03 -#define FLOAT_TYPE 0x04 -#define BOOL_TYPE 0x05 -#define BYTE_ARRAY_TYPE 0x06 -#define OBJECT_TYPE 0x07 -#define KEY_VALUE_PAIRS_TYPE 0x08 -#define ATTRIBUTION_CHAIN_TYPE 0x09 -#define ERROR_TYPE 0x0F - #ifdef __cplusplus extern "C" { #endif // __CPLUSPLUS -struct stats_event; - -/* SYSTEM API */ -struct stats_event* stats_event_obtain(); -// The build function can be called multiple times without error. If the event -// has been built before, this function is a no-op. -void stats_event_build(struct stats_event* event); -int stats_event_write(struct stats_event* event); -void stats_event_release(struct stats_event* event); - -void stats_event_set_atom_id(struct stats_event* event, uint32_t atomId); - -void stats_event_write_int32(struct stats_event* event, int32_t value); -void stats_event_write_int64(struct stats_event* event, int64_t value); -void stats_event_write_float(struct stats_event* event, float value); -void stats_event_write_bool(struct stats_event* event, bool value); - -void stats_event_write_byte_array(struct stats_event* event, const uint8_t* buf, size_t numBytes); - -// Buf must be null-terminated. -void stats_event_write_string8(struct stats_event* event, const char* value); - -// Tags must be null-terminated. -void stats_event_write_attribution_chain(struct stats_event* event, const uint32_t* uids, - const char* const* tags, uint8_t numNodes); - -/* key_value_pair struct can be constructed as follows: - * struct key_value_pair pair = {.key = key, .valueType = STRING_TYPE, - * .stringValue = buf}; +/** + * Opaque struct use to represent a StatsEvent. It builds and stores the data that is sent to + * statsd. */ -struct key_value_pair { - int32_t key; - uint8_t valueType; // expected to be INT32_TYPE, INT64_TYPE, FLOAT_TYPE, or STRING_TYPE - union { - int32_t int32Value; - int64_t int64Value; - float floatValue; - const char* stringValue; // must be null terminated - }; -}; +struct AStatsEvent; +typedef struct AStatsEvent AStatsEvent; -void stats_event_write_key_value_pairs(struct stats_event* event, struct key_value_pair* pairs, - uint8_t numPairs); +/** + * Returns a new AStatsEvent. If you call this function, you must call AStatsEvent_release to free + * the allocated memory. + */ +AStatsEvent* AStatsEvent_obtain(); -void stats_event_add_bool_annotation(struct stats_event* event, uint8_t annotationId, bool value); -void stats_event_add_int32_annotation(struct stats_event* event, uint8_t annotationId, - int32_t value); +/** + * Builds and finalizes the StatsEvent. + * + * After this function, the StatsEvent must not be modified in any way other than calling release or + * write. Build must be always be called before AStatsEvent_write. + * + * Build can be called multiple times without error. + * If the event has been built before, this function is a no-op. + */ +void AStatsEvent_build(AStatsEvent* event); -uint32_t stats_event_get_atom_id(struct stats_event* event); +/** + * Writes the StatsEvent to the stats log. + * + * After calling this, AStatsEvent_release must be called, + * and is the only function that can be safely called. + */ +int AStatsEvent_write(AStatsEvent* event); + +/** + * Frees the memory held by this StatsEvent + * + * After calling this, the StatsEvent must not be used or modified in any way. + */ +void AStatsEvent_release(AStatsEvent* event); + +/** + * Sets the atom id for this StatsEvent. + **/ +void AStatsEvent_setAtomId(AStatsEvent* event, uint32_t atomId); + +/** + * Writes an int32_t field to this StatsEvent. + **/ +void AStatsEvent_writeInt32(AStatsEvent* event, int32_t value); + +/** + * Writes an int64_t field to this StatsEvent. + **/ +void AStatsEvent_writeInt64(AStatsEvent* event, int64_t value); + +/** + * Writes a float field to this StatsEvent. + **/ +void AStatsEvent_writeFloat(AStatsEvent* event, float value); + +/** + * Write a bool field to this StatsEvent. + **/ +void AStatsEvent_writeBool(AStatsEvent* event, bool value); + +/** + * Write a byte array field to this StatsEvent. + **/ +void AStatsEvent_writeByteArray(AStatsEvent* event, const uint8_t* buf, size_t numBytes); + +/** + * Write a string field to this StatsEvent. + * + * The string must be null-terminated. + **/ +void AStatsEvent_writeString(AStatsEvent* event, const char* value); + +/** + * Write an attribution chain field to this StatsEvent. + * + * The sizes of uids and tags must be equal. The AttributionNode at position i is + * made up of uids[i] and tags[i]. + * + * \param uids array of uids in the attribution chain. + * \param tags array of tags in the attribution chain. Each tag must be null-terminated. + * \param numNodes the number of AttributionNodes in the attribution chain. This is the length of + * the uids and the tags. + **/ +void AStatsEvent_writeAttributionChain(AStatsEvent* event, const uint32_t* uids, + const char* const* tags, uint8_t numNodes); + +/** + * Write a bool annotation for the previous field written. + **/ +void AStatsEvent_addBoolAnnotation(AStatsEvent* event, uint8_t annotationId, bool value); + +/** + * Write an integer annotation for the previous field written. + **/ +void AStatsEvent_addInt32Annotation(AStatsEvent* event, uint8_t annotationId, int32_t value); + +// Internal/test APIs. Should not be exposed outside of the APEX. +uint32_t AStatsEvent_getAtomId(AStatsEvent* event); // Size is an output parameter. -uint8_t* stats_event_get_buffer(struct stats_event* event, size_t* size); -uint32_t stats_event_get_errors(struct stats_event* event); - -// This table is used by StatsEventCompat to access the stats_event API. -struct stats_event_api_table { - struct stats_event* (*obtain)(void); - void (*build)(struct stats_event*); - int (*write)(struct stats_event*); - void (*release)(struct stats_event*); - void (*set_atom_id)(struct stats_event*, uint32_t); - void (*write_int32)(struct stats_event*, int32_t); - void (*write_int64)(struct stats_event*, int64_t); - void (*write_float)(struct stats_event*, float); - void (*write_bool)(struct stats_event*, bool); - void (*write_byte_array)(struct stats_event*, const uint8_t*, size_t); - void (*write_string8)(struct stats_event*, const char*); - void (*write_attribution_chain)(struct stats_event*, const uint32_t*, const char* const*, - uint8_t); - void (*write_key_value_pairs)(struct stats_event*, struct key_value_pair*, uint8_t); - void (*add_bool_annotation)(struct stats_event*, uint8_t, bool); - void (*add_int32_annotation)(struct stats_event*, uint8_t, int32_t); - uint32_t (*get_atom_id)(struct stats_event*); - uint8_t* (*get_buffer)(struct stats_event*, size_t*); - uint32_t (*get_errors)(struct stats_event*); -}; +uint8_t* AStatsEvent_getBuffer(AStatsEvent* event, size_t* size); +uint32_t AStatsEvent_getErrors(AStatsEvent* event); // exposed for benchmarking only -void stats_event_truncate_buffer(struct stats_event* event, bool truncate); +void AStatsEvent_truncateBuffer(struct AStatsEvent* event, bool truncate); #ifdef __cplusplus } diff --git a/libstats/socket/libstatssocket.map.txt b/libstats/socket/libstatssocket.map.txt index 55bfbda66..e2e7ae37e 100644 --- a/libstats/socket/libstatssocket.map.txt +++ b/libstats/socket/libstatssocket.map.txt @@ -1,23 +1,19 @@ LIBSTATSSOCKET { global: - stats_event_obtain; # apex # introduced=1 - stats_event_build; # apex # introduced=1 - stats_event_write; # apex # introduced=1 - stats_event_release; # apex # introduced=1 - stats_event_set_atom_id; # apex # introduced=1 - stats_event_write_int32; # apex # introduced=1 - stats_event_write_int64; # apex # introduced=1 - stats_event_write_float; # apex # introduced=1 - stats_event_write_bool; # apex # introduced=1 - stats_event_write_byte_array; # apex # introduced=1 - stats_event_write_string8; # apex # introduced=1 - stats_event_write_attribution_chain; # apex # introduced=1 - stats_event_write_key_value_pairs; # apex # introduced=1 - stats_event_add_bool_annotation; # apex # introduced=1 - stats_event_add_int32_annotation; # apex # introduced=1 - stats_event_get_atom_id; # apex # introduced=1 - stats_event_get_buffer; # apex # introduced=1 - stats_event_get_errors; # apex # introduced=1 + AStatsEvent_obtain; # apex # introduced=30 + AStatsEvent_build; # apex # introduced=30 + AStatsEvent_write; # apex # introduced=30 + AStatsEvent_release; # apex # introduced=30 + AStatsEvent_setAtomId; # apex # introduced=30 + AStatsEvent_writeInt32; # apex # introduced=30 + AStatsEvent_writeInt64; # apex # introduced=30 + AStatsEvent_writeFloat; # apex # introduced=30 + AStatsEvent_writeBool; # apex # introduced=30 + AStatsEvent_writeByteArray; # apex # introduced=30 + AStatsEvent_writeString; # apex # introduced=30 + AStatsEvent_writeAttributionChain; # apex # introduced=30 + AStatsEvent_addBoolAnnotation; # apex # introduced=30 + AStatsEvent_addInt32Annotation; # apex # introduced=30 local: *; }; diff --git a/libstats/socket/stats_event.c b/libstats/socket/stats_event.c index 15039c63d..5f77558cb 100644 --- a/libstats/socket/stats_event.c +++ b/libstats/socket/stats_event.c @@ -35,9 +35,36 @@ #define MAX_ANNOTATION_COUNT 15 #define MAX_BYTE_VALUE 127 // parsing side requires that lengths fit in 7 bits -// The stats_event struct holds the serialized encoding of an event +/* ERRORS */ +#define ERROR_NO_TIMESTAMP 0x1 +#define ERROR_NO_ATOM_ID 0x2 +#define ERROR_OVERFLOW 0x4 +#define ERROR_ATTRIBUTION_CHAIN_TOO_LONG 0x8 +#define ERROR_TOO_MANY_KEY_VALUE_PAIRS 0x10 +#define ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD 0x20 +#define ERROR_INVALID_ANNOTATION_ID 0x40 +#define ERROR_ANNOTATION_ID_TOO_LARGE 0x80 +#define ERROR_TOO_MANY_ANNOTATIONS 0x100 +#define ERROR_TOO_MANY_FIELDS 0x200 +#define ERROR_INVALID_VALUE_TYPE 0x400 +#define ERROR_STRING_NOT_NULL_TERMINATED 0x800 + +/* TYPE IDS */ +#define INT32_TYPE 0x00 +#define INT64_TYPE 0x01 +#define STRING_TYPE 0x02 +#define LIST_TYPE 0x03 +#define FLOAT_TYPE 0x04 +#define BOOL_TYPE 0x05 +#define BYTE_ARRAY_TYPE 0x06 +#define OBJECT_TYPE 0x07 +#define KEY_VALUE_PAIRS_TYPE 0x08 +#define ATTRIBUTION_CHAIN_TYPE 0x09 +#define ERROR_TYPE 0x0F + +// The AStatsEvent struct holds the serialized encoding of an event // within a buf. Also includes other required fields. -struct stats_event { +struct AStatsEvent { uint8_t* buf; size_t lastFieldPos; // location of last field within the buf size_t size; // number of valid bytes within buffer @@ -55,8 +82,8 @@ static int64_t get_elapsed_realtime_ns() { return (int64_t)t.tv_sec * 1000000000LL + t.tv_nsec; } -struct stats_event* stats_event_obtain() { - struct stats_event* event = malloc(sizeof(struct stats_event)); +AStatsEvent* AStatsEvent_obtain() { + AStatsEvent* event = malloc(sizeof(AStatsEvent)); event->buf = (uint8_t*)calloc(MAX_EVENT_PAYLOAD, 1); event->buf[0] = OBJECT_TYPE; event->atomId = 0; @@ -76,12 +103,12 @@ struct stats_event* stats_event_obtain() { return event; } -void stats_event_release(struct stats_event* event) { +void AStatsEvent_release(AStatsEvent* event) { free(event->buf); free(event); } -void stats_event_set_atom_id(struct stats_event* event, uint32_t atomId) { +void AStatsEvent_setAtomId(AStatsEvent* event, uint32_t atomId) { event->atomId = atomId; event->buf[POS_ATOM_ID] = INT32_TYPE; memcpy(&event->buf[POS_ATOM_ID + sizeof(uint8_t)], &atomId, sizeof(atomId)); @@ -89,7 +116,7 @@ void stats_event_set_atom_id(struct stats_event* event, uint32_t atomId) { } // Side-effect: modifies event->errors if the buffer would overflow -static bool overflows(struct stats_event* event, size_t size) { +static bool overflows(AStatsEvent* event, size_t size) { if (event->size + size > MAX_EVENT_PAYLOAD) { event->errors |= ERROR_OVERFLOW; return true; @@ -99,39 +126,39 @@ static bool overflows(struct stats_event* event, size_t size) { // Side-effect: all append functions increment event->size if there is // sufficient space within the buffer to place the value -static void append_byte(struct stats_event* event, uint8_t value) { +static void append_byte(AStatsEvent* event, uint8_t value) { if (!overflows(event, sizeof(value))) { event->buf[event->size] = value; event->size += sizeof(value); } } -static void append_bool(struct stats_event* event, bool value) { +static void append_bool(AStatsEvent* event, bool value) { append_byte(event, (uint8_t)value); } -static void append_int32(struct stats_event* event, int32_t value) { +static void append_int32(AStatsEvent* event, int32_t value) { if (!overflows(event, sizeof(value))) { memcpy(&event->buf[event->size], &value, sizeof(value)); event->size += sizeof(value); } } -static void append_int64(struct stats_event* event, int64_t value) { +static void append_int64(AStatsEvent* event, int64_t value) { if (!overflows(event, sizeof(value))) { memcpy(&event->buf[event->size], &value, sizeof(value)); event->size += sizeof(value); } } -static void append_float(struct stats_event* event, float value) { +static void append_float(AStatsEvent* event, float value) { if (!overflows(event, sizeof(value))) { memcpy(&event->buf[event->size], &value, sizeof(value)); event->size += sizeof(float); } } -static void append_byte_array(struct stats_event* event, const uint8_t* buf, size_t size) { +static void append_byte_array(AStatsEvent* event, const uint8_t* buf, size_t size) { if (!overflows(event, size)) { memcpy(&event->buf[event->size], buf, size); event->size += size; @@ -139,7 +166,7 @@ static void append_byte_array(struct stats_event* event, const uint8_t* buf, siz } // Side-effect: modifies event->errors if buf is not properly null-terminated -static void append_string(struct stats_event* event, const char* buf) { +static void append_string(AStatsEvent* event, const char* buf) { size_t size = strnlen(buf, MAX_EVENT_PAYLOAD); if (size == MAX_EVENT_PAYLOAD) { event->errors |= ERROR_STRING_NOT_NULL_TERMINATED; @@ -150,41 +177,41 @@ static void append_string(struct stats_event* event, const char* buf) { append_byte_array(event, (uint8_t*)buf, size); } -static void start_field(struct stats_event* event, uint8_t typeId) { +static void start_field(AStatsEvent* event, uint8_t typeId) { event->lastFieldPos = event->size; append_byte(event, typeId); event->numElements++; } -void stats_event_write_int32(struct stats_event* event, int32_t value) { +void AStatsEvent_writeInt32(AStatsEvent* event, int32_t value) { if (event->errors) return; start_field(event, INT32_TYPE); append_int32(event, value); } -void stats_event_write_int64(struct stats_event* event, int64_t value) { +void AStatsEvent_writeInt64(AStatsEvent* event, int64_t value) { if (event->errors) return; start_field(event, INT64_TYPE); append_int64(event, value); } -void stats_event_write_float(struct stats_event* event, float value) { +void AStatsEvent_writeFloat(AStatsEvent* event, float value) { if (event->errors) return; start_field(event, FLOAT_TYPE); append_float(event, value); } -void stats_event_write_bool(struct stats_event* event, bool value) { +void AStatsEvent_writeBool(AStatsEvent* event, bool value) { if (event->errors) return; start_field(event, BOOL_TYPE); append_bool(event, value); } -void stats_event_write_byte_array(struct stats_event* event, const uint8_t* buf, size_t numBytes) { +void AStatsEvent_writeByteArray(AStatsEvent* event, const uint8_t* buf, size_t numBytes) { if (event->errors) return; start_field(event, BYTE_ARRAY_TYPE); @@ -193,7 +220,7 @@ void stats_event_write_byte_array(struct stats_event* event, const uint8_t* buf, } // Value is assumed to be encoded using UTF8 -void stats_event_write_string8(struct stats_event* event, const char* value) { +void AStatsEvent_writeString(AStatsEvent* event, const char* value) { if (event->errors) return; start_field(event, STRING_TYPE); @@ -201,8 +228,8 @@ void stats_event_write_string8(struct stats_event* event, const char* value) { } // Tags are assumed to be encoded using UTF8 -void stats_event_write_attribution_chain(struct stats_event* event, const uint32_t* uids, - const char* const* tags, uint8_t numNodes) { +void AStatsEvent_writeAttributionChain(AStatsEvent* event, const uint32_t* uids, + const char* const* tags, uint8_t numNodes) { if (numNodes > MAX_BYTE_VALUE) event->errors |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; if (event->errors) return; @@ -215,39 +242,8 @@ void stats_event_write_attribution_chain(struct stats_event* event, const uint32 } } -void stats_event_write_key_value_pairs(struct stats_event* event, struct key_value_pair* pairs, - uint8_t numPairs) { - if (numPairs > MAX_BYTE_VALUE) event->errors |= ERROR_TOO_MANY_KEY_VALUE_PAIRS; - if (event->errors) return; - - start_field(event, KEY_VALUE_PAIRS_TYPE); - append_byte(event, numPairs); - - for (uint8_t i = 0; i < numPairs; i++) { - append_int32(event, pairs[i].key); - append_byte(event, pairs[i].valueType); - switch (pairs[i].valueType) { - case INT32_TYPE: - append_int32(event, pairs[i].int32Value); - break; - case INT64_TYPE: - append_int64(event, pairs[i].int64Value); - break; - case FLOAT_TYPE: - append_float(event, pairs[i].floatValue); - break; - case STRING_TYPE: - append_string(event, pairs[i].stringValue); - break; - default: - event->errors |= ERROR_INVALID_VALUE_TYPE; - return; - } - } -} - // Side-effect: modifies event->errors if field has too many annotations -static void increment_annotation_count(struct stats_event* event) { +static void increment_annotation_count(AStatsEvent* event) { uint8_t fieldType = event->buf[event->lastFieldPos] & 0x0F; uint32_t oldAnnotationCount = (event->buf[event->lastFieldPos] & 0xF0) >> 4; uint32_t newAnnotationCount = oldAnnotationCount + 1; @@ -260,7 +256,7 @@ static void increment_annotation_count(struct stats_event* event) { event->buf[event->lastFieldPos] = (((uint8_t)newAnnotationCount << 4) & 0xF0) | fieldType; } -void stats_event_add_bool_annotation(struct stats_event* event, uint8_t annotationId, bool value) { +void AStatsEvent_addBoolAnnotation(AStatsEvent* event, uint8_t annotationId, bool value) { if (event->lastFieldPos == 0) event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; if (annotationId > MAX_BYTE_VALUE) event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; if (event->errors) return; @@ -271,8 +267,7 @@ void stats_event_add_bool_annotation(struct stats_event* event, uint8_t annotati increment_annotation_count(event); } -void stats_event_add_int32_annotation(struct stats_event* event, uint8_t annotationId, - int32_t value) { +void AStatsEvent_addInt32Annotation(AStatsEvent* event, uint8_t annotationId, int32_t value) { if (event->lastFieldPos == 0) event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; if (annotationId > MAX_BYTE_VALUE) event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; if (event->errors) return; @@ -283,24 +278,24 @@ void stats_event_add_int32_annotation(struct stats_event* event, uint8_t annotat increment_annotation_count(event); } -uint32_t stats_event_get_atom_id(struct stats_event* event) { +uint32_t AStatsEvent_getAtomId(AStatsEvent* event) { return event->atomId; } -uint8_t* stats_event_get_buffer(struct stats_event* event, size_t* size) { +uint8_t* AStatsEvent_getBuffer(AStatsEvent* event, size_t* size) { if (size) *size = event->size; return event->buf; } -uint32_t stats_event_get_errors(struct stats_event* event) { +uint32_t AStatsEvent_getErrors(AStatsEvent* event) { return event->errors; } -void stats_event_truncate_buffer(struct stats_event* event, bool truncate) { +void AStatsEvent_truncateBuffer(AStatsEvent* event, bool truncate) { event->truncate = truncate; } -void stats_event_build(struct stats_event* event) { +void AStatsEvent_build(AStatsEvent* event) { if (event->built) return; if (event->atomId == 0) event->errors |= ERROR_NO_ATOM_ID; @@ -327,28 +322,7 @@ void stats_event_build(struct stats_event* event) { event->built = true; } -int stats_event_write(struct stats_event* event) { - stats_event_build(event); +int AStatsEvent_write(AStatsEvent* event) { + AStatsEvent_build(event); return write_buffer_to_statsd(&event->buf, event->size, event->atomId); -} - -struct stats_event_api_table table = { - stats_event_obtain, - stats_event_build, - stats_event_write, - stats_event_release, - stats_event_set_atom_id, - stats_event_write_int32, - stats_event_write_int64, - stats_event_write_float, - stats_event_write_bool, - stats_event_write_byte_array, - stats_event_write_string8, - stats_event_write_attribution_chain, - stats_event_write_key_value_pairs, - stats_event_add_bool_annotation, - stats_event_add_int32_annotation, - stats_event_get_atom_id, - stats_event_get_buffer, - stats_event_get_errors, -}; +} \ No newline at end of file diff --git a/libstats/socket/tests/stats_event_test.cpp b/libstats/socket/tests/stats_event_test.cpp index cf0592c3a..48bf4b8e2 100644 --- a/libstats/socket/tests/stats_event_test.cpp +++ b/libstats/socket/tests/stats_event_test.cpp @@ -18,6 +18,34 @@ #include #include +// Keep in sync stats_event.c. Consider moving to separate header file to avoid duplication. +/* ERRORS */ +#define ERROR_NO_TIMESTAMP 0x1 +#define ERROR_NO_ATOM_ID 0x2 +#define ERROR_OVERFLOW 0x4 +#define ERROR_ATTRIBUTION_CHAIN_TOO_LONG 0x8 +#define ERROR_TOO_MANY_KEY_VALUE_PAIRS 0x10 +#define ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD 0x20 +#define ERROR_INVALID_ANNOTATION_ID 0x40 +#define ERROR_ANNOTATION_ID_TOO_LARGE 0x80 +#define ERROR_TOO_MANY_ANNOTATIONS 0x100 +#define ERROR_TOO_MANY_FIELDS 0x200 +#define ERROR_INVALID_VALUE_TYPE 0x400 +#define ERROR_STRING_NOT_NULL_TERMINATED 0x800 + +/* TYPE IDS */ +#define INT32_TYPE 0x00 +#define INT64_TYPE 0x01 +#define STRING_TYPE 0x02 +#define LIST_TYPE 0x03 +#define FLOAT_TYPE 0x04 +#define BOOL_TYPE 0x05 +#define BYTE_ARRAY_TYPE 0x06 +#define OBJECT_TYPE 0x07 +#define KEY_VALUE_PAIRS_TYPE 0x08 +#define ATTRIBUTION_CHAIN_TYPE 0x09 +#define ERROR_TYPE 0x0F + using std::string; using std::vector; @@ -88,17 +116,17 @@ TEST(StatsEventTest, TestScalars) { bool boolValue = false; int64_t startTime = android::elapsedRealtimeNano(); - struct stats_event* event = stats_event_obtain(); - stats_event_set_atom_id(event, atomId); - stats_event_write_int32(event, int32Value); - stats_event_write_int64(event, int64Value); - stats_event_write_float(event, floatValue); - stats_event_write_bool(event, boolValue); - stats_event_build(event); + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, atomId); + AStatsEvent_writeInt32(event, int32Value); + AStatsEvent_writeInt64(event, int64Value); + AStatsEvent_writeFloat(event, floatValue); + AStatsEvent_writeBool(event, boolValue); + AStatsEvent_build(event); int64_t endTime = android::elapsedRealtimeNano(); size_t bufferSize; - uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* buffer = AStatsEvent_getBuffer(event, &bufferSize); uint8_t* bufferEnd = buffer + bufferSize; checkMetadata(&buffer, /*numElements=*/4, startTime, endTime, atomId); @@ -120,8 +148,8 @@ TEST(StatsEventTest, TestScalars) { checkScalar(&buffer, boolValue); EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer - EXPECT_EQ(stats_event_get_errors(event), 0); - stats_event_release(event); + EXPECT_EQ(AStatsEvent_getErrors(event), 0); + AStatsEvent_release(event); } TEST(StatsEventTest, TestStrings) { @@ -129,14 +157,14 @@ TEST(StatsEventTest, TestStrings) { string str = "test_string"; int64_t startTime = android::elapsedRealtimeNano(); - struct stats_event* event = stats_event_obtain(); - stats_event_set_atom_id(event, atomId); - stats_event_write_string8(event, str.c_str()); - stats_event_build(event); + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, atomId); + AStatsEvent_writeString(event, str.c_str()); + AStatsEvent_build(event); int64_t endTime = android::elapsedRealtimeNano(); size_t bufferSize; - uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* buffer = AStatsEvent_getBuffer(event, &bufferSize); uint8_t* bufferEnd = buffer + bufferSize; checkMetadata(&buffer, /*numElements=*/1, startTime, endTime, atomId); @@ -145,8 +173,8 @@ TEST(StatsEventTest, TestStrings) { checkString(&buffer, str); EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer - EXPECT_EQ(stats_event_get_errors(event), 0); - stats_event_release(event); + EXPECT_EQ(AStatsEvent_getErrors(event), 0); + AStatsEvent_release(event); } TEST(StatsEventTest, TestByteArrays) { @@ -154,14 +182,14 @@ TEST(StatsEventTest, TestByteArrays) { vector message = {'b', 'y', 't', '\0', 'e', 's'}; int64_t startTime = android::elapsedRealtimeNano(); - struct stats_event* event = stats_event_obtain(); - stats_event_set_atom_id(event, atomId); - stats_event_write_byte_array(event, message.data(), message.size()); - stats_event_build(event); + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, atomId); + AStatsEvent_writeByteArray(event, message.data(), message.size()); + AStatsEvent_build(event); int64_t endTime = android::elapsedRealtimeNano(); size_t bufferSize; - uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* buffer = AStatsEvent_getBuffer(event, &bufferSize); uint8_t* bufferEnd = buffer + bufferSize; checkMetadata(&buffer, /*numElements=*/1, startTime, endTime, atomId); @@ -170,8 +198,8 @@ TEST(StatsEventTest, TestByteArrays) { checkByteArray(&buffer, message); EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer - EXPECT_EQ(stats_event_get_errors(event), 0); - stats_event_release(event); + EXPECT_EQ(AStatsEvent_getErrors(event), 0); + AStatsEvent_release(event); } TEST(StatsEventTest, TestAttributionChains) { @@ -188,14 +216,14 @@ TEST(StatsEventTest, TestAttributionChains) { } int64_t startTime = android::elapsedRealtimeNano(); - struct stats_event* event = stats_event_obtain(); - stats_event_set_atom_id(event, atomId); - stats_event_write_attribution_chain(event, uids, cTags, numNodes); - stats_event_build(event); + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, atomId); + AStatsEvent_writeAttributionChain(event, uids, cTags, numNodes); + AStatsEvent_build(event); int64_t endTime = android::elapsedRealtimeNano(); size_t bufferSize; - uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* buffer = AStatsEvent_getBuffer(event, &bufferSize); uint8_t* bufferEnd = buffer + bufferSize; checkMetadata(&buffer, /*numElements=*/1, startTime, endTime, atomId); @@ -208,60 +236,8 @@ TEST(StatsEventTest, TestAttributionChains) { } EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer - EXPECT_EQ(stats_event_get_errors(event), 0); - stats_event_release(event); -} - -TEST(StatsEventTest, TestKeyValuePairs) { - uint32_t atomId = 100; - - uint8_t numPairs = 4; - struct key_value_pair pairs[numPairs]; - pairs[0] = {.key = 0, .valueType = INT32_TYPE, .int32Value = -1}; - pairs[1] = {.key = 1, .valueType = INT64_TYPE, .int64Value = 0x123456789}; - pairs[2] = {.key = 2, .valueType = FLOAT_TYPE, .floatValue = 5.5}; - string str = "test_key_value_pair_string"; - pairs[3] = {.key = 3, .valueType = STRING_TYPE, .stringValue = str.c_str()}; - - int64_t startTime = android::elapsedRealtimeNano(); - struct stats_event* event = stats_event_obtain(); - stats_event_set_atom_id(event, atomId); - stats_event_write_key_value_pairs(event, pairs, numPairs); - stats_event_build(event); - int64_t endTime = android::elapsedRealtimeNano(); - - size_t bufferSize; - uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); - uint8_t* bufferEnd = buffer + bufferSize; - - checkMetadata(&buffer, /*numElements=*/1, startTime, endTime, atomId); - - checkTypeHeader(&buffer, KEY_VALUE_PAIRS_TYPE); - checkScalar(&buffer, numPairs); - - // first pair - checkScalar(&buffer, pairs[0].key); - checkTypeHeader(&buffer, pairs[0].valueType); - checkScalar(&buffer, pairs[0].int32Value); - - // second pair - checkScalar(&buffer, pairs[1].key); - checkTypeHeader(&buffer, pairs[1].valueType); - checkScalar(&buffer, pairs[1].int64Value); - - // third pair - checkScalar(&buffer, pairs[2].key); - checkTypeHeader(&buffer, pairs[2].valueType); - checkScalar(&buffer, pairs[2].floatValue); - - // fourth pair - checkScalar(&buffer, pairs[3].key); - checkTypeHeader(&buffer, pairs[3].valueType); - checkString(&buffer, str); - - EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer - EXPECT_EQ(stats_event_get_errors(event), 0); - stats_event_release(event); + EXPECT_EQ(AStatsEvent_getErrors(event), 0); + AStatsEvent_release(event); } TEST(StatsEventTest, TestAnnotations) { @@ -282,19 +258,19 @@ TEST(StatsEventTest, TestAnnotations) { bool floatAnnotation2Value = false; int64_t startTime = android::elapsedRealtimeNano(); - struct stats_event* event = stats_event_obtain(); - stats_event_set_atom_id(event, 100); - stats_event_write_bool(event, boolValue); - stats_event_add_bool_annotation(event, boolAnnotation1Id, boolAnnotation1Value); - stats_event_add_int32_annotation(event, boolAnnotation2Id, boolAnnotation2Value); - stats_event_write_float(event, floatValue); - stats_event_add_int32_annotation(event, floatAnnotation1Id, floatAnnotation1Value); - stats_event_add_bool_annotation(event, floatAnnotation2Id, floatAnnotation2Value); - stats_event_build(event); + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, 100); + AStatsEvent_writeBool(event, boolValue); + AStatsEvent_addBoolAnnotation(event, boolAnnotation1Id, boolAnnotation1Value); + AStatsEvent_addInt32Annotation(event, boolAnnotation2Id, boolAnnotation2Value); + AStatsEvent_writeFloat(event, floatValue); + AStatsEvent_addInt32Annotation(event, floatAnnotation1Id, floatAnnotation1Value); + AStatsEvent_addBoolAnnotation(event, floatAnnotation2Id, floatAnnotation2Value); + AStatsEvent_build(event); int64_t endTime = android::elapsedRealtimeNano(); size_t bufferSize; - uint8_t* buffer = stats_event_get_buffer(event, &bufferSize); + uint8_t* buffer = AStatsEvent_getBuffer(event, &bufferSize); uint8_t* bufferEnd = buffer + bufferSize; checkMetadata(&buffer, /*numElements=*/2, startTime, endTime, atomId); @@ -312,33 +288,33 @@ TEST(StatsEventTest, TestAnnotations) { checkAnnotation(&buffer, floatAnnotation2Id, BOOL_TYPE, floatAnnotation2Value); EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer - EXPECT_EQ(stats_event_get_errors(event), 0); - stats_event_release(event); + EXPECT_EQ(AStatsEvent_getErrors(event), 0); + AStatsEvent_release(event); } TEST(StatsEventTest, TestNoAtomIdError) { - struct stats_event* event = stats_event_obtain(); + AStatsEvent* event = AStatsEvent_obtain(); // Don't set the atom id in order to trigger the error. - stats_event_build(event); + AStatsEvent_build(event); - uint32_t errors = stats_event_get_errors(event); + uint32_t errors = AStatsEvent_getErrors(event); EXPECT_NE(errors | ERROR_NO_ATOM_ID, 0); - stats_event_release(event); + AStatsEvent_release(event); } TEST(StatsEventTest, TestOverflowError) { - struct stats_event* event = stats_event_obtain(); - stats_event_set_atom_id(event, 100); + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, 100); // Add 1000 int32s to the event. Each int32 takes 5 bytes so this will // overflow the 4068 byte buffer. for (int i = 0; i < 1000; i++) { - stats_event_write_int32(event, 0); + AStatsEvent_writeInt32(event, 0); } - stats_event_build(event); + AStatsEvent_build(event); - uint32_t errors = stats_event_get_errors(event); + uint32_t errors = AStatsEvent_getErrors(event); EXPECT_NE(errors | ERROR_OVERFLOW, 0); - stats_event_release(event); + AStatsEvent_release(event); } From c89638a55ba8195d0559c2268e507fe842bb93dd Mon Sep 17 00:00:00 2001 From: Keun young Park Date: Wed, 15 Jan 2020 10:09:03 -0800 Subject: [PATCH 057/388] bootstat: Migrate to StatsLog for metrics - All events are migrated to StatsLog atoms. - Still keep the string based name for BootEvent logging as that makes it easier for debugging purpose. Bug: 132691841 Test: check boot related stats are pushed after boot up $ adb shell cmd stats print-stats Change-Id: I33313695a8a2d0a3c74f7705c0843c8c4bad2133 --- bootstat/bootstat.cpp | 151 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 139 insertions(+), 12 deletions(-) diff --git a/bootstat/bootstat.cpp b/bootstat/bootstat.cpp index c5fc154ad..9ffe5dd34 100644 --- a/bootstat/bootstat.cpp +++ b/bootstat/bootstat.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include @@ -50,16 +52,133 @@ namespace { +struct AtomInfo { + int32_t atom; + int32_t event; +}; + +// Maps BootEvent used inside bootstat into statsd atom defined in +// frameworks/base/cmds/statsd/src/atoms.proto. +const std::unordered_map kBootEventToAtomInfo = { + // ELAPSED_TIME + {"ro.boottime.init", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__ANDROID_INIT_STAGE_1}}, + {"boot_complete", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__BOOT_COMPLETE}}, + {"boot_decryption_complete", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__BOOT_COMPLETE_ENCRYPTION}}, + {"boot_complete_no_encryption", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__BOOT_COMPLETE_NO_ENCRYPTION}}, + {"boot_complete_post_decrypt", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__BOOT_COMPLETE_POST_DECRYPT}}, + {"factory_reset_boot_complete", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__FACTORY_RESET_BOOT_COMPLETE}}, + {"factory_reset_boot_complete_no_encryption", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util:: + BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__FACTORY_RESET_BOOT_COMPLETE_NO_ENCRYPTION}}, + {"factory_reset_boot_complete_post_decrypt", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util:: + BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__FACTORY_RESET_BOOT_COMPLETE_POST_DECRYPT}}, + {"ota_boot_complete", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__OTA_BOOT_COMPLETE}}, + {"ota_boot_complete_no_encryption", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__OTA_BOOT_COMPLETE_NO_ENCRYPTION}}, + {"ota_boot_complete_post_decrypt", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__OTA_BOOT_COMPLETE_POST_DECRYPT}}, + {"post_decrypt_time_elapsed", + {android::util::BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__POST_DECRYPT}}, + // DURATION + {"absolute_boot_time", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__ABSOLUTE_BOOT_TIME}}, + {"boottime.bootloader.1BLE", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__BOOTLOADER_FIRST_STAGE_EXEC}}, + {"boottime.bootloader.1BLL", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__BOOTLOADER_FIRST_STAGE_LOAD}}, + {"boottime.bootloader.KL", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__BOOTLOADER_KERNEL_LOAD}}, + {"boottime.bootloader.2BLE", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__BOOTLOADER_SECOND_STAGE_EXEC}}, + {"boottime.bootloader.2BLL", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__BOOTLOADER_SECOND_STAGE_LOAD}}, + {"boottime.bootloader.SW", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__BOOTLOADER_UI_WAIT}}, + {"boottime.bootloader.total", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__BOOTLOADER_TOTAL}}, + {"boottime.init.cold_boot_wait", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__COLDBOOT_WAIT}}, + {"time_since_factory_reset", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__FACTORY_RESET_TIME_SINCE_RESET}}, + {"ro.boottime.init.first_stage", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__ANDROID_INIT_STAGE_1}}, + {"ro.boottime.init.selinux", + {android::util::BOOT_TIME_EVENT_DURATION_REPORTED, + android::util::BOOT_TIME_EVENT_DURATION__EVENT__SELINUX_INIT}}, + // UTC_TIME + {"factory_reset", + {android::util::BOOT_TIME_EVENT_UTC_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_UTC_TIME__EVENT__FACTORY_RESET_RESET_TIME}}, + {"factory_reset_current_time", + {android::util::BOOT_TIME_EVENT_UTC_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_UTC_TIME__EVENT__FACTORY_RESET_CURRENT_TIME}}, + {"factory_reset_record_value", + {android::util::BOOT_TIME_EVENT_UTC_TIME_REPORTED, + android::util::BOOT_TIME_EVENT_UTC_TIME__EVENT__FACTORY_RESET_RECORD_VALUE}}, + // ERROR_CODE + {"factory_reset_current_time_failure", + {android::util::BOOT_TIME_EVENT_ERROR_CODE_REPORTED, + android::util::BOOT_TIME_EVENT_ERROR_CODE__EVENT__FACTORY_RESET_CURRENT_TIME_FAILURE}}, +}; + // Scans the boot event record store for record files and logs each boot event // via EventLog. void LogBootEvents() { BootEventRecordStore boot_event_store; - auto events = boot_event_store.GetAllBootEvents(); - // TODO(b/148575354): Replace with statsd. - // for (auto i = events.cbegin(); i != events.cend(); ++i) { - // android::metricslogger::LogHistogram(i->first, i->second); - // } + std::vector notSupportedEvents; + for (const auto& event : events) { + const auto& name = event.first; + const auto& info = kBootEventToAtomInfo.find(name); + if (info != kBootEventToAtomInfo.end()) { + if (info->second.atom == android::util::BOOT_TIME_EVENT_ERROR_CODE_REPORTED) { + android::util::stats_write(static_cast(info->second.atom), + static_cast(info->second.event), + static_cast(event.second)); + } else { + android::util::stats_write(static_cast(info->second.atom), + static_cast(info->second.event), + static_cast(event.second)); + } + } else { + notSupportedEvents.push_back(name); + } + } + if (!notSupportedEvents.empty()) { + LOG(WARNING) << "LogBootEvents, atomInfo not defined for events:" + << android::base::Join(notSupportedEvents, ','); + } } // Records the named boot |event| to the record store. If |value| is non-empty @@ -1250,11 +1369,13 @@ void RecordFactoryReset() { time_t current_time_utc = time(nullptr); if (current_time_utc < 0) { - // TODO(b/148575354): Replace with statsd. // UMA does not display negative values in buckets, so convert to positive. // Logging via BootEventRecordStore. - // android::metricslogger::LogHistogram("factory_reset_current_time_failure", - // std::abs(current_time_utc)); + android::util::stats_write( + static_cast(android::util::BOOT_TIME_EVENT_ERROR_CODE_REPORTED), + static_cast( + android::util::BOOT_TIME_EVENT_ERROR_CODE__EVENT__FACTORY_RESET_CURRENT_TIME_FAILURE), + static_cast(std::abs(current_time_utc))); // Logging via BootEventRecordStore to see if using android::metricslogger::LogHistogram // is losing records somehow. @@ -1262,8 +1383,11 @@ void RecordFactoryReset() { std::abs(current_time_utc)); return; } else { - // TODO(b/148575354): Replace with statsd. - // android::metricslogger::LogHistogram("factory_reset_current_time", current_time_utc); + android::util::stats_write( + static_cast(android::util::BOOT_TIME_EVENT_UTC_TIME_REPORTED), + static_cast( + android::util::BOOT_TIME_EVENT_UTC_TIME__EVENT__FACTORY_RESET_CURRENT_TIME), + static_cast(current_time_utc)); // Logging via BootEventRecordStore to see if using android::metricslogger::LogHistogram // is losing records somehow. @@ -1283,8 +1407,11 @@ void RecordFactoryReset() { // Calculate and record the difference in time between now and the // factory_reset time. time_t factory_reset_utc = record.second; - // TODO(b/148575354): Replace with statsd. - // android::metricslogger::LogHistogram("factory_reset_record_value", factory_reset_utc); + android::util::stats_write( + static_cast(android::util::BOOT_TIME_EVENT_UTC_TIME_REPORTED), + static_cast( + android::util::BOOT_TIME_EVENT_UTC_TIME__EVENT__FACTORY_RESET_RECORD_VALUE), + static_cast(factory_reset_utc)); // Logging via BootEventRecordStore to see if using android::metricslogger::LogHistogram // is losing records somehow. From 0fca736e6cf02ad33836f9c59bdf5a2fb6fd9849 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Tue, 4 Feb 2020 14:13:20 -0800 Subject: [PATCH 058/388] Add libstatssocket_test to TEST_MAPPING Test: treehugger Change-Id: Iddff5df4c498bf7c93e57b1ae214f813920243e1 --- libstats/socket/Android.bp | 2 +- libstats/socket/TEST_MAPPING | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 libstats/socket/TEST_MAPPING diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index 9fd9fbc20..8a43d854b 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -92,5 +92,5 @@ cc_test { "liblog", "libutils", ], - test_suites: ["device_tests"], + test_suites: ["device-tests"], } diff --git a/libstats/socket/TEST_MAPPING b/libstats/socket/TEST_MAPPING new file mode 100644 index 000000000..0224998f5 --- /dev/null +++ b/libstats/socket/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit" : [ + { + "name" : "libstatssocket_test" + } + ] +} \ No newline at end of file From b173a95ae80be316bc209370c16df4106da7b35a Mon Sep 17 00:00:00 2001 From: Muhammad Qureshi Date: Wed, 5 Feb 2020 17:10:46 -0800 Subject: [PATCH 059/388] Fix native stats_event logging pass the byte array pointer; not the reference to the pointer. Also turn on new socket protocol. Bug: 148909969 Bug: 143979391 Test: m Test: fastboot flashall Test: atest android.cts.statsd.atom.UidAtomTests#testLmkKillOccurred Test: atest LibStatsPullTests Test: atest GtsStatsdHostTestCases Change-Id: If7abae5cadb036555540d1b9b5e7f2cabe99beb8 --- libstats/socket/stats_event.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libstats/socket/stats_event.c b/libstats/socket/stats_event.c index 5f77558cb..a26ac2d6e 100644 --- a/libstats/socket/stats_event.c +++ b/libstats/socket/stats_event.c @@ -324,5 +324,5 @@ void AStatsEvent_build(AStatsEvent* event) { int AStatsEvent_write(AStatsEvent* event) { AStatsEvent_build(event); - return write_buffer_to_statsd(&event->buf, event->size, event->atomId); -} \ No newline at end of file + return write_buffer_to_statsd(event->buf, event->size, event->atomId); +} From 8095e4eef13fea9e86bdc4466426d894023015cd Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Fri, 7 Feb 2020 12:06:41 -0800 Subject: [PATCH 060/388] Update libstatspull lib statsd_aidl was updated, so this is the matching change. Test: m -j Bug: 148682447 Change-Id: Iec0459cec9f649eb23c6d04b205075fff9b6e911 --- libstats/pull/Android.bp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libstats/pull/Android.bp b/libstats/pull/Android.bp index 2171aa47f..de5903317 100644 --- a/libstats/pull/Android.bp +++ b/libstats/pull/Android.bp @@ -23,7 +23,6 @@ cc_library_shared { include_dirs: ["frameworks/base/core/java"], }, srcs: [ - ":statsd_aidl", "stats_pull_atom_callback.cpp", ], cflags: [ @@ -36,6 +35,7 @@ cc_library_shared { "libbinder", "libstatssocket", "libservices", + "statsd-aidl-cpp", ], static_libs: [ "liblog", From 1d748feaec5db7a35066f53f8e5edaf22520c02d Mon Sep 17 00:00:00 2001 From: Miao Wang Date: Fri, 7 Feb 2020 15:01:24 -0800 Subject: [PATCH 061/388] Add an stune group for NNAPI HAL - schedtune.prefer_idle 1 - schedtune.boost 1 Test: mm Test: configure NNAPI HAL to use nnapi-hal stune Test: measure perf difference using MLTS benchmark Change-Id: I5f467c6a58f2c1da40ec8276e101defc808854a3 --- rootdir/init.rc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rootdir/init.rc b/rootdir/init.rc index 5fbad75dd..103bfb3c6 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -144,6 +144,14 @@ on init chmod 0664 /dev/stune/top-app/tasks chmod 0664 /dev/stune/rt/tasks + # Create an stune group for NNAPI HAL processes + mkdir /dev/stune/nnapi-hal + chown system system /dev/stune/nnapi-hal + chown system system /dev/stune/nnapi-hal/tasks + chmod 0664 /dev/stune/nnapi-hal/tasks + write /dev/stune/nnapi-hal/schedtune.boost 1 + write /dev/stune/nnapi-hal/schedtune.prefer_idle 1 + # Create blkio group and apply initial settings. # This feature needs kernel to support it, and the # device's init.rc must actually set the correct values. From 223dadb830ceec78746f4bf227a4152c740b949e Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Fri, 24 Jan 2020 18:21:36 -0800 Subject: [PATCH 062/388] Migrate libstatspull to libbinder_ndk Since libstatspull will be placed within the APEX, we need to move to libbinder_ndk. Test: m -j libstatspull Test: atest LibStatsPullTests Bug: 145213327 Change-Id: I86dd6e759efa5eb20bffc76492d5fa72cf279872 --- libstats/pull/Android.bp | 9 +- libstats/pull/stats_pull_atom_callback.cpp | 118 +++++++++++---------- 2 files changed, 62 insertions(+), 65 deletions(-) diff --git a/libstats/pull/Android.bp b/libstats/pull/Android.bp index de5903317..827e992dc 100644 --- a/libstats/pull/Android.bp +++ b/libstats/pull/Android.bp @@ -19,9 +19,6 @@ // ========================================================== cc_library_shared { name: "libstatspull", - aidl: { - include_dirs: ["frameworks/base/core/java"], - }, srcs: [ "stats_pull_atom_callback.cpp", ], @@ -31,11 +28,9 @@ cc_library_shared { ], export_include_dirs: ["include"], shared_libs: [ - //TODO: use libbinder_ndk. Remove libservices. - "libbinder", + "libbinder_ndk", "libstatssocket", - "libservices", - "statsd-aidl-cpp", + "statsd-aidl-ndk_platform", ], static_libs: [ "liblog", diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp index 9c497b8ea..27e9d29e2 100644 --- a/libstats/pull/stats_pull_atom_callback.cpp +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -15,18 +15,26 @@ */ #include +#include #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include -#include +using Status = ::ndk::ScopedAStatus; +using aidl::android::os::BnPullAtomCallback; +using aidl::android::os::IPullAtomResultReceiver; +using aidl::android::os::IStatsd; +using aidl::android::util::StatsEventParcel; +using ::ndk::SharedRefBase; struct AStatsEventList { std::vector data; @@ -74,7 +82,7 @@ void AStatsManager_PullAtomMetadata_setAdditiveFields(AStatsManager_PullAtomMeta metadata->additive_fields.assign(additive_fields, additive_fields + num_fields); } -class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { +class StatsPullAtomCallbackInternal : public BnPullAtomCallback { public: StatsPullAtomCallbackInternal(const AStatsManager_PullAtomCallback callback, void* cookie, const int64_t coolDownNs, const int64_t timeoutNs, @@ -85,21 +93,19 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { mTimeoutNs(timeoutNs), mAdditiveFields(additiveFields) {} - ::android::binder::Status onPullAtom( - int32_t atomTag, - const ::android::sp<::android::os::IPullAtomResultReceiver>& resultReceiver) override { + Status onPullAtom(int32_t atomTag, + const std::shared_ptr& resultReceiver) override { AStatsEventList statsEventList; - statsEventList.data.clear(); int successInt = mCallback(atomTag, &statsEventList, mCookie); bool success = successInt == AStatsManager_PULL_SUCCESS; // Convert stats_events into StatsEventParcels. - std::vector parcels; + std::vector parcels; for (int i = 0; i < statsEventList.data.size(); i++) { size_t size; uint8_t* buffer = AStatsEvent_getBuffer(statsEventList.data[i], &size); - android::util::StatsEventParcel p; + StatsEventParcel p; // vector.assign() creates a copy, but this is inevitable unless // stats_event.h/c uses a vector as opposed to a buffer. p.buffer.assign(buffer, buffer + size); @@ -110,7 +116,7 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { for (int i = 0; i < statsEventList.data.size(); i++) { AStatsEvent_release(statsEventList.data[i]); } - return android::binder::Status::ok(); + return Status::ok(); } const int64_t& getCoolDownNs() const { return mCoolDownNs; } @@ -126,60 +132,55 @@ class StatsPullAtomCallbackInternal : public android::os::BnPullAtomCallback { }; static std::mutex pullAtomMutex; -static android::sp sStatsd = nullptr; +static std::shared_ptr sStatsd = nullptr; -static std::map> mPullers; -static android::sp getStatsService(); +static std::map> mPullers; +static std::shared_ptr getStatsService(); -class StatsDeathRecipient : public android::IBinder::DeathRecipient { - public: - StatsDeathRecipient() = default; - ~StatsDeathRecipient() override = default; - - // android::IBinder::DeathRecipient override: - void binderDied(const android::wp& /* who */) override { - { - std::lock_guard lock(pullAtomMutex); - sStatsd = nullptr; - } - android::sp statsService = getStatsService(); - if (statsService == nullptr) { - return; - } - - std::map> pullersCopy; - { - std::lock_guard lock(pullAtomMutex); - pullersCopy = mPullers; - } - for (auto it : pullersCopy) { - statsService->registerNativePullAtomCallback(it.first, it.second->getCoolDownNs(), - it.second->getTimeoutNs(), - it.second->getAdditiveFields(), it.second); - } +static void binderDied(void* /*cookie*/) { + { + std::lock_guard lock(pullAtomMutex); + sStatsd = nullptr; } -}; -static android::sp statsDeathRecipient = new StatsDeathRecipient(); + std::shared_ptr statsService = getStatsService(); + if (statsService == nullptr) { + return; + } -static android::sp getStatsService() { + // Since we do not want to make an IPC with the lock held, we first create a + // copy of the data with the lock held before iterating through the map. + std::map> pullersCopy; + { + std::lock_guard lock(pullAtomMutex); + pullersCopy = mPullers; + } + for (const auto& it : pullersCopy) { + statsService->registerNativePullAtomCallback(it.first, it.second->getCoolDownNs(), + it.second->getTimeoutNs(), + it.second->getAdditiveFields(), it.second); + } +} + +static ::ndk::ScopedAIBinder_DeathRecipient sDeathRecipient( + AIBinder_DeathRecipient_new(binderDied)); + +static std::shared_ptr getStatsService() { std::lock_guard lock(pullAtomMutex); if (!sStatsd) { - // Fetch statsd. - const android::sp binder = - android::defaultServiceManager()->getService(android::String16("stats")); - if (!binder) { - return nullptr; + // Fetch statsd + ::ndk::SpAIBinder binder(AServiceManager_getService("stats")); + sStatsd = IStatsd::fromBinder(binder); + if (sStatsd) { + AIBinder_linkToDeath(binder.get(), sDeathRecipient.get(), /*cookie=*/nullptr); } - binder->linkToDeath(statsDeathRecipient); - sStatsd = android::interface_cast(binder); } return sStatsd; } void registerStatsPullAtomCallbackBlocking(int32_t atomTag, - android::sp cb) { - const android::sp statsService = getStatsService(); + std::shared_ptr cb) { + const std::shared_ptr statsService = getStatsService(); if (statsService == nullptr) { // Statsd not available return; @@ -190,7 +191,7 @@ void registerStatsPullAtomCallbackBlocking(int32_t atomTag, } void unregisterStatsPullAtomCallbackBlocking(int32_t atomTag) { - const android::sp statsService = getStatsService(); + const std::shared_ptr statsService = getStatsService(); if (statsService == nullptr) { // Statsd not available return; @@ -211,8 +212,9 @@ void AStatsManager_registerPullAtomCallback(int32_t atom_tag, additiveFields = metadata->additive_fields; } - android::sp callbackBinder = new StatsPullAtomCallbackInternal( - callback, cookie, coolDownNs, timeoutNs, additiveFields); + std::shared_ptr callbackBinder = + SharedRefBase::make(callback, cookie, coolDownNs, + timeoutNs, additiveFields); { std::lock_guard lg(pullAtomMutex); From 8dacabe6b3ab2bd8012f769bb3866c2a5bb48075 Mon Sep 17 00:00:00 2001 From: Zim Date: Mon, 10 Feb 2020 20:24:40 +0000 Subject: [PATCH 063/388] FUSE flag on by default This will make the FUSE filesystem the default on the build Test: https://android-build.googleplex.com/builds/forrest/run/L11100000458471772 Bug: 135341433 Change-Id: I1493e2806823b5751794a9a17ee248dc72b857ff --- rootdir/init.rc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rootdir/init.rc b/rootdir/init.rc index 896745bec..1be3a3bcd 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -768,6 +768,9 @@ on post-fs-data chown root system /dev/fscklogs/log chmod 0770 /dev/fscklogs/log + # Enable FUSE by default + setprop persist.sys.fuse true + # Switch between sdcardfs and FUSE depending on persist property # TODO: Move this to ro property before launch because FDE devices # interact with persistent properties differently during boot From b0a85dc46dff7bb5c277f2e85edfe38cf5b7ae36 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Wed, 12 Feb 2020 14:22:01 -0800 Subject: [PATCH 064/388] Add apex_available to libs Bug: 145922701 Test: m -j Change-Id: If5cbe5651e47878520bdc5b943b17a4f72a2a2f3 --- libstats/pull/Android.bp | 10 ++++++++-- libstats/socket/Android.bp | 8 +++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/libstats/pull/Android.bp b/libstats/pull/Android.bp index 827e992dc..d74a36b84 100644 --- a/libstats/pull/Android.bp +++ b/libstats/pull/Android.bp @@ -29,12 +29,14 @@ cc_library_shared { export_include_dirs: ["include"], shared_libs: [ "libbinder_ndk", - "libstatssocket", + "liblog", "statsd-aidl-ndk_platform", ], static_libs: [ - "liblog", "libutils", + // TODO(b/149340100): Clean this up when libstatssocket is moved to the apex. + "libstatssocket", + "libcutils", ], // enumerate stable entry points for APEX use stubs: { @@ -43,4 +45,8 @@ cc_library_shared { "30", ], }, + apex_available: [ + "com.android.os.statsd", + "test_com.android.os.statsd", + ], } diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index f36b214f5..c4785215f 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -47,7 +47,13 @@ cc_library { versions: [ "30", ], - } + }, + apex_available: [ + "com.android.os.statsd", + "test_com.android.os.statsd", + //TODO(b/149340100): Remove this once libstatssocket is only linked as shared. + "//apex_available:platform", + ], } cc_library_headers { From e48a55649cdc9d699c57420d9b3de54224ec8b90 Mon Sep 17 00:00:00 2001 From: Zim Date: Thu, 13 Feb 2020 19:38:06 +0000 Subject: [PATCH 065/388] Revert "Explicitly disable FUSE" This reverts commit a3209c5f5784b1d8442c9b6f8d852e1764917854. Should not have been merged into master Test: m Bug: 135341433 --- rootdir/init.rc | 3 --- 1 file changed, 3 deletions(-) diff --git a/rootdir/init.rc b/rootdir/init.rc index 6c0f2bc8a..6dd2dc513 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -764,9 +764,6 @@ on post-fs-data # IOCTLs on ashmem fds any more. setprop sys.use_memfd false - # Explicitly disable FUSE - setprop persist.sys.fuse false - # Set fscklog permission chown root system /dev/fscklogs/log chmod 0770 /dev/fscklogs/log From 2ebc2e3d8f64c7c0e26be9bb6203875f5b85ccc2 Mon Sep 17 00:00:00 2001 From: Muhammad Qureshi Date: Tue, 11 Feb 2020 14:12:59 -0800 Subject: [PATCH 066/388] Expose AStatsSocket_close() from the statsd apex As part of statsd becoming a Mainline module in R, we need to formalize the statsd APIs called from outside the statsd apex. Bug: 145923416 Test: m Change-Id: I296a018cc93d95bda77d95f8161acbbe983a5d51 --- libstats/socket/Android.bp | 1 + libstats/socket/include/stats_socket.h | 33 ++++++++++++++++++++++++++ libstats/socket/libstatssocket.map.txt | 1 + libstats/socket/stats_socket.c | 22 +++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 libstats/socket/include/stats_socket.h create mode 100644 libstats/socket/stats_socket.c diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index f36b214f5..a709961bc 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -25,6 +25,7 @@ cc_library { // TODO(b/145573568): Remove stats_event_list once stats_event // migration is complete. "stats_event_list.c", + "stats_socket.c", "statsd_writer.c", ], host_supported: true, diff --git a/libstats/socket/include/stats_socket.h b/libstats/socket/include/stats_socket.h new file mode 100644 index 000000000..5a75fc021 --- /dev/null +++ b/libstats/socket/include/stats_socket.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2020 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 + +/** + * Helpers to manage the statsd socket. + **/ + +#ifdef __cplusplus +extern "C" { +#endif // __CPLUSPLUS + +/** + * Closes the statsd socket file descriptor. + **/ +void AStatsSocket_close(); +#ifdef __cplusplus +} +#endif // __CPLUSPLUS diff --git a/libstats/socket/libstatssocket.map.txt b/libstats/socket/libstatssocket.map.txt index e2e7ae37e..5c1390419 100644 --- a/libstats/socket/libstatssocket.map.txt +++ b/libstats/socket/libstatssocket.map.txt @@ -14,6 +14,7 @@ LIBSTATSSOCKET { AStatsEvent_writeAttributionChain; # apex # introduced=30 AStatsEvent_addBoolAnnotation; # apex # introduced=30 AStatsEvent_addInt32Annotation; # apex # introduced=30 + AStatsSocket_close; # apex # introduced=30 local: *; }; diff --git a/libstats/socket/stats_socket.c b/libstats/socket/stats_socket.c new file mode 100644 index 000000000..09f8967b0 --- /dev/null +++ b/libstats/socket/stats_socket.c @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2020 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/stats_socket.h" +#include "stats_buffer_writer.h" + +void AStatsSocket_close() { + stats_log_close(); +} From e41a6c621ce904d5c7a67feca76fe6246d6c0b16 Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Fri, 14 Feb 2020 10:53:03 -0800 Subject: [PATCH 067/388] AStatsEvent_overwriteTimestamp Create a function to overwrite timestamp for LogEvent tests. This function is not exposed outside of the APEX. Test: bit libstatssocket_test:* Change-Id: Id0eac485af60e952cc700f7d1231b1b971400982 --- libstats/socket/include/stats_event.h | 1 + libstats/socket/stats_event.c | 8 ++++++++ libstats/socket/tests/stats_event_test.cpp | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/libstats/socket/include/stats_event.h b/libstats/socket/include/stats_event.h index 6a2d9cd6e..ff842838b 100644 --- a/libstats/socket/include/stats_event.h +++ b/libstats/socket/include/stats_event.h @@ -152,6 +152,7 @@ void AStatsEvent_addBoolAnnotation(AStatsEvent* event, uint8_t annotationId, boo void AStatsEvent_addInt32Annotation(AStatsEvent* event, uint8_t annotationId, int32_t value); // Internal/test APIs. Should not be exposed outside of the APEX. +void AStatsEvent_overwriteTimestamp(AStatsEvent* event, uint64_t timestampNs); uint32_t AStatsEvent_getAtomId(AStatsEvent* event); // Size is an output parameter. uint8_t* AStatsEvent_getBuffer(AStatsEvent* event, size_t* size); diff --git a/libstats/socket/stats_event.c b/libstats/socket/stats_event.c index a26ac2d6e..b045d9341 100644 --- a/libstats/socket/stats_event.c +++ b/libstats/socket/stats_event.c @@ -115,6 +115,14 @@ void AStatsEvent_setAtomId(AStatsEvent* event, uint32_t atomId) { event->numElements++; } +// Overwrites the timestamp populated in AStatsEvent_obtain with a custom +// timestamp. Should only be called from test code. +void AStatsEvent_overwriteTimestamp(AStatsEvent* event, uint64_t timestampNs) { + memcpy(&event->buf[POS_TIMESTAMP + sizeof(uint8_t)], ×tampNs, sizeof(timestampNs)); + // Do not increment numElements because we already accounted for the timestamp + // within AStatsEvent_obtain. +} + // Side-effect: modifies event->errors if the buffer would overflow static bool overflows(AStatsEvent* event, size_t size) { if (event->size + size > MAX_EVENT_PAYLOAD) { diff --git a/libstats/socket/tests/stats_event_test.cpp b/libstats/socket/tests/stats_event_test.cpp index 48bf4b8e2..69d0a9b75 100644 --- a/libstats/socket/tests/stats_event_test.cpp +++ b/libstats/socket/tests/stats_event_test.cpp @@ -318,3 +318,21 @@ TEST(StatsEventTest, TestOverflowError) { AStatsEvent_release(event); } + +TEST(StatsEventTest, TestOverwriteTimestamp) { + uint32_t atomId = 100; + int64_t expectedTimestamp = 0x123456789; + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, atomId); + AStatsEvent_overwriteTimestamp(event, expectedTimestamp); + AStatsEvent_build(event); + + uint8_t* buffer = AStatsEvent_getBuffer(event, NULL); + + // Make sure that the timestamp is being overwritten. + checkMetadata(&buffer, /*numElements=*/0, /*startTime=*/expectedTimestamp, + /*endTime=*/expectedTimestamp, atomId); + + EXPECT_EQ(AStatsEvent_getErrors(event), 0); + AStatsEvent_release(event); +} From e1cff24259d00dd7b7320d06673ebe90506bd10d Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Fri, 14 Feb 2020 12:03:35 -0800 Subject: [PATCH 068/388] Delete stats_event_list from libstatssocket This change is done in internal master because the flag has not been switched in AOSP, so stats_event_list is still being used there. Test: m -j Bug: 145573568 Change-Id: Ica525d0fd731b8d3e9d273ce2220a3d3179d93d9 --- libstats/socket/Android.bp | 13 +- libstats/socket/include/stats_event_list.h | 248 --------------------- libstats/socket/stats_event_list.c | 155 ------------- 3 files changed, 2 insertions(+), 414 deletions(-) delete mode 100644 libstats/socket/include/stats_event_list.h delete mode 100644 libstats/socket/stats_event_list.c diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index 893ef2878..f8b38ad0b 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -22,9 +22,6 @@ cc_library { srcs: [ "stats_buffer_writer.c", "stats_event.c", - // TODO(b/145573568): Remove stats_event_list once stats_event - // migration is complete. - "stats_event_list.c", "stats_socket.c", "statsd_writer.c", ], @@ -32,14 +29,10 @@ cc_library { cflags: [ "-Wall", "-Werror", - "-DLIBLOG_LOG_TAG=1006", - "-DWRITE_TO_STATSD=1", - "-DWRITE_TO_LOGD=0", ], export_include_dirs: ["include"], - shared_libs: [ - "libcutils", - "liblog", + static_libs: [ + "libcutils", // does not expose a stable C API ], // enumerate stable entry points for APEX use @@ -78,7 +71,6 @@ cc_benchmark { ], shared_libs: [ "libcutils", - "liblog", "libgtest_prod", ], } @@ -96,7 +88,6 @@ cc_test { ], shared_libs: [ "libcutils", - "liblog", "libutils", ], test_suites: ["device-tests"], diff --git a/libstats/socket/include/stats_event_list.h b/libstats/socket/include/stats_event_list.h deleted file mode 100644 index 7a26536d8..000000000 --- a/libstats/socket/include/stats_event_list.h +++ /dev/null @@ -1,248 +0,0 @@ -/* - * 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. - */ - -#pragma once - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -void reset_log_context(android_log_context ctx); -int write_to_logger(android_log_context context, log_id_t id); -void note_log_drop(int error, int atomId); -void stats_log_close(); -int android_log_write_char_array(android_log_context ctx, const char* value, size_t len); -#ifdef __cplusplus -} -#endif - -#ifdef __cplusplus -/** - * A copy of android_log_event_list class. - * - * android_log_event_list is going to be deprecated soon, so copy it here to - * avoid creating dependency on upstream code. TODO(b/78304629): Rewrite this - * code. - */ -class stats_event_list { - private: - android_log_context ctx; - int ret; - - stats_event_list(const stats_event_list&) = delete; - void operator=(const stats_event_list&) = delete; - - public: - explicit stats_event_list(int tag) : ret(0) { - ctx = create_android_logger(static_cast(tag)); - } - ~stats_event_list() { android_log_destroy(&ctx); } - - int close() { - int retval = android_log_destroy(&ctx); - if (retval < 0) { - ret = retval; - } - return retval; - } - - /* To allow above C calls to use this class as parameter */ - operator android_log_context() const { return ctx; } - - /* return errors or transmit status */ - int status() const { return ret; } - - int begin() { - int retval = android_log_write_list_begin(ctx); - if (retval < 0) { - ret = retval; - } - return ret; - } - int end() { - int retval = android_log_write_list_end(ctx); - if (retval < 0) { - ret = retval; - } - return ret; - } - - stats_event_list& operator<<(int32_t value) { - int retval = android_log_write_int32(ctx, value); - if (retval < 0) { - ret = retval; - } - return *this; - } - - stats_event_list& operator<<(uint32_t value) { - int retval = android_log_write_int32(ctx, static_cast(value)); - if (retval < 0) { - ret = retval; - } - return *this; - } - - stats_event_list& operator<<(bool value) { - int retval = android_log_write_int32(ctx, value ? 1 : 0); - if (retval < 0) { - ret = retval; - } - return *this; - } - - stats_event_list& operator<<(int64_t value) { - int retval = android_log_write_int64(ctx, value); - if (retval < 0) { - ret = retval; - } - return *this; - } - - stats_event_list& operator<<(uint64_t value) { - int retval = android_log_write_int64(ctx, static_cast(value)); - if (retval < 0) { - ret = retval; - } - return *this; - } - - stats_event_list& operator<<(const char* value) { - int retval = android_log_write_string8(ctx, value); - if (retval < 0) { - ret = retval; - } - return *this; - } - - stats_event_list& operator<<(const std::string& value) { - int retval = android_log_write_string8_len(ctx, value.data(), value.length()); - if (retval < 0) { - ret = retval; - } - return *this; - } - - stats_event_list& operator<<(float value) { - int retval = android_log_write_float32(ctx, value); - if (retval < 0) { - ret = retval; - } - return *this; - } - - int write(log_id_t id = LOG_ID_EVENTS) { - /* facilitate -EBUSY retry */ - if ((ret == -EBUSY) || (ret > 0)) { - ret = 0; - } - int retval = write_to_logger(ctx, id); - /* existing errors trump transmission errors */ - if (!ret) { - ret = retval; - } - return ret; - } - - /* - * Append methods removes any integer promotion - * confusion, and adds access to string with length. - * Append methods are also added for all types for - * convenience. - */ - - bool AppendInt(int32_t value) { - int retval = android_log_write_int32(ctx, value); - if (retval < 0) { - ret = retval; - } - return ret >= 0; - } - - bool AppendLong(int64_t value) { - int retval = android_log_write_int64(ctx, value); - if (retval < 0) { - ret = retval; - } - return ret >= 0; - } - - bool AppendString(const char* value) { - int retval = android_log_write_string8(ctx, value); - if (retval < 0) { - ret = retval; - } - return ret >= 0; - } - - bool AppendString(const char* value, size_t len) { - int retval = android_log_write_string8_len(ctx, value, len); - if (retval < 0) { - ret = retval; - } - return ret >= 0; - } - - bool AppendString(const std::string& value) { - int retval = android_log_write_string8_len(ctx, value.data(), value.length()); - if (retval < 0) { - ret = retval; - } - return ret; - } - - bool Append(const std::string& value) { - int retval = android_log_write_string8_len(ctx, value.data(), value.length()); - if (retval < 0) { - ret = retval; - } - return ret; - } - - bool AppendFloat(float value) { - int retval = android_log_write_float32(ctx, value); - if (retval < 0) { - ret = retval; - } - return ret >= 0; - } - - template - bool Append(Tvalue value) { - *this << value; - return ret >= 0; - } - - bool Append(const char* value, size_t len) { - int retval = android_log_write_string8_len(ctx, value, len); - if (retval < 0) { - ret = retval; - } - return ret >= 0; - } - - bool AppendCharArray(const char* value, size_t len) { - int retval = android_log_write_char_array(ctx, value, len); - if (retval < 0) { - ret = retval; - } - return ret >= 0; - } -}; - -#endif diff --git a/libstats/socket/stats_event_list.c b/libstats/socket/stats_event_list.c deleted file mode 100644 index 661a2237f..000000000 --- a/libstats/socket/stats_event_list.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * 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/stats_event_list.h" - -#include -#include -#include "stats_buffer_writer.h" - -#define MAX_EVENT_PAYLOAD (LOGGER_ENTRY_MAX_PAYLOAD - sizeof(int32_t)) - -typedef struct { - uint32_t tag; - unsigned pos; /* Read/write position into buffer */ - unsigned count[ANDROID_MAX_LIST_NEST_DEPTH + 1]; /* Number of elements */ - unsigned list[ANDROID_MAX_LIST_NEST_DEPTH + 1]; /* pos for list counter */ - unsigned list_nest_depth; - unsigned len; /* Length or raw buffer. */ - bool overflow; - bool list_stop; /* next call decrement list_nest_depth and issue a stop */ - enum { - kAndroidLoggerRead = 1, - kAndroidLoggerWrite = 2, - } read_write_flag; - uint8_t storage[LOGGER_ENTRY_MAX_PAYLOAD]; -} android_log_context_internal; - -// Similar to create_android_logger(), but instead of allocation a new buffer, -// this function resets the buffer for resuse. -void reset_log_context(android_log_context ctx) { - if (!ctx) { - return; - } - android_log_context_internal* context = (android_log_context_internal*)(ctx); - uint32_t tag = context->tag; - memset(context, 0, sizeof(android_log_context_internal)); - - context->tag = tag; - context->read_write_flag = kAndroidLoggerWrite; - size_t needed = sizeof(uint8_t) + sizeof(uint8_t); - if ((context->pos + needed) > MAX_EVENT_PAYLOAD) { - context->overflow = true; - } - /* Everything is a list */ - context->storage[context->pos + 0] = EVENT_TYPE_LIST; - context->list[0] = context->pos + 1; - context->pos += needed; -} - -int stats_write_list(android_log_context ctx) { - android_log_context_internal* context; - const char* msg; - ssize_t len; - - context = (android_log_context_internal*)(ctx); - if (!context || (kAndroidLoggerWrite != context->read_write_flag)) { - return -EBADF; - } - - if (context->list_nest_depth) { - return -EIO; - } - - /* NB: if there was overflow, then log is truncated. Nothing reported */ - context->storage[1] = context->count[0]; - len = context->len = context->pos; - msg = (const char*)context->storage; - /* it's not a list */ - if (context->count[0] <= 1) { - len -= sizeof(uint8_t) + sizeof(uint8_t); - if (len < 0) { - len = 0; - } - msg += sizeof(uint8_t) + sizeof(uint8_t); - } - - return write_buffer_to_statsd((void*)msg, len, 0); -} - -int write_to_logger(android_log_context ctx, log_id_t id) { - int retValue = 0; - - if (WRITE_TO_LOGD) { - retValue = android_log_write_list(ctx, id); - } - - if (WRITE_TO_STATSD) { - // log_event_list's cast operator is overloaded. - int ret = stats_write_list(ctx); - // In debugging phase, we may write to both logd and statsd. Prefer to - // return statsd socket write error code here. - if (ret < 0) { - retValue = ret; - } - } - - return retValue; -} - -static inline void copy4LE(uint8_t* buf, uint32_t val) { - buf[0] = val & 0xFF; - buf[1] = (val >> 8) & 0xFF; - buf[2] = (val >> 16) & 0xFF; - buf[3] = (val >> 24) & 0xFF; -} - -// Note: this function differs from android_log_write_string8_len in that the length passed in -// should be treated as actual length and not max length. -int android_log_write_char_array(android_log_context ctx, const char* value, size_t actual_len) { - size_t needed; - ssize_t len = actual_len; - android_log_context_internal* context; - - context = (android_log_context_internal*)ctx; - if (!context || (kAndroidLoggerWrite != context->read_write_flag)) { - return -EBADF; - } - if (context->overflow) { - return -EIO; - } - if (!value) { - value = ""; - len = 0; - } - needed = sizeof(uint8_t) + sizeof(int32_t) + len; - if ((context->pos + needed) > MAX_EVENT_PAYLOAD) { - /* Truncate string for delivery */ - len = MAX_EVENT_PAYLOAD - context->pos - 1 - sizeof(int32_t); - if (len <= 0) { - context->overflow = true; - return -EIO; - } - } - context->count[context->list_nest_depth]++; - context->storage[context->pos + 0] = EVENT_TYPE_STRING; - copy4LE(&context->storage[context->pos + 1], len); - if (len) { - memcpy(&context->storage[context->pos + 5], value, len); - } - context->pos += needed; - return len; -} From 6a8a7c2e20c0c36681414db237ab567e7a4ff324 Mon Sep 17 00:00:00 2001 From: Alessio Balsini Date: Tue, 21 Jan 2020 20:38:46 +0000 Subject: [PATCH 069/388] snapshotctl: send snapshot merge report metrics Add the --report flag to spshotctl to submit Android metrics on the final state of the snapshot merge operation, the duration if the merge is completed in a single session, or the number of reboots that happened before completing the merge. Bug: 138817833 Bug: 148138124 Test: m + OTA + statsd_testdrive Change-Id: Id657f33963bb9926553fa6eeb1721a5229f11e87 Signed-off-by: Alessio Balsini --- fs_mgr/libsnapshot/Android.bp | 1 + fs_mgr/libsnapshot/snapshotctl.cpp | 69 ++++++++++++++++++++++++------ 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp index d274ba4b6..63bdcc52b 100644 --- a/fs_mgr/libsnapshot/Android.bp +++ b/fs_mgr/libsnapshot/Android.bp @@ -238,6 +238,7 @@ cc_binary { "liblog", "liblp", "libprotobuf-cpp-lite", + "libstatslog", "libutils", // TODO(b/148818798): remove when parent bug is fixed. diff --git a/fs_mgr/libsnapshot/snapshotctl.cpp b/fs_mgr/libsnapshot/snapshotctl.cpp index e35ad4b2d..34d3d69d1 100644 --- a/fs_mgr/libsnapshot/snapshotctl.cpp +++ b/fs_mgr/libsnapshot/snapshotctl.cpp @@ -24,9 +24,11 @@ #include #include #include +#include #include -#include "utility.h" +#include +#include "snapshot_stats.h" #include "utility.h" using namespace std::string_literals; @@ -37,17 +39,29 @@ int Usage() { "Actions:\n" " dump\n" " Print snapshot states.\n" - " merge [--logcat] [--log-to-file]\n" + " merge [--logcat] [--log-to-file] [--report] [--dry-run]\n" " Initialize merge and wait for it to be completed.\n" " If --logcat is specified, log to logcat.\n" " If --log-to-file is specified, log to /data/misc/snapshotctl_log/.\n" - " If both specified, log to both. If none specified, log to stdout.\n"; + " If both specified, log to both. If none specified, log to stdout.\n" + " If --report is specified, send merge statistics to statsd.\n" + " If --dry-run flag, no real merge operation is is triggered, and\n" + " sample statistics are sent to statsd for testing purpose.\n"; return EX_USAGE; } namespace android { namespace snapshot { +static SnapshotMergeReport GetDummySnapshotMergeReport() { + SnapshotMergeReport fake_report; + + fake_report.set_state(UpdateState::MergeCompleted); + fake_report.set_resume_count(56); + + return fake_report; +} + bool DumpCmdHandler(int /*argc*/, char** argv) { android::base::InitLogging(argv, &android::base::StderrLogger); return SnapshotManager::New()->Dump(std::cout); @@ -113,24 +127,53 @@ class MergeCmdLogger { }; bool MergeCmdHandler(int argc, char** argv) { - auto begin = std::chrono::steady_clock::now(); + std::chrono::milliseconds passed_ms; + + bool report_to_statsd = false; + bool dry_run = false; + for (int i = 2; i < argc; ++i) { + if (argv[i] == "--report"s) { + report_to_statsd = true; + } else if (argv[i] == "--dry-run"s) { + dry_run = true; + } + } // 'snapshotctl merge' is stripped away from arguments to // Logger. android::base::InitLogging(argv); android::base::SetLogger(MergeCmdLogger(argc - 2, argv + 2)); - auto state = SnapshotManager::New()->InitiateMergeAndWait(); + UpdateState state; + SnapshotMergeReport merge_report; + if (dry_run) { + merge_report = GetDummySnapshotMergeReport(); + state = merge_report.state(); + passed_ms = std::chrono::milliseconds(1234); + } else { + auto begin = std::chrono::steady_clock::now(); + + state = SnapshotManager::New()->InitiateMergeAndWait(&merge_report); + + // We could wind up in the Unverified state if the device rolled back or + // hasn't fully rebooted. Ignore this. + if (state == UpdateState::None || state == UpdateState::Unverified) { + return true; + } - // We could wind up in the Unverified state if the device rolled back or - // hasn't fully rebooted. Ignore this. - if (state == UpdateState::None || state == UpdateState::Unverified) { - return true; - } - if (state == UpdateState::MergeCompleted) { auto end = std::chrono::steady_clock::now(); - auto passed = std::chrono::duration_cast(end - begin).count(); - LOG(INFO) << "Snapshot merged in " << passed << " ms."; + passed_ms = std::chrono::duration_cast(end - begin); + } + + if (report_to_statsd) { + android::util::stats_write(android::util::SNAPSHOT_MERGE_REPORTED, + static_cast(merge_report.state()), + static_cast(passed_ms.count()), + static_cast(merge_report.resume_count())); + } + + if (state == UpdateState::MergeCompleted) { + LOG(INFO) << "Snapshot merged in " << passed_ms.count() << " ms."; return true; } From 3a40ee5402c53f3ceb2acf962c0ed5c69836ef03 Mon Sep 17 00:00:00 2001 From: Muhammad Qureshi Date: Tue, 18 Feb 2020 16:52:22 -0800 Subject: [PATCH 070/388] //apex_available:platform should be first in list Test: m Change-Id: I6ede6f008bc149f587ae2fc024d5869463b2c64d --- libstats/socket/Android.bp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index f8b38ad0b..437879b6c 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -43,10 +43,10 @@ cc_library { ], }, apex_available: [ - "com.android.os.statsd", - "test_com.android.os.statsd", //TODO(b/149340100): Remove this once libstatssocket is only linked as shared. "//apex_available:platform", + "com.android.os.statsd", + "test_com.android.os.statsd", ], } From 8dcbcf13e44116f8681028a2ff44c076565d1414 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Wed, 19 Feb 2020 10:56:17 -0800 Subject: [PATCH 071/388] Update init.rc for statsd setup Apexes do not support "on" macros, so we are moving them into the system partition Bug: 145923087 Test: m -j Change-Id: Ic84e77269f80097b675d6a1b0d206c2bae7d918d --- rootdir/init.rc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rootdir/init.rc b/rootdir/init.rc index 10fa12bd0..ae9d6953c 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -732,6 +732,12 @@ on post-fs-data # Create root dir for Incremental Service mkdir /data/incremental 0771 system system encryption=Require + # Create directories for statsd + mkdir /data/misc/stats-data/ 0770 statsd system + mkdir /data/misc/stats-service/ 0770 statsd system + mkdir /data/misc/stats-active-metric/ 0770 statsd system + mkdir /data/misc/train-info/ 0770 statsd system + # Wait for apexd to finish activating APEXes before starting more processes. wait_for_prop apexd.status ready perform_apex_config From 77a8d9f64e1939f665b3c7ac20657a86fd06757d Mon Sep 17 00:00:00 2001 From: Howard Ro Date: Thu, 20 Feb 2020 04:19:41 +0000 Subject: [PATCH 072/388] Revert "Update init.rc for statsd setup" Revert "Migrate Statsd to the apex" Revert "Update statsd binary path for apex" Revert submission 10356003-statsd_apex Reason for revert: https://android-build.googleplex.com/builds/quarterdeck?branch=git_master&target=build_test&lkgb=6221366&fkbb=6221428 Reverted Changes: Ic84e77269:Update init.rc for statsd setup I6f3fab4b4:Update statsd binary path for apex Ib4ea98aed:Migrate Statsd to the apex Change-Id: I0db7f3be927f379b70e0b68bcf1cfdab3f2f1ae0 --- rootdir/init.rc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rootdir/init.rc b/rootdir/init.rc index ae9d6953c..10fa12bd0 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -732,12 +732,6 @@ on post-fs-data # Create root dir for Incremental Service mkdir /data/incremental 0771 system system encryption=Require - # Create directories for statsd - mkdir /data/misc/stats-data/ 0770 statsd system - mkdir /data/misc/stats-service/ 0770 statsd system - mkdir /data/misc/stats-active-metric/ 0770 statsd system - mkdir /data/misc/train-info/ 0770 statsd system - # Wait for apexd to finish activating APEXes before starting more processes. wait_for_prop apexd.status ready perform_apex_config From 78900ad658b4575dbf61ab7d6e7c632bb978547e Mon Sep 17 00:00:00 2001 From: Howard Ro Date: Thu, 20 Feb 2020 04:57:00 +0000 Subject: [PATCH 073/388] Revert^2 "Update init.rc for statsd setup" 77a8d9f64e1939f665b3c7ac20657a86fd06757d Change-Id: Ic8dce44e6e83323381a39682b833acf8feb714a2 --- rootdir/init.rc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rootdir/init.rc b/rootdir/init.rc index 10fa12bd0..ae9d6953c 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -732,6 +732,12 @@ on post-fs-data # Create root dir for Incremental Service mkdir /data/incremental 0771 system system encryption=Require + # Create directories for statsd + mkdir /data/misc/stats-data/ 0770 statsd system + mkdir /data/misc/stats-service/ 0770 statsd system + mkdir /data/misc/stats-active-metric/ 0770 statsd system + mkdir /data/misc/train-info/ 0770 statsd system + # Wait for apexd to finish activating APEXes before starting more processes. wait_for_prop apexd.status ready perform_apex_config From c8a43605c3fe2dade51cd67e89d08847a1a2e484 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 21 Feb 2020 13:25:54 -0800 Subject: [PATCH 074/388] Remove various bits of dead code and unused workarounds. Test: treehugger Change-Id: I68fcd5da304d04ff4da3c3f3712fb79ce6b5791e (cherry picked from commit f63926a5c2f3f505eac8c081bad679ddfaeaba98) --- adb/sysdeps/errno.cpp | 4 +-- base/include/android-base/macros.h | 4 --- debuggerd/crasher/Android.bp | 6 ---- debuggerd/crasher/mips/crashglue.S | 48 ---------------------------- debuggerd/crasher/mips64/crashglue.S | 48 ---------------------------- init/security.cpp | 6 +--- libutils/Android.bp | 12 ------- 7 files changed, 3 insertions(+), 125 deletions(-) delete mode 100644 debuggerd/crasher/mips/crashglue.S delete mode 100644 debuggerd/crasher/mips64/crashglue.S diff --git a/adb/sysdeps/errno.cpp b/adb/sysdeps/errno.cpp index 9a37ea2fd..e6af68b48 100644 --- a/adb/sysdeps/errno.cpp +++ b/adb/sysdeps/errno.cpp @@ -24,7 +24,7 @@ #include "adb.h" -// Use the linux asm-generic values for errno (which are used on all android archs but mips). +// Use the linux asm-generic values for errno (which are used on all android architectures). #define ERRNO_VALUES() \ ERRNO_VALUE(EACCES, 13); \ ERRNO_VALUE(EEXIST, 17); \ @@ -48,7 +48,7 @@ ERRNO_VALUE(ETXTBSY, 26) // Make sure these values are actually correct. -#if defined(__linux__) && !defined(__mips__) +#if defined(__linux__) #define ERRNO_VALUE(error_name, wire_value) static_assert((error_name) == (wire_value), "") ERRNO_VALUES(); #undef ERRNO_VALUE diff --git a/base/include/android-base/macros.h b/base/include/android-base/macros.h index 5abf5141f..546b2ec18 100644 --- a/base/include/android-base/macros.h +++ b/base/include/android-base/macros.h @@ -143,8 +143,4 @@ void UNUSED(const T&...) { #define ABI_STRING "x86" #elif defined(__x86_64__) #define ABI_STRING "x86_64" -#elif defined(__mips__) && !defined(__LP64__) -#define ABI_STRING "mips" -#elif defined(__mips__) && defined(__LP64__) -#define ABI_STRING "mips64" #endif diff --git a/debuggerd/crasher/Android.bp b/debuggerd/crasher/Android.bp index e86f499bd..61c539580 100644 --- a/debuggerd/crasher/Android.bp +++ b/debuggerd/crasher/Android.bp @@ -24,12 +24,6 @@ cc_defaults { arm64: { srcs: ["arm64/crashglue.S"], }, - mips: { - srcs: ["mips/crashglue.S"], - }, - mips64: { - srcs: ["mips64/crashglue.S"], - }, x86: { srcs: ["x86/crashglue.S"], }, diff --git a/debuggerd/crasher/mips/crashglue.S b/debuggerd/crasher/mips/crashglue.S deleted file mode 100644 index 70a664127..000000000 --- a/debuggerd/crasher/mips/crashglue.S +++ /dev/null @@ -1,48 +0,0 @@ - .set noat - - .globl crash1 - .globl crashnostack - -crash1: - li $0,0xdead0000+0 - li $1,0xdead0000+1 - li $2,0xdead0000+2 - li $3,0xdead0000+3 - li $4,0xdead0000+4 - li $5,0xdead0000+5 - li $6,0xdead0000+6 - li $7,0xdead0000+7 - li $8,0xdead0000+8 - li $9,0xdead0000+9 - li $10,0xdead0000+10 - li $11,0xdead0000+11 - li $12,0xdead0000+12 - li $13,0xdead0000+13 - li $14,0xdead0000+14 - li $15,0xdead0000+15 - li $16,0xdead0000+16 - li $17,0xdead0000+17 - li $18,0xdead0000+18 - li $19,0xdead0000+19 - li $20,0xdead0000+20 - li $21,0xdead0000+21 - li $22,0xdead0000+22 - li $23,0xdead0000+23 - li $24,0xdead0000+24 - li $25,0xdead0000+25 - li $26,0xdead0000+26 - li $27,0xdead0000+27 - li $28,0xdead0000+28 - # don't trash the stack otherwise the signal handler won't run - #li $29,0xdead0000+29 - li $30,0xdead0000+30 - li $31,0xdead0000+31 - - lw $zero,($0) - b . - - -crashnostack: - li $sp, 0 - lw $zero,($0) - b . diff --git a/debuggerd/crasher/mips64/crashglue.S b/debuggerd/crasher/mips64/crashglue.S deleted file mode 100644 index 70a664127..000000000 --- a/debuggerd/crasher/mips64/crashglue.S +++ /dev/null @@ -1,48 +0,0 @@ - .set noat - - .globl crash1 - .globl crashnostack - -crash1: - li $0,0xdead0000+0 - li $1,0xdead0000+1 - li $2,0xdead0000+2 - li $3,0xdead0000+3 - li $4,0xdead0000+4 - li $5,0xdead0000+5 - li $6,0xdead0000+6 - li $7,0xdead0000+7 - li $8,0xdead0000+8 - li $9,0xdead0000+9 - li $10,0xdead0000+10 - li $11,0xdead0000+11 - li $12,0xdead0000+12 - li $13,0xdead0000+13 - li $14,0xdead0000+14 - li $15,0xdead0000+15 - li $16,0xdead0000+16 - li $17,0xdead0000+17 - li $18,0xdead0000+18 - li $19,0xdead0000+19 - li $20,0xdead0000+20 - li $21,0xdead0000+21 - li $22,0xdead0000+22 - li $23,0xdead0000+23 - li $24,0xdead0000+24 - li $25,0xdead0000+25 - li $26,0xdead0000+26 - li $27,0xdead0000+27 - li $28,0xdead0000+28 - # don't trash the stack otherwise the signal handler won't run - #li $29,0xdead0000+29 - li $30,0xdead0000+30 - li $31,0xdead0000+31 - - lw $zero,($0) - b . - - -crashnostack: - li $sp, 0 - lw $zero,($0) - b . diff --git a/init/security.cpp b/init/security.cpp index 6cbe642c0..2450d654b 100644 --- a/init/security.cpp +++ b/init/security.cpp @@ -128,8 +128,7 @@ static bool SetHighestAvailableOptionValue(const std::string& path, int min, int #define MMAP_RND_PATH "/proc/sys/vm/mmap_rnd_bits" #define MMAP_RND_COMPAT_PATH "/proc/sys/vm/mmap_rnd_compat_bits" -// __attribute__((unused)) due to lack of mips support: see mips block in SetMmapRndBitsAction -static bool __attribute__((unused)) SetMmapRndBitsMin(int start, int min, bool compat) { +static bool SetMmapRndBitsMin(int start, int min, bool compat) { std::string path; if (compat) { path = MMAP_RND_COMPAT_PATH; @@ -174,9 +173,6 @@ Result SetMmapRndBitsAction(const BuiltinArguments&) { if (SetMmapRndBitsMin(16, 16, h64)) { return {}; } -#elif defined(__mips__) || defined(__mips64__) - // TODO: add mips support b/27788820 - return {}; #else LOG(ERROR) << "Unknown architecture"; #endif diff --git a/libutils/Android.bp b/libutils/Android.bp index 33117936c..9ddbedfbc 100644 --- a/libutils/Android.bp +++ b/libutils/Android.bp @@ -74,12 +74,6 @@ cc_defaults { "liblog", ], - arch: { - mips: { - cflags: ["-DALIGN_DOUBLE"], - }, - }, - target: { android: { cflags: ["-fvisibility=protected"], @@ -174,12 +168,6 @@ cc_library { "CallStack.cpp", ], - arch: { - mips: { - cflags: ["-DALIGN_DOUBLE"], - }, - }, - shared_libs: [ "libutils", "libbacktrace", From 7e41e88cc591fc74b35e313623fabfb518c5fac5 Mon Sep 17 00:00:00 2001 From: David Srbecky Date: Thu, 20 Feb 2020 16:22:52 +0000 Subject: [PATCH 075/388] Rewrite DwarfSectionImpl::InsertFde Simplify and fix the algorithm. For consecutive functions (eg [10,20] [20,30]) without padding in between, the old algorithm would drop FDEs. Bug: http://b/150050915 Test: libunwindstack_test Change-Id: Ie886922bec262fb64d4b2ecf01c2961d0652dcdb (cherry picked from commit a6617cb17926a9868a900ce43c9b358bafe88d9b) --- libunwindstack/DwarfSection.cpp | 26 +------- libunwindstack/tests/DwarfDebugFrameTest.cpp | 68 ++++++++++++++++++-- 2 files changed, 66 insertions(+), 28 deletions(-) diff --git a/libunwindstack/DwarfSection.cpp b/libunwindstack/DwarfSection.cpp index e6263f81b..18bd490f9 100644 --- a/libunwindstack/DwarfSection.cpp +++ b/libunwindstack/DwarfSection.cpp @@ -621,29 +621,9 @@ void DwarfSectionImpl::InsertFde(const DwarfFde* fde) { uint64_t start = fde->pc_start; uint64_t end = fde->pc_end; auto it = fdes_.upper_bound(start); - bool add_element = false; - while (it != fdes_.end() && start < end) { - if (add_element) { - add_element = false; - if (end < it->second.first) { - if (it->first == end) { - return; - } - fdes_[end] = std::make_pair(start, fde); - return; - } - if (start != it->second.first) { - fdes_[it->second.first] = std::make_pair(start, fde); - } - } - if (start < it->first) { - if (end < it->second.first) { - if (it->first != end) { - fdes_[end] = std::make_pair(start, fde); - } - return; - } - add_element = true; + while (it != fdes_.end() && start < end && it->second.first < end) { + if (start < it->second.first) { + fdes_[it->second.first] = std::make_pair(start, fde); } start = it->first; ++it; diff --git a/libunwindstack/tests/DwarfDebugFrameTest.cpp b/libunwindstack/tests/DwarfDebugFrameTest.cpp index b6f574ac1..fac8a0e3f 100644 --- a/libunwindstack/tests/DwarfDebugFrameTest.cpp +++ b/libunwindstack/tests/DwarfDebugFrameTest.cpp @@ -754,16 +754,24 @@ TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc_interleaved) { SetFde32(&this->memory_, 0x5400, 0xfc, 0, 0xa00, 0x100); // FDE 4 (0x100 - 0xb00) SetFde32(&this->memory_, 0x5500, 0xfc, 0, 0x150, 0xa00); - // FDE 5 (0x0 - 0x50) - SetFde32(&this->memory_, 0x5600, 0xfc, 0, 0, 0x50); + // FDE 5 (0x50 - 0xa0) + SetFde32(&this->memory_, 0x5600, 0xfc, 0, 0x50, 0x50); + // FDE 6 (0x0 - 0x50) + SetFde32(&this->memory_, 0x5700, 0xfc, 0, 0, 0x50); - this->debug_frame_->Init(0x5000, 0x700, 0); + this->debug_frame_->Init(0x5000, 0x800, 0); // Force reading all entries so no entries are found. const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0xfffff); ASSERT_TRUE(fde == nullptr); - // 0x0 - 0x50 FDE 5 + // 0x50 - 0xa0 FDE 5 + fde = this->debug_frame_->GetFdeFromPc(0x60); + ASSERT_TRUE(fde != nullptr); + EXPECT_EQ(0x50U, fde->pc_start); + EXPECT_EQ(0xa0U, fde->pc_end); + + // 0x0 - 0x50 FDE 6 fde = this->debug_frame_->GetFdeFromPc(0x10); ASSERT_TRUE(fde != nullptr); EXPECT_EQ(0U, fde->pc_start); @@ -812,6 +820,56 @@ TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc_interleaved) { EXPECT_EQ(0xb50U, fde->pc_end); } +TYPED_TEST_P(DwarfDebugFrameTest, GetFdeFromPc_overlap) { + SetCie32(&this->memory_, 0x5000, 0xfc, std::vector{1, '\0', 0, 0, 1}); + + // FDE 0 (0x100 - 0x200) + SetFde32(&this->memory_, 0x5100, 0xfc, 0, 0x100, 0x100); + // FDE 1 (0x50 - 0x550) + SetFde32(&this->memory_, 0x5200, 0xfc, 0, 0x50, 0x500); + // FDE 2 (0x00 - 0x800) + SetFde32(&this->memory_, 0x5300, 0xfc, 0, 0x0, 0x800); + + this->debug_frame_->Init(0x5000, 0x400, 0); + + // Force reading all entries so no entries are found. + const DwarfFde* fde = this->debug_frame_->GetFdeFromPc(0xfffff); + ASSERT_TRUE(fde == nullptr); + + // 0x0 - 0x50 FDE 2 + fde = this->debug_frame_->GetFdeFromPc(0x10); + ASSERT_TRUE(fde != nullptr); + EXPECT_EQ(0x0U, fde->pc_start); + EXPECT_EQ(0x800U, fde->pc_end); + + // 0x50 - 0x100 FDE 1 + fde = this->debug_frame_->GetFdeFromPc(0x60); + ASSERT_TRUE(fde != nullptr); + EXPECT_EQ(0x50U, fde->pc_start); + EXPECT_EQ(0x550U, fde->pc_end); + + // 0x100 - 0x200 FDE 0 + fde = this->debug_frame_->GetFdeFromPc(0x170); + ASSERT_TRUE(fde != nullptr); + EXPECT_EQ(0x100U, fde->pc_start); + EXPECT_EQ(0x200U, fde->pc_end); + + // 0x200 - 0x550 FDE 1 + fde = this->debug_frame_->GetFdeFromPc(0x210); + ASSERT_TRUE(fde != nullptr); + EXPECT_EQ(0x50U, fde->pc_start); + EXPECT_EQ(0x550U, fde->pc_end); + + // 0x550 - 0x800 FDE 2 + fde = this->debug_frame_->GetFdeFromPc(0x580); + ASSERT_TRUE(fde != nullptr); + EXPECT_EQ(0x0U, fde->pc_start); + EXPECT_EQ(0x800U, fde->pc_end); + + fde = this->debug_frame_->GetFdeFromPc(0x810); + ASSERT_TRUE(fde == nullptr); +} + REGISTER_TYPED_TEST_SUITE_P( DwarfDebugFrameTest, GetFdes32, GetFdes32_after_GetFdeFromPc, GetFdes32_not_in_section, GetFdeFromPc32, GetFdeFromPc32_reverse, GetFdeFromPc32_not_in_section, GetFdes64, @@ -822,7 +880,7 @@ REGISTER_TYPED_TEST_SUITE_P( GetCieFromOffset64_version4, GetCieFromOffset32_version5, GetCieFromOffset64_version5, GetCieFromOffset_version_invalid, GetCieFromOffset32_augment, GetCieFromOffset64_augment, GetFdeFromOffset32_augment, GetFdeFromOffset64_augment, GetFdeFromOffset32_lsda_address, - GetFdeFromOffset64_lsda_address, GetFdeFromPc_interleaved); + GetFdeFromOffset64_lsda_address, GetFdeFromPc_interleaved, GetFdeFromPc_overlap); typedef ::testing::Types DwarfDebugFrameTestTypes; INSTANTIATE_TYPED_TEST_SUITE_P(Libunwindstack, DwarfDebugFrameTest, DwarfDebugFrameTestTypes); From 7c2ae1f02cbf25cba1949e1a707e13874cde4547 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Mon, 24 Feb 2020 18:39:23 +0900 Subject: [PATCH 076/388] Mark updatable APEXes Mark updatable APEXes as updatable: true so that they are opted-out from optimizations that make sense only for non-updatable modules; such as symlinking to the libs in the system partition. Bug: 149805758 Test: m and check that there is no symlink from the APEX to the system partition. Change-Id: Ic3edc7e285e9eafbdaa20b18ccbc0b2231370779 --- adb/apex/Android.bp | 1 + 1 file changed, 1 insertion(+) diff --git a/adb/apex/Android.bp b/adb/apex/Android.bp index 01894552a..4346f6778 100644 --- a/adb/apex/Android.bp +++ b/adb/apex/Android.bp @@ -1,5 +1,6 @@ apex_defaults { name: "com.android.adbd-defaults", + updatable: true, binaries: ["adbd"], compile_multilib: "both", From c3605ef9c4fdff82b9d14827a8872e42a01e1a34 Mon Sep 17 00:00:00 2001 From: Arthur Ishiguro Date: Fri, 21 Feb 2020 16:53:43 -0800 Subject: [PATCH 077/388] Adds AID_CONTEXT_HUB This will be used to access the Context Hub. Bug: 149981913 Test: Compile Change-Id: Ic89cf5b1a8a01ea7077bf7dd89501ed3623f217d --- libcutils/include/private/android_filesystem_config.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libcutils/include/private/android_filesystem_config.h b/libcutils/include/private/android_filesystem_config.h index a2d36ff7b..b73a29b22 100644 --- a/libcutils/include/private/android_filesystem_config.h +++ b/libcutils/include/private/android_filesystem_config.h @@ -133,6 +133,7 @@ #define AID_EXTERNAL_STORAGE 1077 /* Full external storage access including USB OTG volumes */ #define AID_EXT_DATA_RW 1078 /* GID for app-private data directories on external storage */ #define AID_EXT_OBB_RW 1079 /* GID for OBB directories on external storage */ +#define AID_CONTEXT_HUB 1080 /* GID for access to the Context Hub */ /* Changes to this file must be made in AOSP, *not* in internal branches. */ #define AID_SHELL 2000 /* adb and debug shell user */ From 15c7a3f8f82b5a5730734215cce118f5e2c3025d Mon Sep 17 00:00:00 2001 From: George Burgess IV Date: Fri, 21 Feb 2020 14:36:31 -0800 Subject: [PATCH 078/388] incremental_server: fix a use of uninitalized memory Without this, the caller is likely to assume that their buffer is fully usable, which clang's analyzer doesn't believe is the case. Another option is to set `*size` to nonzero. Caught by the static analyzer: system/core/adb/client/incremental_server.cpp:111:31: warning: 1st function call argument is an uninitialized value [clang-analyzer-core.CallAndMessage] Bug: http://b/150032044 Test: TreeHugger Change-Id: Ib844aa4ab3ebb297ca8f6f4289bbe3212275275b Merged-In: Ib844aa4ab3ebb297ca8f6f4289bbe3212275275b (cherry picked from commit 19b500bd505dce85d90f5be6f318399aed9cc990) --- adb/client/incremental_server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adb/client/incremental_server.cpp b/adb/client/incremental_server.cpp index 726533d2a..585e50c44 100644 --- a/adb/client/incremental_server.cpp +++ b/adb/client/incremental_server.cpp @@ -258,7 +258,7 @@ bool IncrementalServer::SkipToRequest(void* buffer, size_t* size, bool blocking) if (r == -1) { fprintf(stderr, "Failed to read from fd %d: %d. Exit\n", adb_fd_.get(), errno); - return true; + return false; } // socket is closed From b5778c1fe7bfa04d2dea0191e340c9adc588110d Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 19 Feb 2020 13:50:57 -0800 Subject: [PATCH 079/388] adbd: remove static dependency on libcutils. We were previously statically linking libcutils into adbd for several different reasons, which were addressed as follows: socket functions: extracted to a statically linked libcutils_network fs_config: wrapped with a shared library on /system ATRACE: deleted the single use in adbd Bug: http://b/150032044 Test: treehugger Change-Id: I821fa174cfcbfa8e29a4be10de4016b817adbaf8 Merged-In: I821fa174cfcbfa8e29a4be10de4016b817adbaf8 (cherry picked from commit a9b62d545275ca32775a0bc5f004abe03aaa38ad) --- adb/Android.bp | 85 ++++------------ adb/adb_trace.h | 7 -- adb/client/adb_install.cpp | 1 + adb/client/incremental_server.cpp | 1 + adb/daemon/file_sync_service.cpp | 16 ++-- adb/daemon/usb.cpp | 1 + .../deploypatchgenerator/apk_archive.cpp | 2 + adb/{adbconnection => libs}/.clang-format | 0 adb/libs/adbconnection/.clang-format | 1 + adb/libs/adbconnection/Android.bp | 59 ++++++++++++ .../adbconnection/adbconnection_client.cpp | 0 .../adbconnection/adbconnection_server.cpp | 0 .../include/adbconnection/client.h | 0 .../include/adbconnection/server.h | 0 .../libadbconnection_client.map.txt | 0 adb/libs/libadbd_fs/Android.bp | 30 ++++++ adb/libs/libadbd_fs/adbd_fs.cpp | 30 ++++++ adb/libs/libadbd_fs/include/adbd_fs.h | 26 +++++ adb/libs/libadbd_fs/libadbd_fs.map.txt | 6 ++ libcutils/Android.bp | 96 ++++++++++++++++--- 20 files changed, 266 insertions(+), 95 deletions(-) rename adb/{adbconnection => libs}/.clang-format (100%) create mode 120000 adb/libs/adbconnection/.clang-format create mode 100644 adb/libs/adbconnection/Android.bp rename adb/{ => libs}/adbconnection/adbconnection_client.cpp (100%) rename adb/{ => libs}/adbconnection/adbconnection_server.cpp (100%) rename adb/{ => libs}/adbconnection/include/adbconnection/client.h (100%) rename adb/{ => libs}/adbconnection/include/adbconnection/server.h (100%) rename adb/{ => libs}/adbconnection/libadbconnection_client.map.txt (100%) create mode 100644 adb/libs/libadbd_fs/Android.bp create mode 100644 adb/libs/libadbd_fs/adbd_fs.cpp create mode 100644 adb/libs/libadbd_fs/include/adbd_fs.h create mode 100644 adb/libs/libadbd_fs/libadbd_fs.map.txt diff --git a/adb/Android.bp b/adb/Android.bp index 1004483ac..2f1fe3ca0 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -114,66 +114,6 @@ cc_defaults { }, } -// libadbconnection -// ========================================================= -// libadbconnection_client/server implement the socket handling for jdwp -// forwarding and the track-jdwp service. -cc_library { - name: "libadbconnection_server", - srcs: ["adbconnection/adbconnection_server.cpp"], - - export_include_dirs: ["adbconnection/include"], - - stl: "libc++_static", - shared_libs: ["liblog"], - static_libs: ["libbase"], - - defaults: ["adbd_defaults", "host_adbd_supported"], - - // Avoid getting duplicate symbol of android::build::getbuildnumber(). - use_version_lib: false, - - recovery_available: true, - compile_multilib: "both", -} - -cc_library { - name: "libadbconnection_client", - srcs: ["adbconnection/adbconnection_client.cpp"], - - export_include_dirs: ["adbconnection/include"], - - stl: "libc++_static", - shared_libs: ["liblog"], - static_libs: ["libbase"], - - defaults: ["adbd_defaults"], - visibility: [ - "//art:__subpackages__", - "//system/core/adb/apex:__subpackages__", - ], - apex_available: [ - "com.android.adbd", - "test_com.android.adbd", - ], - - // libadbconnection_client doesn't need an embedded build number. - use_version_lib: false, - - target: { - linux: { - version_script: "adbconnection/libadbconnection_client.map.txt", - }, - }, - stubs: { - symbol_file: "adbconnection/libadbconnection_client.map.txt", - versions: ["1"], - }, - - host_supported: true, - compile_multilib: "both", -} - // libadb // ========================================================= // These files are compiled for both the host and the device. @@ -459,7 +399,6 @@ cc_library_static { "libbase", "libcrypto", "libcrypto_utils", - "libcutils", "liblog", ], @@ -483,7 +422,7 @@ cc_library_static { }, } -cc_library { +cc_library_static { name: "libadbd_services", defaults: ["adbd_defaults", "host_adbd_supported"], recovery_available: true, @@ -513,11 +452,11 @@ cc_library { "libadb_protos", "libadb_tls_connection", "libadbd_auth", + "libadbd_fs", "libasyncio", "libbase", "libcrypto", "libcrypto_utils", - "libcutils", "liblog", ], @@ -564,13 +503,19 @@ cc_library { "libadb_pairing_connection", "libadb_tls_connection", "libadbd_auth", - "libadbd_services", + "libadbd_fs", "libasyncio", "libbase", "libcrypto", "libcrypto_utils", - "libcutils", "liblog", + "libselinux", + ], + + static_libs: [ + "libadbd_services", + "libcutils_sockets", + "libdiagnose_usb", ], export_include_dirs: [ @@ -605,7 +550,7 @@ cc_binary { "libbase", "libcap", "libcrypto_utils", - "libcutils", + "libcutils_sockets", "libdiagnose_usb", "liblog", "libmdnssd", @@ -620,10 +565,14 @@ cc_binary { "libadb_protos", "libadb_tls_connection", "libadbd_auth", + "libadbd_fs", "libcrypto", ], - required: ["libadbd_auth"], + required: [ + "libadbd_auth", + "libadbd_fs", + ], } phony { @@ -699,9 +648,9 @@ cc_test { "libadb_pairing_connection_static", "libadb_tls_connection_static", "libbase", - "libcutils", "libcrypto_utils", "libcrypto_static", + "libcutils_sockets", "libdiagnose_usb", "liblog", "libusb", diff --git a/adb/adb_trace.h b/adb/adb_trace.h index ed4be88a6..3421a0296 100644 --- a/adb/adb_trace.h +++ b/adb/adb_trace.h @@ -59,11 +59,4 @@ extern int adb_trace_mask; void adb_trace_init(char**); void adb_trace_enable(AdbTrace trace_tag); -// Include before stdatomic.h (introduced in cutils/trace.h) to avoid compile error. -#include - -#define ATRACE_TAG ATRACE_TAG_ADB -#include -#include - #endif /* __ADB_TRACE_H */ diff --git a/adb/client/adb_install.cpp b/adb/client/adb_install.cpp index 982a96b74..21b8f4999 100644 --- a/adb/client/adb_install.cpp +++ b/adb/client/adb_install.cpp @@ -17,6 +17,7 @@ #include "adb_install.h" #include +#include #include #include #include diff --git a/adb/client/incremental_server.cpp b/adb/client/incremental_server.cpp index 585e50c44..2512d0562 100644 --- a/adb/client/incremental_server.cpp +++ b/adb/client/incremental_server.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include #include diff --git a/adb/daemon/file_sync_service.cpp b/adb/daemon/file_sync_service.cpp index d6af7087d..edf5683d3 100644 --- a/adb/daemon/file_sync_service.cpp +++ b/adb/daemon/file_sync_service.cpp @@ -40,10 +40,13 @@ #include #include -#include +#include + +// Needed for __android_log_security_bswrite. #include #if defined(__ANDROID__) +#include #include #include #endif @@ -98,7 +101,7 @@ static bool secure_mkdirs(const std::string& path) { for (const auto& path_component : path_components) { uid_t uid = -1; gid_t gid = -1; - unsigned int mode = 0775; + mode_t mode = 0775; uint64_t capabilities = 0; if (path_component.empty()) { @@ -111,7 +114,7 @@ static bool secure_mkdirs(const std::string& path) { partial_path += path_component; if (should_use_fs_config(partial_path)) { - fs_config(partial_path.c_str(), 1, nullptr, &uid, &gid, &mode, &capabilities); + adbd_fs_config(partial_path.c_str(), 1, nullptr, &uid, &gid, &mode, &capabilities); } if (adb_mkdir(partial_path.c_str(), mode) == -1) { if (errno != EEXIST) { @@ -468,9 +471,7 @@ static bool do_send(int s, const std::string& spec, std::vector& buffer) { gid_t gid = -1; uint64_t capabilities = 0; if (should_use_fs_config(path)) { - unsigned int broken_api_hack = mode; - fs_config(path.c_str(), 0, nullptr, &uid, &gid, &broken_api_hack, &capabilities); - mode = broken_api_hack; + adbd_fs_config(path.c_str(), 0, nullptr, &uid, &gid, &mode, &capabilities); } result = handle_send_file(s, path.c_str(), ×tamp, uid, gid, capabilities, mode, buffer, @@ -550,7 +551,6 @@ static const char* sync_id_to_name(uint32_t id) { static bool handle_sync_command(int fd, std::vector& buffer) { D("sync: waiting for request"); - ATRACE_CALL(); SyncRequest request; if (!ReadFdExactly(fd, &request, sizeof(request))) { SendSyncFail(fd, "command read failure"); @@ -569,8 +569,6 @@ static bool handle_sync_command(int fd, std::vector& buffer) { name[path_length] = 0; std::string id_name = sync_id_to_name(request.id); - std::string trace_name = StringPrintf("%s(%s)", id_name.c_str(), name); - ATRACE_NAME(trace_name.c_str()); D("sync: %s('%s')", id_name.c_str(), name); switch (request.id) { diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp index c7f8895b8..092819807 100644 --- a/adb/daemon/usb.cpp +++ b/adb/daemon/usb.cpp @@ -19,6 +19,7 @@ #include "sysdeps.h" #include +#include #include #include #include diff --git a/adb/fastdeploy/deploypatchgenerator/apk_archive.cpp b/adb/fastdeploy/deploypatchgenerator/apk_archive.cpp index 932d579b5..9da256e24 100644 --- a/adb/fastdeploy/deploypatchgenerator/apk_archive.cpp +++ b/adb/fastdeploy/deploypatchgenerator/apk_archive.cpp @@ -18,6 +18,8 @@ #include "apk_archive.h" +#include + #include "adb_trace.h" #include "sysdeps.h" diff --git a/adb/adbconnection/.clang-format b/adb/libs/.clang-format similarity index 100% rename from adb/adbconnection/.clang-format rename to adb/libs/.clang-format diff --git a/adb/libs/adbconnection/.clang-format b/adb/libs/adbconnection/.clang-format new file mode 120000 index 000000000..e545823f4 --- /dev/null +++ b/adb/libs/adbconnection/.clang-format @@ -0,0 +1 @@ +../../.clang-format-2 \ No newline at end of file diff --git a/adb/libs/adbconnection/Android.bp b/adb/libs/adbconnection/Android.bp new file mode 100644 index 000000000..f6b0a4239 --- /dev/null +++ b/adb/libs/adbconnection/Android.bp @@ -0,0 +1,59 @@ +// libadbconnection +// ========================================================= +// libadbconnection_client/server implement the socket handling for jdwp +// forwarding and the track-jdwp service. +cc_library { + name: "libadbconnection_server", + srcs: ["adbconnection_server.cpp"], + + export_include_dirs: ["include"], + + stl: "libc++_static", + shared_libs: ["liblog"], + static_libs: ["libbase"], + + defaults: ["adbd_defaults", "host_adbd_supported"], + + // Avoid getting duplicate symbol of android::build::GetBuildNumber(). + use_version_lib: false, + + recovery_available: true, + compile_multilib: "both", +} + +cc_library { + name: "libadbconnection_client", + srcs: ["adbconnection_client.cpp"], + + export_include_dirs: ["include"], + + stl: "libc++_static", + shared_libs: ["liblog"], + static_libs: ["libbase"], + + defaults: ["adbd_defaults"], + visibility: [ + "//art:__subpackages__", + "//system/core/adb/apex:__subpackages__", + ], + apex_available: [ + "com.android.adbd", + "test_com.android.adbd", + ], + + // libadbconnection_client doesn't need an embedded build number. + use_version_lib: false, + + target: { + linux: { + version_script: "libadbconnection_client.map.txt", + }, + }, + stubs: { + symbol_file: "libadbconnection_client.map.txt", + versions: ["1"], + }, + + host_supported: true, + compile_multilib: "both", +} diff --git a/adb/adbconnection/adbconnection_client.cpp b/adb/libs/adbconnection/adbconnection_client.cpp similarity index 100% rename from adb/adbconnection/adbconnection_client.cpp rename to adb/libs/adbconnection/adbconnection_client.cpp diff --git a/adb/adbconnection/adbconnection_server.cpp b/adb/libs/adbconnection/adbconnection_server.cpp similarity index 100% rename from adb/adbconnection/adbconnection_server.cpp rename to adb/libs/adbconnection/adbconnection_server.cpp diff --git a/adb/adbconnection/include/adbconnection/client.h b/adb/libs/adbconnection/include/adbconnection/client.h similarity index 100% rename from adb/adbconnection/include/adbconnection/client.h rename to adb/libs/adbconnection/include/adbconnection/client.h diff --git a/adb/adbconnection/include/adbconnection/server.h b/adb/libs/adbconnection/include/adbconnection/server.h similarity index 100% rename from adb/adbconnection/include/adbconnection/server.h rename to adb/libs/adbconnection/include/adbconnection/server.h diff --git a/adb/adbconnection/libadbconnection_client.map.txt b/adb/libs/adbconnection/libadbconnection_client.map.txt similarity index 100% rename from adb/adbconnection/libadbconnection_client.map.txt rename to adb/libs/adbconnection/libadbconnection_client.map.txt diff --git a/adb/libs/libadbd_fs/Android.bp b/adb/libs/libadbd_fs/Android.bp new file mode 100644 index 000000000..d17814825 --- /dev/null +++ b/adb/libs/libadbd_fs/Android.bp @@ -0,0 +1,30 @@ +// libadbd_fs +// ========================================================= +cc_library { + name: "libadbd_fs", + defaults: ["adbd_defaults"], + + srcs: ["adbd_fs.cpp"], + static_libs: [ + "libbase", + "libcutils", + "liblog", + ], + export_include_dirs: ["include"], + + version_script: "libadbd_fs.map.txt", + stubs: { + versions: ["1"], + symbol_file: "libadbd_fs.map.txt", + }, + + host_supported: true, + recovery_available: true, + compile_multilib: "both", + + target: { + darwin: { + enabled: false, + } + }, +} diff --git a/adb/libs/libadbd_fs/adbd_fs.cpp b/adb/libs/libadbd_fs/adbd_fs.cpp new file mode 100644 index 000000000..8e62d40d1 --- /dev/null +++ b/adb/libs/libadbd_fs/adbd_fs.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2020 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 + +void adbd_fs_config(const char* path, int dir, const char* target_out_path, uid_t* uid, gid_t* gid, + mode_t* mode, uint64_t* capabilities) { + unsigned uid_hack; + unsigned gid_hack; + unsigned mode_hack; + fs_config(path, dir, target_out_path, &uid_hack, &gid_hack, &mode_hack, capabilities); + *uid = uid_hack; + *gid = gid_hack; + *mode = mode_hack; +} diff --git a/adb/libs/libadbd_fs/include/adbd_fs.h b/adb/libs/libadbd_fs/include/adbd_fs.h new file mode 100644 index 000000000..6158d7208 --- /dev/null +++ b/adb/libs/libadbd_fs/include/adbd_fs.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2020 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 +#include + +extern "C" { +// Thin wrapper around libcutils fs_config. +void adbd_fs_config(const char* path, int dir, const char* target_out_path, uid_t* uid, gid_t* gid, + mode_t* mode, uint64_t* capabilities); +} diff --git a/adb/libs/libadbd_fs/libadbd_fs.map.txt b/adb/libs/libadbd_fs/libadbd_fs.map.txt new file mode 100644 index 000000000..1454e9639 --- /dev/null +++ b/adb/libs/libadbd_fs/libadbd_fs.map.txt @@ -0,0 +1,6 @@ +LIBADBD_FS { + global: + adbd_fs_config; # apex + local: + *; +}; diff --git a/libcutils/Android.bp b/libcutils/Android.bp index 0379f6e2e..4e93df370 100644 --- a/libcutils/Android.bp +++ b/libcutils/Android.bp @@ -21,11 +21,6 @@ libcutils_nonwindows_sources = [ "fs.cpp", "hashmap.cpp", "multiuser.cpp", - "socket_inaddr_any_server_unix.cpp", - "socket_local_client_unix.cpp", - "socket_local_server_unix.cpp", - "socket_network_client_unix.cpp", - "sockets_unix.cpp", "str_parms.cpp", ] @@ -49,6 +44,90 @@ cc_library_headers { }, } +// Socket specific parts of libcutils that are safe to statically link into an APEX. +cc_library_static { + name: "libcutils_sockets", + vendor_available: true, + vndk: { + enabled: true, + support_system_process: true, + }, + recovery_available: true, + host_supported: true, + native_bridge_supported: true, + apex_available: [ + "//apex_available:platform", + "//apex_available:anyapex", + ], + + export_include_dirs: ["include"], + + srcs: ["sockets.cpp"], + target: { + linux_bionic: { + enabled: true, + }, + + not_windows: { + srcs: [ + "socket_inaddr_any_server_unix.cpp", + "socket_local_client_unix.cpp", + "socket_local_server_unix.cpp", + "socket_network_client_unix.cpp", + "sockets_unix.cpp", + ], + }, + + // "not_windows" means "non-Windows host". + android: { + srcs: [ + "android_get_control_file.cpp", + "socket_inaddr_any_server_unix.cpp", + "socket_local_client_unix.cpp", + "socket_local_server_unix.cpp", + "socket_network_client_unix.cpp", + "sockets_unix.cpp", + ], + static_libs: ["libbase"], + }, + + windows: { + host_ldlibs: ["-lws2_32"], + srcs: [ + "socket_inaddr_any_server_windows.cpp", + "socket_network_client_windows.cpp", + "sockets_windows.cpp", + ], + + enabled: true, + cflags: [ + "-D_GNU_SOURCE", + ], + }, + }, +} + +cc_test { + name: "libcutils_sockets_test", + test_suites: ["device-tests"], + static_libs: ["libbase", "libcutils_sockets"], + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], + + srcs: ["sockets_test.cpp"], + target: { + android: { + srcs: [ + "android_get_control_file_test.cpp", + "android_get_control_socket_test.cpp", + ], + }, + }, +} + cc_library { name: "libcutils", vendor_available: true, @@ -66,7 +145,6 @@ cc_library { "load_file.cpp", "native_handle.cpp", "record_stream.cpp", - "sockets.cpp", "strlcpy.c", "threads.cpp", ], @@ -86,9 +164,6 @@ cc_library { host_ldlibs: ["-lws2_32"], srcs: [ - "socket_inaddr_any_server_windows.cpp", - "socket_network_client_windows.cpp", - "sockets_windows.cpp", "trace-host.cpp", ], @@ -97,10 +172,8 @@ cc_library { "-D_GNU_SOURCE", ], }, - android: { srcs: libcutils_nonwindows_sources + [ - "android_get_control_file.cpp", "android_reboot.cpp", "ashmem-dev.cpp", "fs_config.cpp", @@ -149,6 +222,7 @@ cc_library { } }, + whole_static_libs: ["libcutils_sockets"], shared_libs: [ "liblog", "libbase", From 3467ef46d436985408c7b126a0e746cd5bb8b2be Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 21 Feb 2020 16:38:29 -0800 Subject: [PATCH 080/388] adbd: fix build breakage. This broke because two CLs touching the Android.bp file both independently passed presubmit, but failed when combined. Clean up a misindentation while we're at it. Bug: http://b/150032044 Bug: http://b/150032367 Test: mma in system/core/adb Change-Id: I091ef9dec806c767ffb21a5fd73b2bb37ab29ff9 Merged-In: I091ef9dec806c767ffb21a5fd73b2bb37ab29ff9 (cherry picked from commit 6d949e89a47e4876b835fe95d3299699da0bba92) --- adb/Android.bp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/adb/Android.bp b/adb/Android.bp index 2f1fe3ca0..fea8c7807 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -375,7 +375,7 @@ cc_library_static { srcs: libadb_srcs + libadb_linux_srcs + libadb_posix_srcs + [ "daemon/auth.cpp", "daemon/jdwp_service.cpp", - "daemon/adb_wifi.cpp", + "daemon/adb_wifi.cpp", ], local_include_dirs: [ @@ -516,6 +516,7 @@ cc_library { "libadbd_services", "libcutils_sockets", "libdiagnose_usb", + "libmdnssd", ], export_include_dirs: [ From e36a53e3076d38674fc4ddb200c19f1c5de6bcdd Mon Sep 17 00:00:00 2001 From: Joshua Duong Date: Mon, 24 Feb 2020 10:03:54 -0800 Subject: [PATCH 081/388] Properly remove adb DNS services. Bug: b/150136878 Bug: b/111434128 Bug: http://b/150032044 Test: make Change-Id: Ibfb92a7c197a25fd1913107d277fbc5f78108c05 Merged-In: Ibfb92a7c197a25fd1913107d277fbc5f78108c05 (cherry picked from commit 79a452a923057a8f8fb6fa4bf9075e71c7a737e4) --- adb/client/transport_mdns.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/adb/client/transport_mdns.cpp b/adb/client/transport_mdns.cpp index ff1f7b4c6..22b9b1808 100644 --- a/adb/client/transport_mdns.cpp +++ b/adb/client/transport_mdns.cpp @@ -409,9 +409,9 @@ static void adb_RemoveDNSService(const char* regType, const char* serviceName) { } std::string sName(serviceName); - std::remove_if(services->begin(), services->end(), [&sName](ResolvedService* service) { - return (sName == service->serviceName()); - }); + services->erase(std::remove_if( + services->begin(), services->end(), + [&sName](ResolvedService* service) { return (sName == service->serviceName()); })); } // Returns the version the device wanted to advertise, From dbae5190e76d4d4bee2aa43950933f94255b97bd Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Thu, 23 Jan 2020 13:28:36 +0900 Subject: [PATCH 082/388] Use optional for nullable types AIDL generates optional for nullable T types for C++, which is more efficient and idomatic and easy to use. Bug: 144773267 Test: build/flash/boot Merged-In: I6bf4c2017f113f4d326fddb1d76163c2fed34d50 Change-Id: I6bf4c2017f113f4d326fddb1d76163c2fed34d50 (cherry picked from commit 0e88d61de00152c16586b7cca8765c7ac3bc34d5) Exempt-From-Owner-Approval: CP from master --- gatekeeperd/gatekeeperd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gatekeeperd/gatekeeperd.cpp b/gatekeeperd/gatekeeperd.cpp index 1d65b1ced..c81a80ef3 100644 --- a/gatekeeperd/gatekeeperd.cpp +++ b/gatekeeperd/gatekeeperd.cpp @@ -159,8 +159,8 @@ public: #define GK_ERROR *gkResponse = GKResponse::error(), Status::ok() - Status enroll(int32_t uid, const std::unique_ptr>& currentPasswordHandle, - const std::unique_ptr>& currentPassword, + Status enroll(int32_t uid, const std::optional>& currentPasswordHandle, + const std::optional>& currentPassword, const std::vector& desiredPassword, GKResponse* gkResponse) override { IPCThreadState* ipc = IPCThreadState::self(); const int calling_pid = ipc->getCallingPid(); From 446c4fbed09ceffbd6682849512f2ccf017e4ea3 Mon Sep 17 00:00:00 2001 From: Howard Yen Date: Wed, 26 Feb 2020 21:36:59 +0800 Subject: [PATCH 083/388] init: prevent persist.sys.usb.config initalized as none,adb Prevent appending ",adb" to persist.sys.usb.config if "none" is explicitly defined in default prop. Bug: 150130503 Test: persist.sys.usb.config initalized correctly Change-Id: I3b5de6fd102e252019e843f39f0875f5aaea7486 --- init/property_service.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/init/property_service.cpp b/init/property_service.cpp index 84644e818..730bf6de4 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -745,7 +745,9 @@ static bool load_properties_from_file(const char* filename, const char* filter, static void update_sys_usb_config() { bool is_debuggable = android::base::GetBoolProperty("ro.debuggable", false); std::string config = android::base::GetProperty("persist.sys.usb.config", ""); - if (config.empty()) { + // b/150130503, add (config == "none") condition here to prevent appending + // ",adb" if "none" is explicitly defined in default prop. + if (config.empty() || config == "none") { InitPropertySet("persist.sys.usb.config", is_debuggable ? "adb" : "none"); } else if (is_debuggable && config.find("adb") == std::string::npos && config.length() + 4 < PROP_VALUE_MAX) { From 923880e1760361c289d41bc131f121bbc912204d Mon Sep 17 00:00:00 2001 From: Florian Mayer Date: Wed, 26 Feb 2020 11:44:04 +0000 Subject: [PATCH 084/388] Always use shared memory for atrace. Remove ATRACE_SHMEM macro. Test: atrace ss atrace wm sanity check output Bug: 137366208 Change-Id: I1b42243678b9b9a41db18e2ff8cb3cf7bde874de Merged-In: I1b42243678b9b9a41db18e2ff8cb3cf7bde874de --- libcutils/include/cutils/trace.h | 38 ++++---------------------------- libcutils/trace-dev.cpp | 7 ------ libcutils/trace-dev.inc | 27 +++++++++-------------- libcutils/trace-host.cpp | 2 -- 4 files changed, 15 insertions(+), 59 deletions(-) diff --git a/libcutils/include/cutils/trace.h b/libcutils/include/cutils/trace.h index e12c32cff..c74ee3e9d 100644 --- a/libcutils/include/cutils/trace.h +++ b/libcutils/include/cutils/trace.h @@ -88,12 +88,6 @@ __BEGIN_DECLS #error ATRACE_TAG must be defined to be one of the tags defined in cutils/trace.h #endif -// Set this to 0 to revert to the old Binder-based atrace implementation. -// This is only here in case rollbacks do not apply cleanly. -// TODO(fmayer): Remove this once we are confident this won't need to be -// rolled back, no later than 2020-03-01. -#define ATRACE_SHMEM 1 - /** * Opens the trace file for writing and reads the property for initial tags. * The atrace.tags.enableflags property sets the tags to trace. @@ -121,15 +115,11 @@ void atrace_set_debuggable(bool debuggable); * prevent tracing within the Zygote process. */ void atrace_set_tracing_enabled(bool enabled); + /** - * If !ATRACE_SHMEM: - * Flag indicating whether setup has been completed, initialized to 0. - * Nonzero indicates setup has completed. - * Note: This does NOT indicate whether or not setup was successful. - * If ATRACE_SHMEM: - * This is always set to false. This forces code that uses an old version - * of this header to always call into atrace_setup, in which we call - * atrace_init unconditionally. + * This is always set to false. This forces code that uses an old version + * of this header to always call into atrace_setup, in which we call + * atrace_init unconditionally. */ extern atomic_bool atrace_is_ready; @@ -154,28 +144,8 @@ extern int atrace_marker_fd; #define ATRACE_INIT() atrace_init() #define ATRACE_GET_ENABLED_TAGS() atrace_get_enabled_tags() -#if ATRACE_SHMEM void atrace_init(); uint64_t atrace_get_enabled_tags(); -#else -static inline void atrace_init() -{ - if (CC_UNLIKELY(!atomic_load_explicit(&atrace_is_ready, memory_order_acquire))) { - atrace_setup(); - } -} - -/** - * Get the mask of all tags currently enabled. - * It can be used as a guard condition around more expensive trace calculations. - * Every trace function calls this, which ensures atrace_init is run. - */ -static inline uint64_t atrace_get_enabled_tags() -{ - atrace_init(); - return atrace_enabled_tags; -} -#endif /** * Test if a given tag is currently enabled. diff --git a/libcutils/trace-dev.cpp b/libcutils/trace-dev.cpp index 9ca172973..5a09a2d39 100644 --- a/libcutils/trace-dev.cpp +++ b/libcutils/trace-dev.cpp @@ -41,9 +41,6 @@ static void atrace_init_once() } else { atrace_enabled_tags = atrace_get_property(); } -#if !ATRACE_SHMEM - atomic_store_explicit(&atrace_is_ready, true, memory_order_release); -#endif } static void atrace_seq_number_changed(uint32_t prev_seq_no, uint32_t seq_no) { @@ -69,11 +66,7 @@ static void atrace_seq_number_changed(uint32_t prev_seq_no, uint32_t seq_no) { void atrace_setup() { -#if ATRACE_SHMEM atrace_init(); -#else - pthread_once(&atrace_once_control, atrace_init_once); -#endif } void atrace_begin_body(const char* name) diff --git a/libcutils/trace-dev.inc b/libcutils/trace-dev.inc index a57a4c59e..3ec98b3a6 100644 --- a/libcutils/trace-dev.inc +++ b/libcutils/trace-dev.inc @@ -71,8 +71,6 @@ alignas(uint64_t) static char empty_pi[96]; static const prop_info* atrace_property_info = reinterpret_cast(empty_pi); #endif -#if ATRACE_SHMEM - /** * This is called when the sequence number of debug.atrace.tags.enableflags * changes and we need to reload the enabled tags. @@ -96,7 +94,6 @@ uint64_t atrace_get_enabled_tags() atrace_init(); return atrace_enabled_tags; } -#endif // Set whether this process is debuggable, which determines whether // application-level tracing is allowed when the ro.debuggable system property @@ -186,19 +183,17 @@ static uint64_t atrace_get_property() void atrace_update_tags() { uint64_t tags; - if (ATRACE_SHMEM || CC_UNLIKELY(atomic_load_explicit(&atrace_is_ready, memory_order_acquire))) { - if (atomic_load_explicit(&atrace_is_enabled, memory_order_acquire)) { - tags = atrace_get_property(); - pthread_mutex_lock(&atrace_tags_mutex); - atrace_enabled_tags = tags; - pthread_mutex_unlock(&atrace_tags_mutex); - } else { - // Tracing is disabled for this process, so we simply don't - // initialize the tags. - pthread_mutex_lock(&atrace_tags_mutex); - atrace_enabled_tags = ATRACE_TAG_NOT_READY; - pthread_mutex_unlock(&atrace_tags_mutex); - } + if (atomic_load_explicit(&atrace_is_enabled, memory_order_acquire)) { + tags = atrace_get_property(); + pthread_mutex_lock(&atrace_tags_mutex); + atrace_enabled_tags = tags; + pthread_mutex_unlock(&atrace_tags_mutex); + } else { + // Tracing is disabled for this process, so we simply don't + // initialize the tags. + pthread_mutex_lock(&atrace_tags_mutex); + atrace_enabled_tags = ATRACE_TAG_NOT_READY; + pthread_mutex_unlock(&atrace_tags_mutex); } } diff --git a/libcutils/trace-host.cpp b/libcutils/trace-host.cpp index c21d0ee5e..9781ad3e4 100644 --- a/libcutils/trace-host.cpp +++ b/libcutils/trace-host.cpp @@ -30,10 +30,8 @@ void atrace_async_begin_body(const char* /*name*/, int32_t /*cookie*/) {} void atrace_async_end_body(const char* /*name*/, int32_t /*cookie*/) {} void atrace_int_body(const char* /*name*/, int32_t /*value*/) {} void atrace_int64_body(const char* /*name*/, int64_t /*value*/) {} -#if ATRACE_SHMEM void atrace_init() {} uint64_t atrace_get_enabled_tags() { return ATRACE_TAG_NOT_READY; } -#endif From b2bac7f0515cb8336124a267c9378690a840003f Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Tue, 25 Feb 2020 11:11:35 -0800 Subject: [PATCH 085/388] fs_mgr: fix checking for casefold feature already enabled EXT4_FEATURE_INCOMPAT_CASEFOLD is a flag in s_feature_incompat, not in s_feature_ro_compat. Bug: 138322712 Test: Treehugger Change-Id: I07bb1d2b818d423196d8ceebda8900a8adbb19e9 Merged-In: I07bb1d2b818d423196d8ceebda8900a8adbb19e9 --- fs_mgr/fs_mgr.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 8840e7d18..7bc455962 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -512,8 +512,7 @@ static void tune_verity(const std::string& blk_device, const FstabEntry& entry, // Enable casefold if needed. static void tune_casefold(const std::string& blk_device, const struct ext4_super_block* sb, int* fs_stat) { - bool has_casefold = - (sb->s_feature_ro_compat & cpu_to_le32(EXT4_FEATURE_INCOMPAT_CASEFOLD)) != 0; + bool has_casefold = (sb->s_feature_incompat & cpu_to_le32(EXT4_FEATURE_INCOMPAT_CASEFOLD)) != 0; bool wants_casefold = android::base::GetBoolProperty("ro.emulated_storage.casefold", false); if (!wants_casefold || has_casefold) return; From 9f0c0c79238cd6694d679a9518b8384c47c4185f Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Wed, 26 Feb 2020 10:29:04 -0800 Subject: [PATCH 086/388] logwrap: add missing O_CLOEXEC Bug: 148236233 Bug: 150260863 Test: build Merged-In: Ibe070d5d4f3a7ada0718f74c7cee12db7b9f920e Change-Id: Ibe070d5d4f3a7ada0718f74c7cee12db7b9f920e (cherry picked from commit b5b162e2048ac3294713bed975250ecae7bf2389) --- logwrapper/logwrap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logwrapper/logwrap.cpp b/logwrapper/logwrap.cpp index 5337801e3..5a518bc56 100644 --- a/logwrapper/logwrap.cpp +++ b/logwrapper/logwrap.cpp @@ -374,7 +374,7 @@ static int parent(const char* tag, int parent_read, pid_t pid, int* chld_sts, in } if (log_target & LOG_FILE) { - fd = open(file_path, O_WRONLY | O_CREAT, 0664); + fd = open(file_path, O_WRONLY | O_CREAT | O_CLOEXEC, 0664); if (fd < 0) { ERROR("Cannot log to file %s\n", file_path); log_target &= ~LOG_FILE; From 4674b5593aea991c939af0d38b3490fb1b4c953c Mon Sep 17 00:00:00 2001 From: Victor Hsieh Date: Mon, 24 Feb 2020 16:02:32 -0800 Subject: [PATCH 087/388] Mark fs-verity support for ext4 userdata if first_api_level >= R fs-verity is required for new devices launched with R. This change remove a manual setup for vendors going forward. The original fs mgr flag still allows old devices to opt in, which can only to be done manually because of kernel dependency. Test: build Bug: 150034150 Change-Id: I152b63d7889153d41f29677f72074afb1881b65d Merged-In: I152b63d7889153d41f29677f72074afb1881b65d --- fs_mgr/fs_mgr_fstab.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/fs_mgr/fs_mgr_fstab.cpp b/fs_mgr/fs_mgr_fstab.cpp index e4bb09241..a36934a3a 100644 --- a/fs_mgr/fs_mgr_fstab.cpp +++ b/fs_mgr/fs_mgr_fstab.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -654,6 +655,21 @@ void TransformFstabForDsu(Fstab* fstab, const std::vector& dsu_part } } +void EnableMandatoryFlags(Fstab* fstab) { + // Devices launched in R and after should enable fs_verity on userdata. The flag causes tune2fs + // to enable the feature. A better alternative would be to enable on mkfs at the beginning. + if (android::base::GetIntProperty("ro.product.first_api_level", 0) >= 30) { + std::vector data_entries = GetEntriesForMountPoint(fstab, "/data"); + for (auto&& entry : data_entries) { + // Besides ext4, f2fs is also supported. But the image is already created with verity + // turned on when it was first introduced. + if (entry->fs_type == "ext4") { + entry->fs_mgr_flags.fs_verity = true; + } + } + } +} + bool ReadFstabFromFile(const std::string& path, Fstab* fstab) { auto fstab_file = std::unique_ptr{fopen(path.c_str(), "re"), fclose}; if (!fstab_file) { @@ -674,6 +690,7 @@ bool ReadFstabFromFile(const std::string& path, Fstab* fstab) { } SkipMountingPartitions(fstab); + EnableMandatoryFlags(fstab); return true; } From d78f4dab02b664fb7164763cdbdd52f3fbc226a5 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Wed, 29 Jan 2020 15:56:52 -0800 Subject: [PATCH 088/388] Make libstatssocket a shared_lib Make libstatssocket unable to be linked as a static lib on the platform. Test: bit libstatssocket_test:* Test: bit statsd_test:* Test: atest LibStatsPullTests Bug: 149340100 Change-Id: I5889dd718536f5f2c693b4c2e7331c9cc2eb2ac9 --- libstats/pull/Android.bp | 25 ++++++++++++++---- libstats/socket/Android.bp | 52 ++++++++++++++++++++++++++++++-------- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/libstats/pull/Android.bp b/libstats/pull/Android.bp index d74a36b84..1a9cb92ca 100644 --- a/libstats/pull/Android.bp +++ b/libstats/pull/Android.bp @@ -17,8 +17,8 @@ // ========================================================== // Native library to register a pull atom callback with statsd // ========================================================== -cc_library_shared { - name: "libstatspull", +cc_defaults { + name: "libstatspull_defaults", srcs: [ "stats_pull_atom_callback.cpp", ], @@ -31,12 +31,16 @@ cc_library_shared { "libbinder_ndk", "liblog", "statsd-aidl-ndk_platform", + "libstatssocket", ], static_libs: [ "libutils", - // TODO(b/149340100): Clean this up when libstatssocket is moved to the apex. - "libstatssocket", - "libcutils", + ], +} +cc_library_shared { + name: "libstatspull", + defaults: [ + "libstatspull_defaults" ], // enumerate stable entry points for APEX use stubs: { @@ -50,3 +54,14 @@ cc_library_shared { "test_com.android.os.statsd", ], } + +// ONLY USE IN TESTS. +cc_library_static { + name: "libstatspull_private", + defaults: [ + "libstatspull_defaults", + ], + visibility: [ + "//frameworks/base/apex/statsd/tests/libstatspull", + ], +} diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp index 437879b6c..b02ab42b2 100644 --- a/libstats/socket/Android.bp +++ b/libstats/socket/Android.bp @@ -17,23 +17,43 @@ // ========================================================================= // Native library to write stats log to statsd socket on Android R and later // ========================================================================= -cc_library { - name: "libstatssocket", +cc_defaults { + name: "libstatssocket_defaults", srcs: [ "stats_buffer_writer.c", "stats_event.c", "stats_socket.c", "statsd_writer.c", ], - host_supported: true, - cflags: [ - "-Wall", - "-Werror", - ], export_include_dirs: ["include"], static_libs: [ "libcutils", // does not expose a stable C API ], + cflags: [ + "-Wall", + "-Werror", + ], +} + +cc_library { + name: "libstatssocket", + defaults: [ + "libstatssocket_defaults", + ], + host_supported: true, + target: { + // On android, libstatssocket should only be linked as a shared lib + android: { + static: { + enabled: false, + }, + }, + host: { + shared: { + enabled: false, + }, + }, + }, // enumerate stable entry points for APEX use stubs: { @@ -43,13 +63,23 @@ cc_library { ], }, apex_available: [ - //TODO(b/149340100): Remove this once libstatssocket is only linked as shared. - "//apex_available:platform", "com.android.os.statsd", "test_com.android.os.statsd", ], } +//TODO (b/149842105): Figure out if there is a better solution for this. +cc_test_library { + name: "libstatssocket_private", + defaults: [ + "libstatssocket_defaults", + ], + visibility: [ + "//frameworks/base/apex/statsd/tests/libstatspull", + "//frameworks/base/cmds/statsd", + ], +} + cc_library_headers { name: "libstatssocket_headers", export_include_dirs: ["include"], @@ -67,7 +97,7 @@ cc_benchmark { "-Werror", ], static_libs: [ - "libstatssocket", + "libstatssocket_private", ], shared_libs: [ "libcutils", @@ -84,7 +114,7 @@ cc_test { ], static_libs: [ "libgmock", - "libstatssocket", + "libstatssocket_private", ], shared_libs: [ "libcutils", From dffbb4f14839a4ee6b7f570249f05b8d72fb7319 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Wed, 26 Feb 2020 15:18:56 +0000 Subject: [PATCH 089/388] If userspace reboot watchdog triggers, don't store reason in persistent property If init is wedged, then the write will never succeed and reboot won't happen. Also, in case of normal reboot, move call to PersistRebootReason to the top of DoReboot() function, to make sure we persist it even if /data is not mounted. Test: builds Test: adb shell svc power reboot userspace Test: atest CtsUserspaceRebootHostSideTestCases Bug: 148767783 Change-Id: I4ae40e1f6fdc41cc0bcae57020fa3d3385dda1b4 Merged-In: I4ae40e1f6fdc41cc0bcae57020fa3d3385dda1b4 --- init/reboot.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/init/reboot.cpp b/init/reboot.cpp index 048c1e7a7..08b99abbd 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -96,8 +96,10 @@ static std::vector GetDebuggingServices(bool only_post_data) { return ret; } -static void PersistRebootReason(const char* reason) { - SetProperty(LAST_REBOOT_REASON_PROPERTY, reason); +static void PersistRebootReason(const char* reason, bool write_to_property) { + if (write_to_property) { + SetProperty(LAST_REBOOT_REASON_PROPERTY, reason); + } WriteStringToFile(reason, LAST_REBOOT_REASON_FILE); } @@ -535,14 +537,6 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str Timer t; LOG(INFO) << "Reboot start, reason: " << reason << ", reboot_target: " << reboot_target; - // If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to - // worry about unmounting it. - if (!IsDataMounted()) { - sync(); - RebootSystem(cmd, reboot_target); - abort(); - } - // Ensure last reboot reason is reduced to canonical // alias reported in bootloader or system boot reason. size_t skip = 0; @@ -552,9 +546,17 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str reasons[1] == "hard" || reasons[1] == "warm")) { skip = strlen("reboot,"); } - PersistRebootReason(reason.c_str() + skip); + PersistRebootReason(reason.c_str() + skip, true); sync(); + // If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to + // worry about unmounting it. + if (!IsDataMounted()) { + sync(); + RebootSystem(cmd, reboot_target); + abort(); + } + bool is_thermal_shutdown = cmd == ANDROID_RB_THERMOFF; auto shutdown_timeout = 0ms; @@ -833,7 +835,8 @@ static void UserspaceRebootWatchdogThread() { if (!WaitForProperty("sys.boot_completed", "1", timeout)) { LOG(ERROR) << "Failed to boot in " << timeout.count() << "ms. Switching to full reboot"; // In this case device is in a boot loop. Only way to recover is to do dirty reboot. - PersistRebootReason("userspace_failed,watchdog_triggered"); + // Since init might be wedged, don't try to write reboot reason into a persistent property. + PersistRebootReason("userspace_failed,watchdog_triggered", false); RebootSystem(ANDROID_RB_RESTART2, "userspace_failed,watchdog_triggered"); } LOG(INFO) << "Device booted, stopping userspace reboot watchdog"; From 784a099d629bf05274df20c401caeb93732e9ca9 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 20 Feb 2020 13:21:51 -0800 Subject: [PATCH 090/388] logd: don't coalesce identical log messages in the security buffer This buffer isn't human readable and the parsers aren't set up to handle the 'chatty' message for identical log messages. Further, it is a low volume buffer so there's not much in terms of memory saving if this were enabled. Bug: 137093665 Test: security unit tests Change-Id: I03fce518d3308a6d9240bd29e83ff3237203fe3b Merged-In: I03fce518d3308a6d9240bd29e83ff3237203fe3b (cherry picked from commit 2ac86de15a33877b301500c211b49990ec76e8e8) --- logd/LogBuffer.cpp | 54 +++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/logd/LogBuffer.cpp b/logd/LogBuffer.cpp index 834b20b6b..1cf20617f 100644 --- a/logd/LogBuffer.cpp +++ b/logd/LogBuffer.cpp @@ -207,31 +207,37 @@ int LogBuffer::log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, // exact entry with time specified in ms or us precision. if ((realtime.tv_nsec % 1000) == 0) ++realtime.tv_nsec; - LogBufferElement* elem = - new LogBufferElement(log_id, realtime, uid, pid, tid, msg, len); - if (log_id != LOG_ID_SECURITY) { - int prio = ANDROID_LOG_INFO; - const char* tag = nullptr; - size_t tag_len = 0; - if (log_id == LOG_ID_EVENTS || log_id == LOG_ID_STATS) { - tag = tagToName(elem->getTag()); - if (tag) { - tag_len = strlen(tag); - } - } else { - prio = *msg; - tag = msg + 1; - tag_len = strnlen(tag, len - 1); - } - if (!__android_log_is_loggable_len(prio, tag, tag_len, - ANDROID_LOG_VERBOSE)) { - // Log traffic received to total - wrlock(); - stats.addTotal(elem); - unlock(); - delete elem; - return -EACCES; + LogBufferElement* elem = new LogBufferElement(log_id, realtime, uid, pid, tid, msg, len); + + // b/137093665: don't coalesce security messages. + if (log_id == LOG_ID_SECURITY) { + wrlock(); + log(elem); + unlock(); + + return len; + } + + int prio = ANDROID_LOG_INFO; + const char* tag = nullptr; + size_t tag_len = 0; + if (log_id == LOG_ID_EVENTS || log_id == LOG_ID_STATS) { + tag = tagToName(elem->getTag()); + if (tag) { + tag_len = strlen(tag); } + } else { + prio = *msg; + tag = msg + 1; + tag_len = strnlen(tag, len - 1); + } + if (!__android_log_is_loggable_len(prio, tag, tag_len, ANDROID_LOG_VERBOSE)) { + // Log traffic received to total + wrlock(); + stats.addTotal(elem); + unlock(); + delete elem; + return -EACCES; } wrlock(); From caca3a9f5ad15c9a04408e69f611d45ebf42079b Mon Sep 17 00:00:00 2001 From: Joshua Duong Date: Wed, 26 Feb 2020 15:43:44 -0800 Subject: [PATCH 091/388] Remove pairing_auth, pairing_connection from recovery. Also remove statically linking libc++, because these libraries are not exported native shared libraries. We are slightly over the 12MB limit for ramdisk recovery size, so let's remove the adb pairing libraries, since they won't be used in recovery mode. These are only used in normal boot mode, and currently, only by adb client. The pairing server is used by system server. Bug: 150317254 Test: Check size of ramdisk-recovery.img in walleye, walleye-hwasam build to be under 12MB. Also verify installed-files-recovery.txt no longer contains libadb_pairing*. Also put phone into recovery mode, check system/lib64 for no libadb_pairing*. Change-Id: Ida7c4fdc9dda2b09091b853feac8df8f125e4274 (cherry picked from commit afc2cf0dec44fb7a65f418d0928b5c2c63bbc6cd) Exempt-From-Owner-Approval: cherry-pick --- adb/Android.bp | 32 +++++++++++++++++++++++++++++-- adb/crypto/Android.bp | 2 -- adb/pairing_auth/Android.bp | 2 +- adb/pairing_connection/Android.bp | 4 ++-- adb/tls/Android.bp | 6 +----- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/adb/Android.bp b/adb/Android.bp index fea8c7807..af118f47d 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -418,6 +418,12 @@ cc_library_static { srcs: [ "daemon/usb_dummy.cpp", ] + }, + recovery: { + exclude_shared_libs: [ + "libadb_pairing_auth", + "libadb_pairing_connection", + ], } }, } @@ -477,6 +483,10 @@ cc_library_static { exclude_srcs: [ "daemon/abb_service.cpp", ], + exclude_shared_libs: [ + "libadb_pairing_auth", + "libadb_pairing_connection", + ], }, }, } @@ -512,6 +522,15 @@ cc_library { "libselinux", ], + target: { + recovery: { + exclude_shared_libs: [ + "libadb_pairing_auth", + "libadb_pairing_connection", + ], + } + }, + static_libs: [ "libadbd_services", "libcutils_sockets", @@ -544,6 +563,8 @@ cc_binary { }, static_libs: [ + "libadb_crypto", + "libadb_tls_connection", "libadbconnection_server", "libadbd", "libadbd_services", @@ -561,15 +582,22 @@ cc_binary { ], shared_libs: [ - "libadb_crypto", "libadb_pairing_connection", "libadb_protos", - "libadb_tls_connection", "libadbd_auth", "libadbd_fs", "libcrypto", ], + target: { + recovery: { + exclude_shared_libs: [ + "libadb_pairing_auth", + "libadb_pairing_connection", + ], + } + }, + required: [ "libadbd_auth", "libadbd_fs", diff --git a/adb/crypto/Android.bp b/adb/crypto/Android.bp index b7f75edd2..ce1de4a52 100644 --- a/adb/crypto/Android.bp +++ b/adb/crypto/Android.bp @@ -45,8 +45,6 @@ cc_defaults { host_supported: true, recovery_available: true, - stl: "libc++_static", - shared_libs: [ "libadb_protos", "libbase", diff --git a/adb/pairing_auth/Android.bp b/adb/pairing_auth/Android.bp index 0850047f7..a43f4d034 100644 --- a/adb/pairing_auth/Android.bp +++ b/adb/pairing_auth/Android.bp @@ -47,7 +47,7 @@ cc_defaults { use_version_lib: false, host_supported: true, - recovery_available: true, + recovery_available: false, stl: "libc++_static", diff --git a/adb/pairing_connection/Android.bp b/adb/pairing_connection/Android.bp index c05385475..bcde7b1f2 100644 --- a/adb/pairing_connection/Android.bp +++ b/adb/pairing_connection/Android.bp @@ -52,7 +52,7 @@ cc_defaults { stl: "libc++_static", host_supported: true, - recovery_available: true, + recovery_available: false, static_libs: [ "libbase", @@ -131,7 +131,7 @@ cc_defaults { ], host_supported: true, - recovery_available: true, + recovery_available: false, stl: "libc++_static", diff --git a/adb/tls/Android.bp b/adb/tls/Android.bp index 49833ff4a..f2837e11d 100644 --- a/adb/tls/Android.bp +++ b/adb/tls/Android.bp @@ -42,12 +42,8 @@ cc_defaults { "//system/core/adb:__subpackages__", ], - stl: "libc++_static", - - static_libs: [ - "libbase", - ], shared_libs: [ + "libbase", "libcrypto", "liblog", "libssl", From b7814e8c32595655ab0b80e051d41d343830a2bc Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 26 Feb 2020 14:57:20 -0800 Subject: [PATCH 092/388] base: add CachedProperty. Copy bionic's CachedProperty with some minor API tweaks, to allow for efficient querying of properties that rarely change. Bug: http://b/141959374 Test: treehugger Change-Id: I4dfc3f527d30262b35e871d256cec69e69f2e1d7 (cherry picked from commit 891e6dad73699d7b67861705843f95ba19ca5c4d) --- base/include/android-base/properties.h | 30 ++++++++++++++ base/properties.cpp | 57 ++++++++++++++++++++++++++ base/properties_test.cpp | 25 +++++++++++ 3 files changed, 112 insertions(+) diff --git a/base/include/android-base/properties.h b/base/include/android-base/properties.h index 31823df0a..49f1f3184 100644 --- a/base/include/android-base/properties.h +++ b/base/include/android-base/properties.h @@ -20,8 +20,11 @@ #include #include +#include #include +struct prop_info; + namespace android { namespace base { @@ -67,5 +70,32 @@ bool WaitForPropertyCreation(const std::string& key, std::chrono::milliseconds r std::chrono::milliseconds::max()); #endif +#if defined(__BIONIC__) && __cplusplus >= 201703L +// Cached system property lookup. For code that needs to read the same property multiple times, +// this class helps optimize those lookups. +class CachedProperty { + public: + explicit CachedProperty(const char* property_name); + + // Returns the current value of the underlying system property as cheaply as possible. + // The returned pointer is valid until the next call to Get. Because most callers are going + // to want to parse the string returned here and cached that as well, this function performs + // no locking, and is completely thread unsafe. It is the caller's responsibility to provide a + // lock for thread-safety. + // + // Note: *changed can be set to true even if the contents of the property remain the same. + const char* Get(bool* changed = nullptr); + + private: + std::string property_name_; + const prop_info* prop_info_; + std::optional cached_area_serial_; + std::optional cached_property_serial_; + char cached_value_[92]; + bool is_read_only_; + const char* read_only_property_; +}; +#endif + } // namespace base } // namespace android diff --git a/base/properties.cpp b/base/properties.cpp index 4731bf249..35e41a86e 100644 --- a/base/properties.cpp +++ b/base/properties.cpp @@ -30,6 +30,7 @@ #include #include +#include namespace android { namespace base { @@ -195,6 +196,62 @@ bool WaitForPropertyCreation(const std::string& key, return (WaitForPropertyCreation(key, relative_timeout, start_time) != nullptr); } +CachedProperty::CachedProperty(const char* property_name) + : property_name_(property_name), + prop_info_(nullptr), + cached_area_serial_(0), + cached_property_serial_(0), + is_read_only_(android::base::StartsWith(property_name, "ro.")), + read_only_property_(nullptr) { + static_assert(sizeof(cached_value_) == PROP_VALUE_MAX); +} + +const char* CachedProperty::Get(bool* changed) { + std::optional initial_property_serial_ = cached_property_serial_; + + // Do we have a `struct prop_info` yet? + if (prop_info_ == nullptr) { + // `__system_property_find` is expensive, so only retry if a property + // has been created since last time we checked. + uint32_t property_area_serial = __system_property_area_serial(); + if (property_area_serial != cached_area_serial_) { + prop_info_ = __system_property_find(property_name_.c_str()); + cached_area_serial_ = property_area_serial; + } + } + + if (prop_info_ != nullptr) { + // Only bother re-reading the property if it's actually changed since last time. + uint32_t property_serial = __system_property_serial(prop_info_); + if (property_serial != cached_property_serial_) { + __system_property_read_callback( + prop_info_, + [](void* data, const char*, const char* value, uint32_t serial) { + CachedProperty* instance = reinterpret_cast(data); + instance->cached_property_serial_ = serial; + // Read only properties can be larger than PROP_VALUE_MAX, but also never change value + // or location, thus we return the pointer from the shared memory directly. + if (instance->is_read_only_) { + instance->read_only_property_ = value; + } else { + strlcpy(instance->cached_value_, value, PROP_VALUE_MAX); + } + }, + this); + } + } + + if (changed) { + *changed = cached_property_serial_ != initial_property_serial_; + } + + if (is_read_only_) { + return read_only_property_; + } else { + return cached_value_; + } +} + #endif } // namespace base diff --git a/base/properties_test.cpp b/base/properties_test.cpp index e7d4880c2..c30c41e8a 100644 --- a/base/properties_test.cpp +++ b/base/properties_test.cpp @@ -230,3 +230,28 @@ TEST(properties, WaitForPropertyCreation_timeout) { GTEST_LOG_(INFO) << "This test does nothing on the host.\n"; #endif } + +TEST(properties, CachedProperty) { +#if defined(__BIONIC__) + android::base::CachedProperty cached_property("debug.libbase.CachedProperty_test"); + bool changed; + cached_property.Get(&changed); + + android::base::SetProperty("debug.libbase.CachedProperty_test", "foo"); + ASSERT_STREQ("foo", cached_property.Get(&changed)); + ASSERT_TRUE(changed); + + ASSERT_STREQ("foo", cached_property.Get(&changed)); + ASSERT_FALSE(changed); + + android::base::SetProperty("debug.libbase.CachedProperty_test", "bar"); + ASSERT_STREQ("bar", cached_property.Get(&changed)); + ASSERT_TRUE(changed); + + ASSERT_STREQ("bar", cached_property.Get(&changed)); + ASSERT_FALSE(changed); + +#else + GTEST_LOG_(INFO) << "This test does nothing on the host.\n"; +#endif +} From f6b7731868d9414a504483196fc770aec19d77fe Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 26 Feb 2020 15:44:30 -0800 Subject: [PATCH 093/388] adbd: add usb thread spawn logging. Bug: http://b/141959374 Test: adbd shell killall adbd; adb wait-for-device logcat | grep UsbFfs Change-Id: Id5bbfd6d2198005bf10b94c691499059e130afe7 (cherry picked from commit e3d34e1f8bd6c7df8a252f5ce734acf872383f56) --- adb/daemon/usb.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp index 092819807..ff97a6f05 100644 --- a/adb/daemon/usb.cpp +++ b/adb/daemon/usb.cpp @@ -282,6 +282,7 @@ struct UsbFfsConnection : public Connection { monitor_thread_ = std::thread([this]() { adb_thread_setname("UsbFfs-monitor"); + LOG(INFO) << "UsbFfs-monitor thread spawned"; bool bound = false; bool enabled = false; @@ -427,6 +428,8 @@ struct UsbFfsConnection : public Connection { worker_started_ = true; worker_thread_ = std::thread([this]() { adb_thread_setname("UsbFfs-worker"); + LOG(INFO) << "UsbFfs-worker thread spawned"; + for (size_t i = 0; i < kUsbReadQueueDepth; ++i) { read_requests_[i] = CreateReadBlock(next_read_id_++); if (!SubmitRead(&read_requests_[i])) { From e4f24b6d9d2738e98b152a052bd4616f336c7c35 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 27 Feb 2020 13:31:40 -0800 Subject: [PATCH 094/388] libdm: Make static std::string inline for DmTargetDefaultKey. Bug: 149942628 Test: snapshotctl w/ ASAN build Change-Id: I0f40b1f29e46bc9afaf19d8c21d62280e2c01074 Merged-In: I0f40b1f29e46bc9afaf19d8c21d62280e2c01074 --- fs_mgr/libdm/dm_target.cpp | 4 +--- fs_mgr/libdm/include/libdm/dm_target.h | 5 +++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/fs_mgr/libdm/dm_target.cpp b/fs_mgr/libdm/dm_target.cpp index 646178891..29b103282 100644 --- a/fs_mgr/libdm/dm_target.cpp +++ b/fs_mgr/libdm/dm_target.cpp @@ -243,12 +243,10 @@ std::string DmTargetCrypt::GetParameterString() const { return android::base::Join(argv, " "); } -const std::string DmTargetDefaultKey::name_ = "default-key"; - bool DmTargetDefaultKey::IsLegacy(bool* result) { DeviceMapper& dm = DeviceMapper::Instance(); DmTargetTypeInfo info; - if (!dm.GetTargetByName(name_, &info)) return false; + if (!dm.GetTargetByName(kName, &info)) return false; // dm-default-key was modified to be like dm-crypt with version 2 *result = !info.IsAtLeast(2, 0, 0); return true; diff --git a/fs_mgr/libdm/include/libdm/dm_target.h b/fs_mgr/libdm/include/libdm/dm_target.h index d2e50d321..050d0b645 100644 --- a/fs_mgr/libdm/include/libdm/dm_target.h +++ b/fs_mgr/libdm/include/libdm/dm_target.h @@ -287,7 +287,7 @@ class DmTargetDefaultKey final : public DmTarget { blockdev_(blockdev), start_sector_(start_sector) {} - std::string name() const override { return name_; } + std::string name() const override { return kName; } bool Valid() const override; std::string GetParameterString() const override; static bool IsLegacy(bool* result); @@ -296,7 +296,8 @@ class DmTargetDefaultKey final : public DmTarget { void SetWrappedKeyV0() { is_hw_wrapped_ = true; } private: - static const std::string name_; + inline static const std::string kName = "default-key"; + std::string cipher_; std::string key_; std::string blockdev_; From c4bf521d09925e5c28fc6c9b04583540ce2be8ff Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 27 Feb 2020 14:51:51 -0800 Subject: [PATCH 095/388] snapshotctl: Not necessary to link to libdm. The symbols are provided by libfs_mgr_binder. Bug: 149942628 Test: snapshotctl builds Merged-In: Ie4313c7add5c71bb9614a4d97eec41329425f23d Change-Id: Iac986bcaaf4a8738b2938c6f95569eb8f5154805 --- fs_mgr/libsnapshot/Android.bp | 1 - 1 file changed, 1 deletion(-) diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp index 63bdcc52b..2d6261731 100644 --- a/fs_mgr/libsnapshot/Android.bp +++ b/fs_mgr/libsnapshot/Android.bp @@ -222,7 +222,6 @@ cc_binary { "snapshotctl.cpp", ], static_libs: [ - "libdm", "libfstab", "libsnapshot", ], From 284d0cf7463882ce05e51ceae25c31d29a532d37 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Thu, 27 Feb 2020 20:46:27 +0000 Subject: [PATCH 096/388] Reset post_data_ and services_update_finished_ on userspace reboot Test: adb reboot userspace Bug: 143970043 Change-Id: I77d47a8460b1526337a318547a59141334e11cdd Merged-In: I77d47a8460b1526337a318547a59141334e11cdd (cherry picked from commit 3ad292025c022dac2139e5a33debf850df27a9af) --- init/reboot.cpp | 1 + init/service_list.h | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/init/reboot.cpp b/init/reboot.cpp index 08b99abbd..8d8bd8ee6 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -817,6 +817,7 @@ static Result DoUserspaceReboot() { LOG(INFO) << "Re-enabling service '" << s->name() << "'"; s->Enable(); } + ServiceList::GetInstance().ResetState(); LeaveShutdown(); ActionManager::GetInstance().QueueEventTrigger("userspace-reboot-resume"); guard.Disable(); // Go on with userspace reboot. diff --git a/init/service_list.h b/init/service_list.h index 183862491..3b9018bc0 100644 --- a/init/service_list.h +++ b/init/service_list.h @@ -75,6 +75,11 @@ class ServiceList { bool IsServicesUpdated() const { return services_update_finished_; } void DelayService(const Service& service); + void ResetState() { + post_data_ = false; + services_update_finished_ = false; + } + private: std::vector> services_; From d5d2c6a4fa989bae6074f521288e4575725bf8f7 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Wed, 26 Feb 2020 13:43:31 -0800 Subject: [PATCH 097/388] Revert "liblog: disable header_abi_checker" All planned changes to liblog have been made, so it's time to re-enable this. This reverts commit 896fb9e57af24adc9fa1b96874f7d0685dc39755. Bug: 150608248 Test: build (cherry picked from commit cfcf684c83d705f4ed46d4eca91da5dcc032978f) Merged-In: I93553da6207976c83091f21936b0ecdd31e82848 Change-Id: I93553da6207976c83091f21936b0ecdd31e82848 --- liblog/Android.bp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/liblog/Android.bp b/liblog/Android.bp index 7f183c273..f1e511868 100644 --- a/liblog/Android.bp +++ b/liblog/Android.bp @@ -101,11 +101,6 @@ cc_library { versions: ["29", "30"], }, - // TODO(tomcherry): Renable this before release branch is cut - header_abi_checker: { - enabled: false, - }, - cflags: [ "-Wall", "-Werror", From eb04526a1e933cd15920048ebc1c9ba1de96f448 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 20 Feb 2020 10:50:00 -0800 Subject: [PATCH 098/388] Refactor libinit_test_utils to not use libinit and expose its libraries Users of libinit_test_utils must include all libraries that it uses. If it uses libinit, then there is a large number of libraries that must be included. To avoid this, make libinit_test_utils only use init_common_sources and the small number of required libraries that go along with those sources. Additionally, expose these sources as a default for users of libinit_test_utils. Bug: 148236233 Test: build Merged-In: I224fa7e0590d073e4cd40412b5dcb6f72a64b6bf Change-Id: I224fa7e0590d073e4cd40412b5dcb6f72a64b6bf (cherry picked from commit a2f9136b2c54a2ab5224e217548a274db2a91478) --- init/Android.bp | 32 ++++++++++++++++++++++++++++++++ init/action_parser.cpp | 2 +- init/service.cpp | 4 ++-- init/service_parser.cpp | 2 +- init/subcontext.cpp | 2 +- init/test_utils/Android.bp | 27 --------------------------- init/util.cpp | 2 +- 7 files changed, 38 insertions(+), 33 deletions(-) delete mode 100644 init/test_utils/Android.bp diff --git a/init/Android.bp b/init/Android.bp index f28934e95..3bb08db6c 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -88,6 +88,7 @@ cc_defaults { "-DWORLD_WRITABLE_KMSG=0", "-DDUMP_ON_UMOUNT_FAILURE=0", "-DSHUTDOWN_ZERO_TIMEOUT=0", + "-DINIT_FULL_SOURCES", ], product_variables: { debuggable: { @@ -267,6 +268,37 @@ cc_benchmark { static_libs: ["libinit"], } +cc_defaults { + name: "libinit_test_utils_libraries_defaults", + shared_libs: [ + "libbase", + "libcutils", + "libselinux", + "libhidl-gen-utils", + "liblog", + "libprocessgroup", + "libprotobuf-cpp-lite", + ], +} + +cc_library_static { + name: "libinit_test_utils", + defaults: ["libinit_test_utils_libraries_defaults"], + cflags: [ + "-Wall", + "-Wextra", + "-Wno-unused-parameter", + "-Werror", + ], + srcs: init_common_sources + [ + "test_utils/service_utils.cpp", + ], + whole_static_libs: [ + "libcap", + ], + export_include_dirs: ["test_utils/include"], // for tests +} + // Host Verifier // ------------------------------------------------------------------------------ diff --git a/init/action_parser.cpp b/init/action_parser.cpp index f3168716f..52f6a1f3c 100644 --- a/init/action_parser.cpp +++ b/init/action_parser.cpp @@ -21,7 +21,7 @@ #include #include -#if defined(__ANDROID__) +#ifdef INIT_FULL_SOURCES #include "property_service.h" #include "selinux.h" #else diff --git a/init/service.cpp b/init/service.cpp index 665a1b0a1..b12d11aec 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -40,7 +40,7 @@ #include "service_list.h" #include "util.h" -#if defined(__ANDROID__) +#ifdef INIT_FULL_SOURCES #include #include @@ -303,7 +303,7 @@ void Service::Reap(const siginfo_t& siginfo) { return; } -#if defined(__ANDROID__) +#if INIT_FULL_SOURCES static bool is_apex_updatable = android::sysprop::ApexProperties::updatable().value_or(false); #else static bool is_apex_updatable = false; diff --git a/init/service_parser.cpp b/init/service_parser.cpp index 4b04ba05c..560f693f9 100644 --- a/init/service_parser.cpp +++ b/init/service_parser.cpp @@ -34,7 +34,7 @@ #include "service_utils.h" #include "util.h" -#if defined(__ANDROID__) +#ifdef INIT_FULL_SOURCES #include #include diff --git a/init/subcontext.cpp b/init/subcontext.cpp index 326015952..5263c14c8 100644 --- a/init/subcontext.cpp +++ b/init/subcontext.cpp @@ -31,7 +31,7 @@ #include "proto_utils.h" #include "util.h" -#if defined(__ANDROID__) +#ifdef INIT_FULL_SOURCES #include #include "property_service.h" #include "selabel.h" diff --git a/init/test_utils/Android.bp b/init/test_utils/Android.bp deleted file mode 100644 index 1cb05b629..000000000 --- a/init/test_utils/Android.bp +++ /dev/null @@ -1,27 +0,0 @@ -cc_library_static { - name: "libinit_test_utils", - cflags: [ - "-Wall", - "-Wextra", - "-Wno-unused-parameter", - "-Werror", - ], - srcs: [ - "service_utils.cpp", - ], - shared_libs: [ - "libcutils", - "liblog", - "libjsoncpp", - "libprotobuf-cpp-lite", - "libhidl-gen-utils", - ], - whole_static_libs: [ - "libinit", - "libpropertyinfoparser", - ], - static_libs: [ - "libbase", - ], - export_include_dirs: ["include"], // for tests -} diff --git a/init/util.cpp b/init/util.cpp index 503c70536..24f94ec9e 100644 --- a/init/util.cpp +++ b/init/util.cpp @@ -41,7 +41,7 @@ #include #include -#if defined(__ANDROID__) +#ifdef INIT_FULL_SOURCES #include #include From d2dab830d3ec260ccd982d147d4eb0ef74071261 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Wed, 29 Jan 2020 14:09:24 -0800 Subject: [PATCH 099/388] init: handle property service callbacks asynchronously A previous change moved property_service into its own thread, since there was otherwise a deadlock whenever a process called by init would try to set a property. This new thread, however, would send a message via a blocking socket to init for each property that it received, since init may need to take action depending on which property it is. Unfortunately, this means that the deadlock is still possible, the only difference is the socket's buffer must be filled before init deadlocks. There are possible partial solutions here: the socket's buffer may be increased or property_service may only send messages for the properties that init will take action on, however all of these solutions still lead to eventual deadlock. The only complete solution is to handle these messages asynchronously. This change, therefore, adds the following: 1) A lock for instructing init to reboot 2) A lock for waiting on properties 3) A lock for queueing new properties 4) A lock for any actions with ServiceList or any Services, enforced through thread annotations, particularly since this code was not designed with the intention of being multi-threaded. Bug: 146877356 Bug: 148236233 Test: boot Test: kill hwservicemanager without deadlock Merged-In: I84108e54217866205a48c45e8b59355012c32ea8 Change-Id: I84108e54217866205a48c45e8b59355012c32ea8 (cherry picked from commit 7205c6293341c82701e849fa29cfab66916d1052) --- init/Android.bp | 2 + init/action_manager.cpp | 22 ++- init/action_manager.h | 7 +- init/builtins.cpp | 15 ++ init/init.cpp | 280 +++++++++++++++++++++--------------- init/init.h | 3 + init/init_test.cpp | 1 + init/lmkd_service.cpp | 3 +- init/mount_namespace.cpp | 11 ++ init/property_service.cpp | 204 +++++++++++++++++++------- init/property_service.h | 2 + init/property_service.proto | 1 + init/reboot.cpp | 8 +- init/service.h | 14 +- init/service_list.h | 30 ++-- init/service_lock.cpp | 25 ++++ init/service_lock.h | 40 ++++++ init/service_parser.cpp | 2 + init/sigchld_handler.cpp | 2 + 19 files changed, 479 insertions(+), 193 deletions(-) create mode 100644 init/service_lock.cpp create mode 100644 init/service_lock.h diff --git a/init/Android.bp b/init/Android.bp index 3bb08db6c..52628f372 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -28,6 +28,7 @@ init_common_sources = [ "rlimit_parser.cpp", "service.cpp", "service_list.cpp", + "service_lock.cpp", "service_parser.cpp", "service_utils.cpp", "subcontext.cpp", @@ -81,6 +82,7 @@ cc_defaults { "-Wextra", "-Wno-unused-parameter", "-Werror", + "-Wthread-safety", "-DALLOW_FIRST_STAGE_CONSOLE=0", "-DALLOW_LOCAL_PROP_OVERRIDE=0", "-DALLOW_PERMISSIVE_SELINUX=0", diff --git a/init/action_manager.cpp b/init/action_manager.cpp index ebca762ca..b45f5cd18 100644 --- a/init/action_manager.cpp +++ b/init/action_manager.cpp @@ -41,10 +41,12 @@ void ActionManager::AddAction(std::unique_ptr action) { } void ActionManager::QueueEventTrigger(const std::string& trigger) { + auto lock = std::lock_guard{event_queue_lock_}; event_queue_.emplace(trigger); } void ActionManager::QueuePropertyChange(const std::string& name, const std::string& value) { + auto lock = std::lock_guard{event_queue_lock_}; event_queue_.emplace(std::make_pair(name, value)); } @@ -53,6 +55,7 @@ void ActionManager::QueueAllPropertyActions() { } void ActionManager::QueueBuiltinAction(BuiltinFunction func, const std::string& name) { + auto lock = std::lock_guard{event_queue_lock_}; auto action = std::make_unique(true, nullptr, "", 0, name, std::map{}); action->AddCommand(std::move(func), {name}, 0); @@ -62,15 +65,18 @@ void ActionManager::QueueBuiltinAction(BuiltinFunction func, const std::string& } void ActionManager::ExecuteOneCommand() { - // Loop through the event queue until we have an action to execute - while (current_executing_actions_.empty() && !event_queue_.empty()) { - for (const auto& action : actions_) { - if (std::visit([&action](const auto& event) { return action->CheckEvent(event); }, - event_queue_.front())) { - current_executing_actions_.emplace(action.get()); + { + auto lock = std::lock_guard{event_queue_lock_}; + // Loop through the event queue until we have an action to execute + while (current_executing_actions_.empty() && !event_queue_.empty()) { + for (const auto& action : actions_) { + if (std::visit([&action](const auto& event) { return action->CheckEvent(event); }, + event_queue_.front())) { + current_executing_actions_.emplace(action.get()); + } } + event_queue_.pop(); } - event_queue_.pop(); } if (current_executing_actions_.empty()) { @@ -103,6 +109,7 @@ void ActionManager::ExecuteOneCommand() { } bool ActionManager::HasMoreCommands() const { + auto lock = std::lock_guard{event_queue_lock_}; return !current_executing_actions_.empty() || !event_queue_.empty(); } @@ -113,6 +120,7 @@ void ActionManager::DumpState() const { } void ActionManager::ClearQueue() { + auto lock = std::lock_guard{event_queue_lock_}; // We are shutting down so don't claim the oneshot builtin actions back current_executing_actions_ = {}; event_queue_ = {}; diff --git a/init/action_manager.h b/init/action_manager.h index a2b95acad..b6f93d9b5 100644 --- a/init/action_manager.h +++ b/init/action_manager.h @@ -16,9 +16,12 @@ #pragma once +#include #include #include +#include + #include "action.h" #include "builtins.h" @@ -48,7 +51,9 @@ class ActionManager { void operator=(ActionManager const&) = delete; std::vector> actions_; - std::queue> event_queue_; + std::queue> event_queue_ + GUARDED_BY(event_queue_lock_); + mutable std::mutex event_queue_lock_; std::queue current_executing_actions_; std::size_t current_command_; }; diff --git a/init/builtins.cpp b/init/builtins.cpp index 200bfff7d..dd5af72b1 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -151,6 +151,7 @@ static Result reboot_into_recovery(const std::vector& options template static void ForEachServiceInClass(const std::string& classname, F function) { + auto lock = std::lock_guard{service_lock}; for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(classname)) std::invoke(function, service); } @@ -162,6 +163,7 @@ static Result do_class_start(const BuiltinArguments& args) { return {}; // Starting a class does not start services which are explicitly disabled. // They must be started individually. + auto lock = std::lock_guard{service_lock}; for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(args[1])) { if (auto result = service->StartIfNotDisabled(); !result.ok()) { @@ -184,6 +186,7 @@ static Result do_class_start_post_data(const BuiltinArguments& args) { // stopped either. return {}; } + auto lock = std::lock_guard{service_lock}; for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(args[1])) { if (auto result = service->StartIfPostData(); !result.ok()) { @@ -234,6 +237,7 @@ static Result do_domainname(const BuiltinArguments& args) { } static Result do_enable(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindService(args[1]); if (!svc) return Error() << "Could not find service"; @@ -245,6 +249,7 @@ static Result do_enable(const BuiltinArguments& args) { } static Result do_exec(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; auto service = Service::MakeTemporaryOneshotService(args.args); if (!service.ok()) { return Error() << "Could not create exec service: " << service.error(); @@ -258,6 +263,7 @@ static Result do_exec(const BuiltinArguments& args) { } static Result do_exec_background(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; auto service = Service::MakeTemporaryOneshotService(args.args); if (!service.ok()) { return Error() << "Could not create exec background service: " << service.error(); @@ -271,6 +277,7 @@ static Result do_exec_background(const BuiltinArguments& args) { } static Result do_exec_start(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; Service* service = ServiceList::GetInstance().FindService(args[1]); if (!service) { return Error() << "Service not found"; @@ -340,6 +347,7 @@ static Result do_insmod(const BuiltinArguments& args) { } static Result do_interface_restart(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindInterface(args[1]); if (!svc) return Error() << "interface " << args[1] << " not found"; svc->Restart(); @@ -347,6 +355,7 @@ static Result do_interface_restart(const BuiltinArguments& args) { } static Result do_interface_start(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindInterface(args[1]); if (!svc) return Error() << "interface " << args[1] << " not found"; if (auto result = svc->Start(); !result.ok()) { @@ -356,6 +365,7 @@ static Result do_interface_start(const BuiltinArguments& args) { } static Result do_interface_stop(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindInterface(args[1]); if (!svc) return Error() << "interface " << args[1] << " not found"; svc->Stop(); @@ -740,6 +750,7 @@ static Result do_setrlimit(const BuiltinArguments& args) { } static Result do_start(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindService(args[1]); if (!svc) return Error() << "service " << args[1] << " not found"; if (auto result = svc->Start(); !result.ok()) { @@ -749,6 +760,7 @@ static Result do_start(const BuiltinArguments& args) { } static Result do_stop(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindService(args[1]); if (!svc) return Error() << "service " << args[1] << " not found"; svc->Stop(); @@ -756,6 +768,7 @@ static Result do_stop(const BuiltinArguments& args) { } static Result do_restart(const BuiltinArguments& args) { + auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindService(args[1]); if (!svc) return Error() << "service " << args[1] << " not found"; svc->Restart(); @@ -1111,6 +1124,7 @@ static Result ExecWithFunctionOnFailure(const std::vector& ar function(StringPrintf("Exec service failed, status %d", siginfo.si_status)); } }); + auto lock = std::lock_guard{service_lock}; if (auto result = (*service)->ExecStart(); !result.ok()) { function("ExecStart failed: " + result.error().message()); } @@ -1250,6 +1264,7 @@ static Result parse_apex_configs() { } success &= parser.ParseConfigFile(c); } + auto lock = std::lock_guard{service_lock}; ServiceList::GetInstance().MarkServicesUpdate(); if (success) { return {}; diff --git a/init/init.cpp b/init/init.cpp index 5bf1b36c9..bfef9e5bc 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -33,7 +33,9 @@ #include #include #include +#include #include +#include #include #include @@ -95,15 +97,148 @@ static int property_triggers_enabled = 0; static int signal_fd = -1; static int property_fd = -1; -static std::unique_ptr waiting_for_prop(nullptr); -static std::string wait_prop_name; -static std::string wait_prop_value; -static std::string shutdown_command; -static bool do_shutdown = false; - static std::unique_ptr subcontext; +// Init epolls various FDs to wait for various inputs. It previously waited on property changes +// with a blocking socket that contained the information related to the change, however, it was easy +// to fill that socket and deadlock the system. Now we use locks to handle the property changes +// directly in the property thread, however we still must wake the epoll to inform init that there +// is a change to process, so we use this FD. It is non-blocking, since we do not care how many +// times WakeEpoll() is called, only that the epoll will wake. +static int wake_epoll_fd = -1; +static void InstallInitNotifier(Epoll* epoll) { + int sockets[2]; + if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, sockets) != 0) { + PLOG(FATAL) << "Failed to socketpair() between property_service and init"; + } + int epoll_fd = sockets[0]; + wake_epoll_fd = sockets[1]; + + auto drain_socket = [epoll_fd] { + char buf[512]; + while (read(epoll_fd, buf, sizeof(buf)) > 0) { + } + }; + + if (auto result = epoll->RegisterHandler(epoll_fd, drain_socket); !result) { + LOG(FATAL) << result.error(); + } +} + +static void WakeEpoll() { + constexpr char value[] = "1"; + write(wake_epoll_fd, value, sizeof(value)); +} + +static class PropWaiterState { + public: + bool StartWaiting(const char* name, const char* value) { + auto lock = std::lock_guard{lock_}; + if (waiting_for_prop_) { + return false; + } + if (GetProperty(name, "") != value) { + // Current property value is not equal to expected value + wait_prop_name_ = name; + wait_prop_value_ = value; + waiting_for_prop_.reset(new Timer()); + } else { + LOG(INFO) << "start_waiting_for_property(\"" << name << "\", \"" << value + << "\"): already set"; + } + return true; + } + + void ResetWaitForProp() { + auto lock = std::lock_guard{lock_}; + ResetWaitForPropLocked(); + } + + void CheckAndResetWait(const std::string& name, const std::string& value) { + auto lock = std::lock_guard{lock_}; + // We always record how long init waited for ueventd to tell us cold boot finished. + // If we aren't waiting on this property, it means that ueventd finished before we even + // started to wait. + if (name == kColdBootDoneProp) { + auto time_waited = waiting_for_prop_ ? waiting_for_prop_->duration().count() : 0; + std::thread([time_waited] { + SetProperty("ro.boottime.init.cold_boot_wait", std::to_string(time_waited)); + }).detach(); + } + + if (waiting_for_prop_) { + if (wait_prop_name_ == name && wait_prop_value_ == value) { + LOG(INFO) << "Wait for property '" << wait_prop_name_ << "=" << wait_prop_value_ + << "' took " << *waiting_for_prop_; + ResetWaitForPropLocked(); + WakeEpoll(); + } + } + } + + // This is not thread safe because it releases the lock when it returns, so the waiting state + // may change. However, we only use this function to prevent running commands in the main + // thread loop when we are waiting, so we do not care about false positives; only false + // negatives. StartWaiting() and this function are always called from the same thread, so false + // negatives are not possible and therefore we're okay. + bool MightBeWaiting() { + auto lock = std::lock_guard{lock_}; + return static_cast(waiting_for_prop_); + } + + private: + void ResetWaitForPropLocked() { + wait_prop_name_.clear(); + wait_prop_value_.clear(); + waiting_for_prop_.reset(); + } + + std::mutex lock_; + std::unique_ptr waiting_for_prop_{nullptr}; + std::string wait_prop_name_; + std::string wait_prop_value_; + +} prop_waiter_state; + +bool start_waiting_for_property(const char* name, const char* value) { + return prop_waiter_state.StartWaiting(name, value); +} + +void ResetWaitForProp() { + prop_waiter_state.ResetWaitForProp(); +} + +static class ShutdownState { + public: + void TriggerShutdown(const std::string& command) { + // We can't call HandlePowerctlMessage() directly in this function, + // because it modifies the contents of the action queue, which can cause the action queue + // to get into a bad state if this function is called from a command being executed by the + // action queue. Instead we set this flag and ensure that shutdown happens before the next + // command is run in the main init loop. + auto lock = std::lock_guard{shutdown_command_lock_}; + shutdown_command_ = command; + do_shutdown_ = true; + WakeEpoll(); + } + + std::optional CheckShutdown() { + auto lock = std::lock_guard{shutdown_command_lock_}; + if (do_shutdown_ && !IsShuttingDown()) { + do_shutdown_ = false; + return shutdown_command_; + } + return {}; + } + + private: + std::mutex shutdown_command_lock_; + std::string shutdown_command_; + bool do_shutdown_ = false; +} shutdown_state; + void DumpState() { + auto lock = std::lock_guard{service_lock}; ServiceList::GetInstance().DumpState(); ActionManager::GetInstance().DumpState(); } @@ -156,40 +291,7 @@ static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_ } } -bool start_waiting_for_property(const char *name, const char *value) -{ - if (waiting_for_prop) { - return false; - } - if (GetProperty(name, "") != value) { - // Current property value is not equal to expected value - wait_prop_name = name; - wait_prop_value = value; - waiting_for_prop.reset(new Timer()); - } else { - LOG(INFO) << "start_waiting_for_property(\"" - << name << "\", \"" << value << "\"): already set"; - } - return true; -} - -void ResetWaitForProp() { - wait_prop_name.clear(); - wait_prop_value.clear(); - waiting_for_prop.reset(); -} - -static void TriggerShutdown(const std::string& command) { - // We can't call HandlePowerctlMessage() directly in this function, - // because it modifies the contents of the action queue, which can cause the action queue - // to get into a bad state if this function is called from a command being executed by the - // action queue. Instead we set this flag and ensure that shutdown happens before the next - // command is run in the main init loop. - shutdown_command = command; - do_shutdown = true; -} - -void property_changed(const std::string& name, const std::string& value) { +void PropertyChanged(const std::string& name, const std::string& value) { // If the property is sys.powerctl, we bypass the event queue and immediately handle it. // This is to ensure that init will always and immediately shutdown/reboot, regardless of // if there are other pending events to process or if init is waiting on an exec service or @@ -197,30 +299,20 @@ void property_changed(const std::string& name, const std::string& value) { // In non-thermal-shutdown case, 'shutdown' trigger will be fired to let device specific // commands to be executed. if (name == "sys.powerctl") { - TriggerShutdown(value); + trigger_shutdown(value); } - if (property_triggers_enabled) ActionManager::GetInstance().QueuePropertyChange(name, value); - - // We always record how long init waited for ueventd to tell us cold boot finished. - // If we aren't waiting on this property, it means that ueventd finished before we even started - // to wait. - if (name == kColdBootDoneProp) { - auto time_waited = waiting_for_prop ? waiting_for_prop->duration().count() : 0; - SetProperty("ro.boottime.init.cold_boot_wait", std::to_string(time_waited)); + if (property_triggers_enabled) { + ActionManager::GetInstance().QueuePropertyChange(name, value); + WakeEpoll(); } - if (waiting_for_prop) { - if (wait_prop_name == name && wait_prop_value == value) { - LOG(INFO) << "Wait for property '" << wait_prop_name << "=" << wait_prop_value - << "' took " << *waiting_for_prop; - ResetWaitForProp(); - } - } + prop_waiter_state.CheckAndResetWait(name, value); } static std::optional HandleProcessActions() { std::optional next_process_action_time; + auto lock = std::lock_guard{service_lock}; for (const auto& s : ServiceList::GetInstance()) { if ((s->flags() & SVC_RUNNING) && s->timeout_period()) { auto timeout_time = s->time_started() + *s->timeout_period(); @@ -249,7 +341,7 @@ static std::optional HandleProcessActions() { return next_process_action_time; } -static Result DoControlStart(Service* service) { +static Result DoControlStart(Service* service) REQUIRES(service_lock) { return service->Start(); } @@ -258,7 +350,7 @@ static Result DoControlStop(Service* service) { return {}; } -static Result DoControlRestart(Service* service) { +static Result DoControlRestart(Service* service) REQUIRES(service_lock) { service->Restart(); return {}; } @@ -292,7 +384,7 @@ static const std::map& get_control_message_ return control_message_functions; } -bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t pid) { +bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t from_pid) { const auto& map = get_control_message_map(); const auto it = map.find(msg); @@ -301,7 +393,7 @@ bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t return false; } - std::string cmdline_path = StringPrintf("proc/%d/cmdline", pid); + std::string cmdline_path = StringPrintf("proc/%d/cmdline", from_pid); std::string process_cmdline; if (ReadFileToString(cmdline_path, &process_cmdline)) { std::replace(process_cmdline.begin(), process_cmdline.end(), '\0', ' '); @@ -312,6 +404,8 @@ bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t const ControlMessageFunction& function = it->second; + auto lock = std::lock_guard{service_lock}; + Service* svc = nullptr; switch (function.target) { @@ -329,23 +423,24 @@ bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t if (svc == nullptr) { LOG(ERROR) << "Control message: Could not find '" << name << "' for ctl." << msg - << " from pid: " << pid << " (" << process_cmdline << ")"; + << " from pid: " << from_pid << " (" << process_cmdline << ")"; return false; } if (auto result = function.action(svc); !result.ok()) { LOG(ERROR) << "Control message: Could not ctl." << msg << " for '" << name - << "' from pid: " << pid << " (" << process_cmdline << "): " << result.error(); + << "' from pid: " << from_pid << " (" << process_cmdline + << "): " << result.error(); return false; } LOG(INFO) << "Control message: Processed ctl." << msg << " for '" << name - << "' from pid: " << pid << " (" << process_cmdline << ")"; + << "' from pid: " << from_pid << " (" << process_cmdline << ")"; return true; } static Result wait_for_coldboot_done_action(const BuiltinArguments& args) { - if (!start_waiting_for_property(kColdBootDoneProp, "true")) { + if (!prop_waiter_state.StartWaiting(kColdBootDoneProp, "true")) { LOG(FATAL) << "Could not wait for '" << kColdBootDoneProp << "'"; } @@ -493,6 +588,7 @@ void HandleKeychord(const std::vector& keycodes) { } auto found = false; + auto lock = std::lock_guard{service_lock}; for (const auto& service : ServiceList::GetInstance()) { auto svc = service.get(); if (svc->keycodes() == keycodes) { @@ -579,44 +675,6 @@ void SendStartSendingMessagesMessage() { } } -static void HandlePropertyFd() { - auto message = ReadMessage(property_fd); - if (!message.ok()) { - LOG(ERROR) << "Could not read message from property service: " << message.error(); - return; - } - - auto property_message = PropertyMessage{}; - if (!property_message.ParseFromString(*message)) { - LOG(ERROR) << "Could not parse message from property service"; - return; - } - - switch (property_message.msg_case()) { - case PropertyMessage::kControlMessage: { - auto& control_message = property_message.control_message(); - bool success = HandleControlMessage(control_message.msg(), control_message.name(), - control_message.pid()); - - uint32_t response = success ? PROP_SUCCESS : PROP_ERROR_HANDLE_CONTROL_MESSAGE; - if (control_message.has_fd()) { - int fd = control_message.fd(); - TEMP_FAILURE_RETRY(send(fd, &response, sizeof(response), 0)); - close(fd); - } - break; - } - case PropertyMessage::kChangedMessage: { - auto& changed_message = property_message.changed_message(); - property_changed(changed_message.name(), changed_message.value()); - break; - } - default: - LOG(ERROR) << "Unknown message type from property service: " - << property_message.msg_case(); - } -} - int SecondStageMain(int argc, char** argv) { if (REBOOT_BOOTLOADER_ON_PANIC) { InstallRebootSignalHandlers(); @@ -624,7 +682,7 @@ int SecondStageMain(int argc, char** argv) { boot_clock::time_point start_time = boot_clock::now(); - trigger_shutdown = TriggerShutdown; + trigger_shutdown = [](const std::string& command) { shutdown_state.TriggerShutdown(command); }; SetStdioToDevNull(argv); InitKernelLogging(argv); @@ -684,11 +742,8 @@ int SecondStageMain(int argc, char** argv) { } InstallSignalFdHandler(&epoll); - + InstallInitNotifier(&epoll); StartPropertyService(&property_fd); - if (auto result = epoll.RegisterHandler(property_fd, HandlePropertyFd); !result.ok()) { - LOG(FATAL) << "Could not register epoll handler for property fd: " << result.error(); - } // Make the time that init stages started available for bootstat to log. RecordStageBoottimes(start_time); @@ -742,6 +797,7 @@ int SecondStageMain(int argc, char** argv) { Keychords keychords; am.QueueBuiltinAction( [&epoll, &keychords](const BuiltinArguments& args) -> Result { + auto lock = std::lock_guard{service_lock}; for (const auto& svc : ServiceList::GetInstance()) { keychords.Register(svc->keycodes()); } @@ -772,12 +828,12 @@ int SecondStageMain(int argc, char** argv) { // By default, sleep until something happens. auto epoll_timeout = std::optional{}; - if (do_shutdown && !IsShuttingDown()) { - do_shutdown = false; - HandlePowerctlMessage(shutdown_command); + auto shutdown_command = shutdown_state.CheckShutdown(); + if (shutdown_command) { + HandlePowerctlMessage(*shutdown_command); } - if (!(waiting_for_prop || Service::is_exec_service_running())) { + if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { am.ExecuteOneCommand(); } if (!IsShuttingDown()) { @@ -791,7 +847,7 @@ int SecondStageMain(int argc, char** argv) { } } - if (!(waiting_for_prop || Service::is_exec_service_running())) { + if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { // If there's more work to do, wake up again immediately. if (am.HasMoreCommands()) epoll_timeout = 0ms; } diff --git a/init/init.h b/init/init.h index 4bbca6f3c..bcf24e73f 100644 --- a/init/init.h +++ b/init/init.h @@ -41,6 +41,9 @@ void SendLoadPersistentPropertiesMessage(); void SendStopSendingMessagesMessage(); void SendStartSendingMessagesMessage(); +void PropertyChanged(const std::string& name, const std::string& value); +bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t from_pid); + int SecondStageMain(int argc, char** argv); } // namespace init diff --git a/init/init_test.cpp b/init/init_test.cpp index caf3e0343..3053bd848 100644 --- a/init/init_test.cpp +++ b/init/init_test.cpp @@ -167,6 +167,7 @@ service A something ServiceList service_list; TestInitText(init_script, BuiltinFunctionMap(), {}, &service_list); + auto lock = std::lock_guard{service_lock}; ASSERT_EQ(1, std::distance(service_list.begin(), service_list.end())); auto service = service_list.begin()->get(); diff --git a/init/lmkd_service.cpp b/init/lmkd_service.cpp index dd1ab4d61..a531d0aea 100644 --- a/init/lmkd_service.cpp +++ b/init/lmkd_service.cpp @@ -79,7 +79,8 @@ static bool UnregisterProcess(pid_t pid) { } static void RegisterServices(pid_t exclude_pid) { - for (const auto& service : ServiceList::GetInstance().services()) { + auto lock = std::lock_guard{service_lock}; + for (const auto& service : ServiceList::GetInstance()) { auto svc = service.get(); if (svc->oom_score_adjust() != DEFAULT_OOM_SCORE_ADJUST) { // skip if process is excluded or not yet forked (pid==0) diff --git a/init/mount_namespace.cpp b/init/mount_namespace.cpp index 0749fe3b8..aa368492d 100644 --- a/init/mount_namespace.cpp +++ b/init/mount_namespace.cpp @@ -29,6 +29,7 @@ #include #include +#include "property_service.h" #include "util.h" namespace android { @@ -290,6 +291,14 @@ bool SwitchToDefaultMountNamespace() { return true; } if (default_ns_id != GetMountNamespaceId()) { + // The property service thread and its descendent threads must be in the correct mount + // namespace to call Service::Start(), however setns() only operates on a single thread and + // fails when secondary threads attempt to join the same mount namespace. Therefore, we + // must join the property service thread and its descendents before the setns() call. Those + // threads are then started again after the setns() call, and they'll be in the proper + // namespace. + PausePropertyService(); + if (setns(default_ns_fd.get(), CLONE_NEWNS) == -1) { PLOG(ERROR) << "Failed to switch back to the default mount namespace."; return false; @@ -299,6 +308,8 @@ bool SwitchToDefaultMountNamespace() { LOG(ERROR) << result.error(); return false; } + + ResumePropertyService(); } LOG(INFO) << "Switched to default mount namespace"; diff --git a/init/property_service.cpp b/init/property_service.cpp index 730bf6de4..319a241c7 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -92,8 +92,10 @@ namespace init { static bool persistent_properties_loaded = false; static int property_set_fd = -1; +static int from_init_socket = -1; static int init_socket = -1; static bool accept_messages = false; +static std::thread property_service_thread; static PropertyInfoAreaFile property_info_area; @@ -147,17 +149,6 @@ static bool CheckMacPerms(const std::string& name, const char* target_context, return has_access; } -static void SendPropertyChanged(const std::string& name, const std::string& value) { - auto property_msg = PropertyMessage{}; - auto* changed_message = property_msg.mutable_changed_message(); - changed_message->set_name(name); - changed_message->set_value(value); - - if (auto result = SendMessage(init_socket, property_msg); !result.ok()) { - LOG(ERROR) << "Failed to send property changed message: " << result.error(); - } -} - static uint32_t PropertySet(const std::string& name, const std::string& value, std::string* error) { size_t valuelen = value.size(); @@ -196,47 +187,137 @@ static uint32_t PropertySet(const std::string& name, const std::string& value, s // If init hasn't started its main loop, then it won't be handling property changed messages // anyway, so there's no need to try to send them. if (accept_messages) { - SendPropertyChanged(name, value); + PropertyChanged(name, value); } return PROP_SUCCESS; } -class AsyncRestorecon { +template +class SingleThreadExecutor { public: - void TriggerRestorecon(const std::string& path) { - auto guard = std::lock_guard{mutex_}; - paths_.emplace(path); + virtual ~SingleThreadExecutor() {} - if (!thread_started_) { - thread_started_ = true; - std::thread{&AsyncRestorecon::ThreadFunction, this}.detach(); + template + void Run(F&& item) { + auto guard = std::lock_guard{mutex_}; + items_.emplace(std::forward(item)); + + if (thread_state_ == ThreadState::kRunning || thread_state_ == ThreadState::kStopped) { + return; + } + + if (thread_state_ == ThreadState::kPendingJoin) { + thread_.join(); + } + + StartThread(); + } + + void StopAndJoin() { + auto lock = std::unique_lock{mutex_}; + if (thread_state_ == ThreadState::kPendingJoin) { + thread_.join(); + } else if (thread_state_ == ThreadState::kRunning) { + thread_state_ = ThreadState::kStopped; + lock.unlock(); + thread_.join(); + lock.lock(); + } + + thread_state_ = ThreadState::kStopped; + } + + void Restart() { + auto guard = std::lock_guard{mutex_}; + if (items_.empty()) { + thread_state_ = ThreadState::kNotStarted; + } else { + StartThread(); + } + } + + void MaybeJoin() { + auto guard = std::lock_guard{mutex_}; + if (thread_state_ == ThreadState::kPendingJoin) { + thread_.join(); + thread_state_ = ThreadState::kNotStarted; } } private: + virtual void Execute(T&& item) = 0; + + void StartThread() { + thread_state_ = ThreadState::kRunning; + auto thread = std::thread{&SingleThreadExecutor::ThreadFunction, this}; + std::swap(thread_, thread); + } + void ThreadFunction() { auto lock = std::unique_lock{mutex_}; - while (!paths_.empty()) { - auto path = paths_.front(); - paths_.pop(); + while (!items_.empty()) { + auto item = items_.front(); + items_.pop(); lock.unlock(); - if (selinux_android_restorecon(path.c_str(), SELINUX_ANDROID_RESTORECON_RECURSE) != 0) { - LOG(ERROR) << "Asynchronous restorecon of '" << path << "' failed'"; - } - android::base::SetProperty(kRestoreconProperty, path); + Execute(std::move(item)); lock.lock(); } - thread_started_ = false; + if (thread_state_ != ThreadState::kStopped) { + thread_state_ = ThreadState::kPendingJoin; + } } std::mutex mutex_; - std::queue paths_; - bool thread_started_ = false; + std::queue items_; + enum class ThreadState { + kNotStarted, // Initial state when starting the program or when restarting with no items to + // process. + kRunning, // The thread is running and is in a state that it will process new items if + // are run. + kPendingJoin, // The thread has run to completion and is pending join(). A new thread must + // be launched for new items to be processed. + kStopped, // This executor has stopped and will not process more items until Restart() is + // called. Currently pending items will be processed and the thread will be + // joined. + }; + ThreadState thread_state_ = ThreadState::kNotStarted; + std::thread thread_; }; +class RestoreconThread : public SingleThreadExecutor { + virtual void Execute(std::string&& path) override { + if (selinux_android_restorecon(path.c_str(), SELINUX_ANDROID_RESTORECON_RECURSE) != 0) { + LOG(ERROR) << "Asynchronous restorecon of '" << path << "' failed'"; + } + android::base::SetProperty(kRestoreconProperty, path); + } +}; + +struct ControlMessageInfo { + std::string message; + std::string name; + pid_t pid; + int fd; +}; + +class ControlMessageThread : public SingleThreadExecutor { + virtual void Execute(ControlMessageInfo&& info) override { + bool success = HandleControlMessage(info.message, info.name, info.pid); + + uint32_t response = success ? PROP_SUCCESS : PROP_ERROR_HANDLE_CONTROL_MESSAGE; + if (info.fd != -1) { + TEMP_FAILURE_RETRY(send(info.fd, &response, sizeof(response), 0)); + close(info.fd); + } + } +}; + +static RestoreconThread restorecon_thread; +static ControlMessageThread control_message_thread; + class SocketConnection { public: SocketConnection(int socket, const ucred& cred) : socket_(socket), cred_(cred) {} @@ -378,29 +459,17 @@ static uint32_t SendControlMessage(const std::string& msg, const std::string& na return PROP_ERROR_HANDLE_CONTROL_MESSAGE; } - auto property_msg = PropertyMessage{}; - auto* control_message = property_msg.mutable_control_message(); - control_message->set_msg(msg); - control_message->set_name(name); - control_message->set_pid(pid); - - // We must release the fd before sending it to init, otherwise there will be a race with init. - // If init calls close() before Release(), then fdsan will see the wrong tag and abort(). + // We must release the fd before spawning the thread, otherwise there will be a race with the + // thread. If the thread calls close() before this function calls Release(), then fdsan will see + // the wrong tag and abort(). int fd = -1; if (socket != nullptr && SelinuxGetVendorAndroidVersion() > __ANDROID_API_Q__) { fd = socket->Release(); - control_message->set_fd(fd); } - if (auto result = SendMessage(init_socket, property_msg); !result.ok()) { - // We've already released the fd above, so if we fail to send the message to init, we need - // to manually free it here. - if (fd != -1) { - close(fd); - } - *error = "Failed to send control message: " + result.error().message(); - return PROP_ERROR_HANDLE_CONTROL_MESSAGE; - } + // Handling a control message likely calls SetProperty, which we must synchronously handle, + // therefore we must fork a thread to handle it. + control_message_thread.Run({msg, name, pid, fd}); return PROP_SUCCESS; } @@ -502,8 +571,7 @@ uint32_t HandlePropertySet(const std::string& name, const std::string& value, // We use a thread to do this restorecon operation to prevent holding up init, as it may take // a long time to complete. if (name == kRestoreconProperty && cr.pid != 1 && !value.empty()) { - static AsyncRestorecon async_restorecon; - async_restorecon.TriggerRestorecon(value); + restorecon_thread.Run(value); return PROP_SUCCESS; } @@ -1084,6 +1152,8 @@ void PropertyInit() { PropertyLoadBootDefaults(); } +static bool pause_property_service = false; + static void HandleInitSocket() { auto message = ReadMessage(init_socket); if (!message.ok()) { @@ -1118,6 +1188,10 @@ static void HandleInitSocket() { accept_messages = true; break; } + case InitMessage::kPausePropertyService: { + pause_property_service = true; + break; + } default: LOG(ERROR) << "Unknown message type from init: " << init_message.msg_case(); } @@ -1138,7 +1212,7 @@ static void PropertyServiceThread() { LOG(FATAL) << result.error(); } - while (true) { + while (!pause_property_service) { auto pending_functions = epoll.Wait(std::nullopt); if (!pending_functions.ok()) { LOG(ERROR) << pending_functions.error(); @@ -1147,9 +1221,34 @@ static void PropertyServiceThread() { (*function)(); } } + control_message_thread.MaybeJoin(); + restorecon_thread.MaybeJoin(); } } +void SendStopPropertyServiceMessage() { + auto init_message = InitMessage{}; + init_message.set_pause_property_service(true); + if (auto result = SendMessage(from_init_socket, init_message); !result.ok()) { + LOG(ERROR) << "Failed to send stop property service message: " << result.error(); + } +} + +void PausePropertyService() { + control_message_thread.StopAndJoin(); + restorecon_thread.StopAndJoin(); + SendStopPropertyServiceMessage(); + property_service_thread.join(); +} + +void ResumePropertyService() { + pause_property_service = false; + auto new_thread = std::thread{PropertyServiceThread}; + property_service_thread.swap(new_thread); + restorecon_thread.Restart(); + control_message_thread.Restart(); +} + void StartPropertyService(int* epoll_socket) { InitPropertySet("ro.property_service.version", "2"); @@ -1157,7 +1256,7 @@ void StartPropertyService(int* epoll_socket) { if (socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0, sockets) != 0) { PLOG(FATAL) << "Failed to socketpair() between property_service and init"; } - *epoll_socket = sockets[0]; + *epoll_socket = from_init_socket = sockets[0]; init_socket = sockets[1]; accept_messages = true; @@ -1171,7 +1270,8 @@ void StartPropertyService(int* epoll_socket) { listen(property_set_fd, 8); - std::thread{PropertyServiceThread}.detach(); + auto new_thread = std::thread{PropertyServiceThread}; + property_service_thread.swap(new_thread); } } // namespace init diff --git a/init/property_service.h b/init/property_service.h index 506d116e1..e92132632 100644 --- a/init/property_service.h +++ b/init/property_service.h @@ -31,6 +31,8 @@ bool CanReadProperty(const std::string& source_context, const std::string& name) void PropertyInit(); void StartPropertyService(int* epoll_socket); +void ResumePropertyService(); +void PausePropertyService(); } // namespace init } // namespace android diff --git a/init/property_service.proto b/init/property_service.proto index 08268d9bb..36245b228 100644 --- a/init/property_service.proto +++ b/init/property_service.proto @@ -41,5 +41,6 @@ message InitMessage { bool load_persistent_properties = 1; bool stop_sending_messages = 2; bool start_sending_messages = 3; + bool pause_property_service = 4; }; } diff --git a/init/reboot.cpp b/init/reboot.cpp index 8d8bd8ee6..cad192de9 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -85,7 +85,7 @@ static bool shutting_down = false; static const std::set kDebuggingServices{"tombstoned", "logd", "adbd", "console"}; -static std::vector GetDebuggingServices(bool only_post_data) { +static std::vector GetDebuggingServices(bool only_post_data) REQUIRES(service_lock) { std::vector ret; ret.reserve(kDebuggingServices.size()); for (const auto& s : ServiceList::GetInstance()) { @@ -181,7 +181,7 @@ class MountEntry { }; // Turn off backlight while we are performing power down cleanup activities. -static void TurnOffBacklight() { +static void TurnOffBacklight() REQUIRES(service_lock) { Service* service = ServiceList::GetInstance().FindService("blank_screen"); if (service == nullptr) { LOG(WARNING) << "cannot find blank_screen in TurnOffBacklight"; @@ -589,6 +589,7 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str // Start reboot monitor thread sem_post(&reboot_semaphore); + auto lock = std::lock_guard{service_lock}; // watchdogd is a vendor specific component but should be alive to complete shutdown safely. const std::set to_starts{"watchdogd"}; std::vector stop_first; @@ -708,6 +709,7 @@ static void EnterShutdown() { // Skip wait for prop if it is in progress ResetWaitForProp(); // Clear EXEC flag if there is one pending + auto lock = std::lock_guard{service_lock}; for (const auto& s : ServiceList::GetInstance()) { s->UnSetExec(); } @@ -751,6 +753,7 @@ static Result DoUserspaceReboot() { return Error() << "Failed to set sys.init.userspace_reboot.in_progress property"; } EnterShutdown(); + auto lock = std::lock_guard{service_lock}; if (!SetProperty("sys.powerctl", "")) { return Error() << "Failed to reset sys.powerctl property"; } @@ -911,6 +914,7 @@ void HandlePowerctlMessage(const std::string& command) { run_fsck = true; } else if (cmd_params[1] == "thermal") { // Turn off sources of heat immediately. + auto lock = std::lock_guard{service_lock}; TurnOffBacklight(); // run_fsck is false to avoid delay cmd = ANDROID_RB_THERMOFF; diff --git a/init/service.h b/init/service.h index cf3f0c290..d2a446207 100644 --- a/init/service.h +++ b/init/service.h @@ -27,12 +27,14 @@ #include #include +#include #include #include "action.h" #include "capabilities.h" #include "keyword_map.h" #include "parser.h" +#include "service_lock.h" #include "service_utils.h" #include "subcontext.h" @@ -77,17 +79,17 @@ class Service { bool IsRunning() { return (flags_ & SVC_RUNNING) != 0; } bool IsEnabled() { return (flags_ & SVC_DISABLED) == 0; } - Result ExecStart(); - Result Start(); - Result StartIfNotDisabled(); - Result StartIfPostData(); - Result Enable(); + Result ExecStart() REQUIRES(service_lock); + Result Start() REQUIRES(service_lock); + Result StartIfNotDisabled() REQUIRES(service_lock); + Result StartIfPostData() REQUIRES(service_lock); + Result Enable() REQUIRES(service_lock); void Reset(); void ResetIfPostData(); void Stop(); void Terminate(); void Timeout(); - void Restart(); + void Restart() REQUIRES(service_lock); void Reap(const siginfo_t& siginfo); void DumpState() const; void SetShutdownCritical() { flags_ |= SVC_SHUTDOWN_CRITICAL; } diff --git a/init/service_list.h b/init/service_list.h index 3b9018bc0..280a2280f 100644 --- a/init/service_list.h +++ b/init/service_list.h @@ -17,9 +17,13 @@ #pragma once #include +#include #include +#include + #include "service.h" +#include "service_lock.h" namespace android { namespace init { @@ -32,16 +36,16 @@ class ServiceList { ServiceList(); size_t CheckAllCommands(); - void AddService(std::unique_ptr service); - void RemoveService(const Service& svc); + void AddService(std::unique_ptr service) REQUIRES(service_lock); + void RemoveService(const Service& svc) REQUIRES(service_lock); template - void RemoveServiceIf(UnaryPredicate predicate) { + void RemoveServiceIf(UnaryPredicate predicate) REQUIRES(service_lock) { services_.erase(std::remove_if(services_.begin(), services_.end(), predicate), services_.end()); } template - Service* FindService(T value, F function = &Service::name) const { + Service* FindService(T value, F function = &Service::name) const REQUIRES(service_lock) { auto svc = std::find_if(services_.begin(), services_.end(), [&function, &value](const std::unique_ptr& s) { return std::invoke(function, s) == value; @@ -52,7 +56,7 @@ class ServiceList { return nullptr; } - Service* FindInterface(const std::string& interface_name) { + Service* FindInterface(const std::string& interface_name) REQUIRES(service_lock) { for (const auto& svc : services_) { if (svc->interfaces().count(interface_name) > 0) { return svc.get(); @@ -62,18 +66,20 @@ class ServiceList { return nullptr; } - void DumpState() const; + void DumpState() const REQUIRES(service_lock); - auto begin() const { return services_.begin(); } - auto end() const { return services_.end(); } - const std::vector>& services() const { return services_; } - const std::vector services_in_shutdown_order() const; + auto begin() const REQUIRES(service_lock) { return services_.begin(); } + auto end() const REQUIRES(service_lock) { return services_.end(); } + const std::vector>& services() const REQUIRES(service_lock) { + return services_; + } + const std::vector services_in_shutdown_order() const REQUIRES(service_lock); void MarkPostData(); bool IsPostData(); - void MarkServicesUpdate(); + void MarkServicesUpdate() REQUIRES(service_lock); bool IsServicesUpdated() const { return services_update_finished_; } - void DelayService(const Service& service); + void DelayService(const Service& service) REQUIRES(service_lock); void ResetState() { post_data_ = false; diff --git a/init/service_lock.cpp b/init/service_lock.cpp new file mode 100644 index 000000000..404d4396e --- /dev/null +++ b/init/service_lock.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2020 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 "service_lock.h" + +namespace android { +namespace init { + +RecursiveMutex service_lock; + +} // namespace init +} // namespace android diff --git a/init/service_lock.h b/init/service_lock.h new file mode 100644 index 000000000..6b94271be --- /dev/null +++ b/init/service_lock.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2020 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 + +#include + +namespace android { +namespace init { + +// This class exists to add thread annotations, since they're absent from std::recursive_mutex. + +class CAPABILITY("mutex") RecursiveMutex { + public: + void lock() ACQUIRE() { mutex_.lock(); } + void unlock() RELEASE() { mutex_.unlock(); } + + private: + std::recursive_mutex mutex_; +}; + +extern RecursiveMutex service_lock; + +} // namespace init +} // namespace android diff --git a/init/service_parser.cpp b/init/service_parser.cpp index 560f693f9..51f4c9786 100644 --- a/init/service_parser.cpp +++ b/init/service_parser.cpp @@ -168,6 +168,7 @@ Result ServiceParser::ParseInterface(std::vector&& args) { const std::string fullname = interface_name + "/" + instance_name; + auto lock = std::lock_guard{service_lock}; for (const auto& svc : *service_list_) { if (svc->interfaces().count(fullname) > 0) { return Error() << "Interface '" << fullname << "' redefined in " << service_->name() @@ -598,6 +599,7 @@ Result ServiceParser::EndSection() { } } + auto lock = std::lock_guard{service_lock}; Service* old_service = service_list_->FindService(service_->name()); if (old_service) { if (!service_->is_override()) { diff --git a/init/sigchld_handler.cpp b/init/sigchld_handler.cpp index 9b2c7d939..064d64d54 100644 --- a/init/sigchld_handler.cpp +++ b/init/sigchld_handler.cpp @@ -64,6 +64,8 @@ static pid_t ReapOneProcess() { std::string wait_string; Service* service = nullptr; + auto lock = std::lock_guard{service_lock}; + if (SubcontextChildReap(pid)) { name = "Subcontext"; } else { From 352ae2d225cd78248cdb0c5cbf829a49ed227e75 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 28 Feb 2020 11:37:22 +0000 Subject: [PATCH 100/388] Stop & Resume property service when switching to bootstrap namespace Test: atest CtsUserspaceRebootHostSideTestCases Bug: 148236233 Bug: 149745936 Merged-In: I9d30b75f4b4177175ce086c3b6a7c0bba9a17396 Change-Id: I9d30b75f4b4177175ce086c3b6a7c0bba9a17396 (cherry picked from commit 6963f81a2b9d07d266b768aa03cfd212bf64b107) --- init/mount_namespace.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/init/mount_namespace.cpp b/init/mount_namespace.cpp index aa368492d..21750754e 100644 --- a/init/mount_namespace.cpp +++ b/init/mount_namespace.cpp @@ -323,10 +323,20 @@ bool SwitchToBootstrapMountNamespaceIfNeeded() { } if (bootstrap_ns_id != GetMountNamespaceId() && bootstrap_ns_fd.get() != -1 && IsApexUpdatable()) { + // The property service thread and its descendent threads must be in the correct mount + // namespace to call Service::Start(), however setns() only operates on a single thread and + // fails when secondary threads attempt to join the same mount namespace. Therefore, we + // must join the property service thread and its descendents before the setns() call. Those + // threads are then started again after the setns() call, and they'll be in the proper + // namespace. + PausePropertyService(); + if (setns(bootstrap_ns_fd.get(), CLONE_NEWNS) == -1) { PLOG(ERROR) << "Failed to switch to bootstrap mount namespace."; return false; } + + ResumePropertyService(); } return true; } From ba446ce785c35bf5267a96f9cefcd745ca6a6ccd Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Fri, 3 Jan 2020 14:09:41 -0800 Subject: [PATCH 101/388] fsck.f2fs: enable cache Bug: 149418646 Bug: 149844577 Bug: 111241572 Bug: 134988435 Change-Id: I8f5a9701442302339f7b5880133a960e89114b55 Merged-In: I8f5a9701442302339f7b5880133a960e89114b55 Signed-off-by: Jaegeuk Kim --- fs_mgr/fs_mgr.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 7bc455962..65351e95d 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -253,15 +253,19 @@ static void check_fs(const std::string& blk_device, const std::string& fs_type, } } } else if (is_f2fs(fs_type)) { - const char* f2fs_fsck_argv[] = {F2FS_FSCK_BIN, "-a", blk_device.c_str()}; - const char* f2fs_fsck_forced_argv[] = {F2FS_FSCK_BIN, "-f", blk_device.c_str()}; + const char* f2fs_fsck_argv[] = {F2FS_FSCK_BIN, "-a", "-c", "10000", "--debug-cache", + blk_device.c_str()}; + const char* f2fs_fsck_forced_argv[] = { + F2FS_FSCK_BIN, "-f", "-c", "10000", "--debug-cache", blk_device.c_str()}; if (should_force_check(*fs_stat)) { - LINFO << "Running " << F2FS_FSCK_BIN << " -f " << realpath(blk_device); + LINFO << "Running " << F2FS_FSCK_BIN << " -f -c 10000 --debug-cache" + << realpath(blk_device); ret = logwrap_fork_execvp(ARRAY_SIZE(f2fs_fsck_forced_argv), f2fs_fsck_forced_argv, &status, false, LOG_KLOG | LOG_FILE, false, FSCK_LOG_FILE); } else { - LINFO << "Running " << F2FS_FSCK_BIN << " -a " << realpath(blk_device); + LINFO << "Running " << F2FS_FSCK_BIN << " -a -c 10000 --debug-cache" + << realpath(blk_device); ret = logwrap_fork_execvp(ARRAY_SIZE(f2fs_fsck_argv), f2fs_fsck_argv, &status, false, LOG_KLOG | LOG_FILE, false, FSCK_LOG_FILE); } From 9ddc42aa936e8843adc90eba8239b7611e058ab1 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Thu, 27 Feb 2020 14:29:38 -0800 Subject: [PATCH 102/388] adb: don't hardcode ports in test_adb. If we get unlucky and something else (or ourselves, in another thread) beats us to listening on our hardcoded ports, we can deadlock. Bug: http://b/149829737 Test: ./test_adb.py Change-Id: I8f14004a6b2e77366abad6e88786ea8941629020 (cherry picked from commit e8829c6bfcf55d9706d38a875bd5764587ee8e86) --- adb/test_adb.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/adb/test_adb.py b/adb/test_adb.py index 3d6de2665..c872fb0f7 100755 --- a/adb/test_adb.py +++ b/adb/test_adb.py @@ -33,6 +33,11 @@ import time import unittest import warnings +def find_open_port(): + # Find an open port. + with socket.socket() as s: + s.bind(("localhost", 0)) + return s.getsockname()[1] @contextlib.contextmanager def fake_adbd(protocol=socket.AF_INET, port=0): @@ -126,10 +131,7 @@ def adb_server(): This creates an ADB server and returns the port it's listening on. """ - port = 5038 - # Kill any existing server on this non-default port. - subprocess.check_output(["adb", "-P", str(port), "kill-server"], - stderr=subprocess.STDOUT) + port = find_open_port() read_pipe, write_pipe = os.pipe() if sys.platform == "win32": @@ -224,10 +226,7 @@ class ServerTest(unittest.TestCase): # adb server, this also tests whether multiple instances of the adb # server conflict on adb.log. - port = 5038 - # Kill any existing server on this non-default port. - subprocess.check_output(["adb", "-P", str(port), "kill-server"], - stderr=subprocess.STDOUT) + port = find_open_port() try: # We get warnings for unclosed files for the subprocess's pipes, @@ -289,12 +288,8 @@ class ServerTest(unittest.TestCase): """ Tests that the server can start up on ::1 and that it's accessible """ - server_port = 5037 - # Kill any existing server on this non-default port. - subprocess.check_output( - ["adb", "-P", str(server_port), "kill-server"], - stderr=subprocess.STDOUT, - ) + + server_port = find_open_port() try: subprocess.check_output( ["adb", "-L", "tcp:[::1]:{}".format(server_port), "server"], From bbe3385097750842a8d87b9d3d0248c937dcdb97 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 26 Feb 2020 16:39:20 -0800 Subject: [PATCH 103/388] adbd: add runtime-configurable logging. Add some requested logging options that can be turned on at runtime without having to restart adbd. Bug: http://b/141959374 Test: manual Change-Id: Ib97acc6d199e0b91238a6758e18b7cb75f8688d9 (cherry picked from commit 52d0b67f191319e20272d404659ec2f967d2769c) --- adb/Android.bp | 1 + adb/adb.cpp | 6 +++ adb/daemon/logging.cpp | 89 ++++++++++++++++++++++++++++++++++++ adb/daemon/logging.h | 33 +++++++++++++ adb/daemon/services.cpp | 4 +- adb/daemon/shell_service.cpp | 5 +- 6 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 adb/daemon/logging.cpp create mode 100644 adb/daemon/logging.h diff --git a/adb/Android.bp b/adb/Android.bp index af118f47d..a26017fc2 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -375,6 +375,7 @@ cc_library_static { srcs: libadb_srcs + libadb_linux_srcs + libadb_posix_srcs + [ "daemon/auth.cpp", "daemon/jdwp_service.cpp", + "daemon/logging.cpp", "daemon/adb_wifi.cpp", ], diff --git a/adb/adb.cpp b/adb/adb.cpp index 554a754fd..98db19123 100644 --- a/adb/adb.cpp +++ b/adb/adb.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -61,6 +62,8 @@ #include #include using namespace std::chrono_literals; + +#include "daemon/logging.h" #endif std::string adb_version() { @@ -312,6 +315,9 @@ static void handle_new_connection(atransport* t, apacket* p) { #if ADB_HOST handle_online(t); #else + ADB_LOG(Connection) << "received CNXN: version=" << p->msg.arg0 << ", maxdata = " << p->msg.arg1 + << ", banner = '" << banner << "'"; + if (t->use_tls) { // We still handshake in TLS mode. If auth_required is disabled, // we'll just not verify the client's certificate. This should be the diff --git a/adb/daemon/logging.cpp b/adb/daemon/logging.cpp new file mode 100644 index 000000000..203c6c73d --- /dev/null +++ b/adb/daemon/logging.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2020 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 "daemon/logging.h" + +#include +#include +#include + +#include +#include +#include +#include + +#if defined(__ANDROID__) +struct LogStatus { + bool enabled[static_cast(adb::LogType::COUNT)]; + + bool& operator[](adb::LogType type) { return enabled[static_cast(type)]; } +}; + +using android::base::CachedProperty; +using android::base::NoDestructor; + +static NoDestructor log_mutex; +static NoDestructor log_property GUARDED_BY(log_mutex)("debug.adbd.logging"); +static std::optional cached_log_status GUARDED_BY(log_mutex); + +static NoDestructor persist_log_property + GUARDED_BY(log_mutex)("persist.debug.adbd.logging"); +static std::optional cached_persist_log_status GUARDED_BY(log_mutex); + +static LogStatus ParseLogStatus(std::string_view str) { + LogStatus result = {}; + for (const auto& part : android::base::Split(std::string(str), ",")) { + if (part == "cnxn") { + result[adb::LogType::Connection] = true; + } else if (part == "service") { + result[adb::LogType::Service] = true; + } else if (part == "shell") { + result[adb::LogType::Shell] = true; + } else if (part == "all") { + result[adb::LogType::Connection] = true; + result[adb::LogType::Service] = true; + result[adb::LogType::Shell] = true; + } + } + return result; +} + +static LogStatus GetLogStatus(android::base::CachedProperty* property, + std::optional* cached_status) REQUIRES(log_mutex) { + bool changed; + const char* value = property->Get(&changed); + if (changed || !*cached_status) { + **cached_status = ParseLogStatus(value); + } + return **cached_status; +} + +namespace adb { +bool is_logging_enabled(LogType type) { + std::lock_guard lock(*log_mutex); + return GetLogStatus(log_property.get(), &cached_log_status)[type] || + GetLogStatus(persist_log_property.get(), &cached_persist_log_status)[type]; +} +} // namespace adb + +#else + +namespace adb { +bool is_logging_enabled(LogType type) { + return false; +} +} // namespace adb +#endif diff --git a/adb/daemon/logging.h b/adb/daemon/logging.h new file mode 100644 index 000000000..3e28bef31 --- /dev/null +++ b/adb/daemon/logging.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2007 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 + +namespace adb { +enum class LogType { + Connection, + Service, + Shell, + COUNT, +}; + +bool is_logging_enabled(LogType type); + +#define ADB_LOG(type) ::adb::is_logging_enabled(::adb::LogType::type) && LOG(INFO) + +} // namespace adb diff --git a/adb/daemon/services.cpp b/adb/daemon/services.cpp index 4ec90d27c..6bbf66e8e 100644 --- a/adb/daemon/services.cpp +++ b/adb/daemon/services.cpp @@ -54,10 +54,10 @@ #include "daemon/file_sync_service.h" #include "daemon/framebuffer_service.h" +#include "daemon/logging.h" #include "daemon/restart_service.h" #include "daemon/shell_service.h" - void reconnect_service(unique_fd fd, atransport* t) { WriteFdExactly(fd.get(), "done"); kick_transport(t); @@ -259,6 +259,8 @@ asocket* daemon_service_to_socket(std::string_view name) { } unique_fd daemon_service_to_fd(std::string_view name, atransport* transport) { + ADB_LOG(Service) << "transport " << transport->serial_name() << " opening service " << name; + #if defined(__ANDROID__) && !defined(__ANDROID_RECOVERY__) if (name.starts_with("abb:") || name.starts_with("abb_exec:")) { return execute_abb_command(name); diff --git a/adb/daemon/shell_service.cpp b/adb/daemon/shell_service.cpp index f62032d06..fbfae1e44 100644 --- a/adb/daemon/shell_service.cpp +++ b/adb/daemon/shell_service.cpp @@ -107,6 +107,7 @@ #include "adb_trace.h" #include "adb_unique_fd.h" #include "adb_utils.h" +#include "daemon/logging.h" #include "security_log_tags.h" #include "shell_protocol.h" @@ -760,14 +761,14 @@ void Subprocess::WaitForExit() { D("post waitpid (pid=%d) status=%04x", pid_, status); if (WIFSIGNALED(status)) { exit_code = 0x80 | WTERMSIG(status); - D("subprocess killed by signal %d", WTERMSIG(status)); + ADB_LOG(Shell) << "subprocess " << pid_ << " killed by signal " << WTERMSIG(status); break; } else if (!WIFEXITED(status)) { D("subprocess didn't exit"); break; } else if (WEXITSTATUS(status) >= 0) { exit_code = WEXITSTATUS(status); - D("subprocess exit code = %d", WEXITSTATUS(status)); + ADB_LOG(Shell) << "subprocess " << pid_ << " exited with status " << exit_code; break; } } From 34da2061d4e7da874512a50387f0620604cd28c0 Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Thu, 27 Feb 2020 11:28:45 -0800 Subject: [PATCH 104/388] fs_mgr: remain elapsed time of fsck in prop Bug: 149595111 Bug: 149844577 Bug: 138909685 Signed-off-by: Jaegeuk Kim Change-Id: I8f11ca2680558dc54efd6788ee0dd56e5d65a356 Merged-In: I8f11ca2680558dc54efd6788ee0dd56e5d65a356 --- fs_mgr/fs_mgr.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 7bc455962..f430fdc98 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -97,6 +97,7 @@ using android::base::Basename; using android::base::GetBoolProperty; using android::base::Realpath; +using android::base::SetProperty; using android::base::StartsWith; using android::base::Timer; using android::base::unique_fd; @@ -178,6 +179,7 @@ static void check_fs(const std::string& blk_device, const std::string& fs_type, return; } + Timer t; /* Check for the types of filesystems we know how to check */ if (is_extfs(fs_type)) { /* @@ -270,7 +272,8 @@ static void check_fs(const std::string& blk_device, const std::string& fs_type, LERROR << "Failed trying to run " << F2FS_FSCK_BIN; } } - + android::base::SetProperty("ro.boottime.init.fsck." + Basename(target), + std::to_string(t.duration().count())); return; } From d9684d5943e1bf1c97dad62133c34f9ae3d829b6 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 28 Feb 2020 14:31:27 -0800 Subject: [PATCH 105/388] Reland "adb: daemon: Assign valid fd to usb_handle ep0 file descriptor" This reverts commit ba4684c2b2bc952748ebbe176b292a6d263e4dc8. Bug: http://b/129283234 Test: manually unplugged/replugged Change-Id: I9c8cfebe09b2855cab986068273a835a13247b77 (cherry picked from commit bfe3dac36d43208bb23aac56b0f156b8892d9d13) --- adb/daemon/usb_ffs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adb/daemon/usb_ffs.cpp b/adb/daemon/usb_ffs.cpp index b19fa5d58..cb7e2fb88 100644 --- a/adb/daemon/usb_ffs.cpp +++ b/adb/daemon/usb_ffs.cpp @@ -299,6 +299,7 @@ bool open_functionfs(android::base::unique_fd* out_control, android::base::uniqu } // Signal only when writing the descriptors to ffs android::base::SetProperty("sys.usb.ffs.ready", "1"); + *out_control = std::move(control); } bulk_out.reset(adb_open(USB_FFS_ADB_OUT, O_RDONLY)); @@ -313,7 +314,6 @@ bool open_functionfs(android::base::unique_fd* out_control, android::base::uniqu return false; } - *out_control = std::move(control); *out_bulk_in = std::move(bulk_in); *out_bulk_out = std::move(bulk_out); return true; From 1e18ac38da160313e9bca640045299f59be68c5d Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 28 Feb 2020 14:53:56 -0800 Subject: [PATCH 106/388] Reland "adb: turn CHECKs into an error + transport restart." This reverts commit 2547f740ea132d8fcf26dd02ae5cc58e13c50a33. Bug: http://b/134695864 Bug: http://b/133872605 Test: manually unplugged/replugged Change-Id: Ic2af40b81354138a7842eb93aacc303885ac952e (cherry picked from commit 7b3048446da533eee295930002c82eae6511512f) --- adb/daemon/usb.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp index ff97a6f05..87937fb6a 100644 --- a/adb/daemon/usb.cpp +++ b/adb/daemon/usb.cpp @@ -528,14 +528,16 @@ struct UsbFfsConnection : public Connection { } if (id.direction == TransferDirection::READ) { - HandleRead(id, event.res); + if (!HandleRead(id, event.res)) { + return; + } } else { HandleWrite(id); } } } - void HandleRead(TransferId id, int64_t size) { + bool HandleRead(TransferId id, int64_t size) { uint64_t read_idx = id.id % kUsbReadQueueDepth; IoReadBlock* block = &read_requests_[read_idx]; block->pending = false; @@ -545,7 +547,7 @@ struct UsbFfsConnection : public Connection { if (block->id().id != needed_read_id_) { LOG(VERBOSE) << "read " << block->id().id << " completed while waiting for " << needed_read_id_; - return; + return true; } for (uint64_t id = needed_read_id_;; ++id) { @@ -554,15 +556,22 @@ struct UsbFfsConnection : public Connection { if (current_block->pending) { break; } - ProcessRead(current_block); + if (!ProcessRead(current_block)) { + return false; + } ++needed_read_id_; } + + return true; } - void ProcessRead(IoReadBlock* block) { + bool ProcessRead(IoReadBlock* block) { if (!block->payload.empty()) { if (!incoming_header_.has_value()) { - CHECK_EQ(sizeof(amessage), block->payload.size()); + if (block->payload.size() != sizeof(amessage)) { + HandleError("received packet of unexpected length while reading header"); + return false; + } amessage& msg = incoming_header_.emplace(); memcpy(&msg, block->payload.data(), sizeof(msg)); LOG(DEBUG) << "USB read:" << dump_header(&msg); @@ -570,7 +579,10 @@ struct UsbFfsConnection : public Connection { } else { size_t bytes_left = incoming_header_->data_length - incoming_payload_.size(); Block payload = std::move(block->payload); - CHECK_LE(payload.size(), bytes_left); + if (block->payload.size() > bytes_left) { + HandleError("received too many bytes while waiting for payload"); + return false; + } incoming_payload_.append(std::move(payload)); } @@ -593,6 +605,7 @@ struct UsbFfsConnection : public Connection { PrepareReadBlock(block, block->id().id + kUsbReadQueueDepth); SubmitRead(block); + return true; } bool SubmitRead(IoReadBlock* block) { From 3d79b37a41a01d223140831831bd214b283b1e33 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 3 Mar 2020 16:12:09 +0900 Subject: [PATCH 107/388] Fixed a typo in the version name Bug: 149569129 Test: m Change-Id: I7401e8c092d4ee329fb1b5f23b7797f706b58faa --- liblog/liblog.map.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liblog/liblog.map.txt b/liblog/liblog.map.txt index 198cdae21..9dcbbc938 100644 --- a/liblog/liblog.map.txt +++ b/liblog/liblog.map.txt @@ -65,7 +65,7 @@ LIBLOG_Q { # introduced=29 android_log_parser_reset; # llndk }; -LIGLOG_R { # introduced=30 +LIBLOG_R { # introduced=30 global: __android_log_call_aborter; __android_log_default_aborter; From 6c889bb9cb9f5146da4c323de0368f3f1609dea0 Mon Sep 17 00:00:00 2001 From: Hridya Valsaraju Date: Mon, 2 Mar 2020 13:03:47 -0800 Subject: [PATCH 108/388] fastbootd: use FastbootDevice::GetCurrentSlot to get current slot suffix Using FastbootDevice::GetCurrentSlot to get the current slot suffix instead of reading the same from the device's boot control HAL is required to account for the prior set_active commands issued via fastbootd in the same boot. Test: fuzzy_fastboot --gtest_filter=Conformance.Slots:Conformance.SetActive --gtest_repeat=10 Bug: 146589281 Change-Id: I2edb0f024d93c2483659623423ef5c69c717c7af Merged-In: I2edb0f024d93c2483659623423ef5c69c717c7af --- fastboot/device/commands.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp index 2c9dec9fc..ca120c62a 100644 --- a/fastboot/device/commands.cpp +++ b/fastboot/device/commands.cpp @@ -261,7 +261,7 @@ bool SetActiveHandler(FastbootDevice* device, const std::vector& ar } // If the slot is not changing, do nothing. - if (slot == boot_control_hal->getCurrentSlot()) { + if (args[1] == device->GetCurrentSlot()) { return device->WriteOkay(""); } From 44ae546061a07a0664a942b22c560413414b5e3f Mon Sep 17 00:00:00 2001 From: David Anderson Date: Wed, 26 Feb 2020 14:59:08 -0800 Subject: [PATCH 109/388] libdm: Fix WaitForFile early-returning on failed accesses. WaitForFile/WaitForDeletedFile both early return true if an error like EPERM occurs. This was intentional because the code was modeled off earlier fs_mgr code, but it makes libdm inherently racy if sepolicy is not configured correctly. It's better to have these result in explicit and consistent failures. Bug: 148103327 Test: fastboot flashall Change-Id: I0c78818962e1db91b556e523c418db28f7d78fae Merged-In: I0c78818962e1db91b556e523c418db28f7d78fae --- fs_mgr/libdm/dm.cpp | 4 ++-- fs_mgr/libdm/utility.cpp | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/fs_mgr/libdm/dm.cpp b/fs_mgr/libdm/dm.cpp index 254fbed24..673e145f1 100644 --- a/fs_mgr/libdm/dm.cpp +++ b/fs_mgr/libdm/dm.cpp @@ -120,7 +120,7 @@ bool DeviceMapper::DeleteDevice(const std::string& name, return false; } if (!WaitForFileDeleted(unique_path, timeout_ms)) { - LOG(ERROR) << "Timeout out waiting for " << unique_path << " to be deleted"; + LOG(ERROR) << "Failed waiting for " << unique_path << " to be deleted"; return false; } return true; @@ -161,7 +161,7 @@ bool DeviceMapper::CreateDevice(const std::string& name, const DmTable& table, s return true; } if (!WaitForFile(unique_path, timeout_ms)) { - LOG(ERROR) << "Timed out waiting for device path: " << unique_path; + LOG(ERROR) << "Failed waiting for device path: " << unique_path; DeleteDevice(name); return false; } diff --git a/fs_mgr/libdm/utility.cpp b/fs_mgr/libdm/utility.cpp index f252565fd..0eb59ab49 100644 --- a/fs_mgr/libdm/utility.cpp +++ b/fs_mgr/libdm/utility.cpp @@ -19,6 +19,8 @@ #include +#include + using namespace std::literals; namespace android { @@ -45,7 +47,11 @@ bool WaitForFile(const std::string& path, const std::chrono::milliseconds& timeo // If the file exists but returns EPERM or something, we consider the // condition met. if (access(path.c_str(), F_OK) != 0) { - if (errno == ENOENT) return WaitResult::Wait; + if (errno == ENOENT) { + return WaitResult::Wait; + } + PLOG(ERROR) << "access failed: " << path; + return WaitResult::Fail; } return WaitResult::Done; }; @@ -54,9 +60,13 @@ bool WaitForFile(const std::string& path, const std::chrono::milliseconds& timeo bool WaitForFileDeleted(const std::string& path, const std::chrono::milliseconds& timeout_ms) { auto condition = [&]() -> WaitResult { - if (access(path.c_str(), F_OK) == 0 || errno != ENOENT) { + if (access(path.c_str(), F_OK) == 0) { return WaitResult::Wait; } + if (errno != ENOENT) { + PLOG(ERROR) << "access failed: " << path; + return WaitResult::Fail; + } return WaitResult::Done; }; return WaitForCondition(condition, timeout_ms); From 026adf0864f5971967caada56f079661ecb44139 Mon Sep 17 00:00:00 2001 From: Howard Chen Date: Tue, 25 Feb 2020 16:31:10 +0800 Subject: [PATCH 110/388] Refine the exported DSU status The new exported DSU status removes the need to make blocking binder calls out of system server during device boot. Bug: 149790245 Bug: 149716497 Test: adb shell am start-activity \ -n com.android.dynsystem/com.android.dynsystem.VerificationActivity \ -a android.os.image.action.START_INSTALL \ -d file:///storage/emulated/0/Download/system.raw.gz \ --el KEY_SYSTEM_SIZE $(du -b system.raw|cut -f1) \ --el KEY_USERDATA_SIZE 8589934592 Change-Id: I27fae316214498407a73474ca8b93aec3518e4b5 Merged-In: I27fae316214498407a73474ca8b93aec3518e4b5 (cherry picked from commit 2e1c6b26a1fe4799b830c2a6d536afd44c718491) --- init/init.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/init/init.cpp b/init/init.cpp index 5bf1b36c9..2d2cf9a84 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -723,11 +723,10 @@ int SecondStageMain(int argc, char** argv) { if (false) DumpState(); // Make the GSI status available before scripts start running. - if (android::gsi::IsGsiRunning()) { - SetProperty("ro.gsid.image_running", "1"); - } else { - SetProperty("ro.gsid.image_running", "0"); - } + auto is_running = android::gsi::IsGsiRunning() ? "1" : "0"; + SetProperty(gsi::kGsiBootedProp, is_running); + auto is_installed = android::gsi::IsGsiInstalled() ? "1" : "0"; + SetProperty(gsi::kGsiInstalledProp, is_installed); am.QueueBuiltinAction(SetupCgroupsAction, "SetupCgroups"); am.QueueBuiltinAction(SetKptrRestrictAction, "SetKptrRestrict"); From 70b6a956194b5623b55a06fe5e73b928c7af37c3 Mon Sep 17 00:00:00 2001 From: Automerger Merge Worker Date: Thu, 5 Mar 2020 10:18:24 +0000 Subject: [PATCH 111/388] Fix /data_mirror permission Test: Able to boot without error Bug: 150671726 Merged-In: If366d284f4f01ebfa660e85bad57861c120ada7e Change-Id: I9d85c00d191dcaa46c0182b5a15cd89dcdb9ea5e (cherry picked from commit 1a5ae50943d84318cd01ec15099fac70c42e0824) --- rootdir/init.rc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rootdir/init.rc b/rootdir/init.rc index ae9d6953c..c59f911c1 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -701,9 +701,7 @@ on post-fs-data # A tmpfs directory, which will contain all apps CE DE data directory that # bind mount from the original source. - chown root root /data_mirror - chmod 0700 /data_mirror - mount tmpfs tmpfs /data_mirror mode=0700,uid=0,gid=1000 nodev noexec nosuid + mount tmpfs tmpfs /data_mirror nodev noexec nosuid mode=0700,uid=0,gid=1000 restorecon /data_mirror mkdir /data_mirror/data_ce 0700 root root mkdir /data_mirror/data_de 0700 root root From 65ceecfec66ad57f241243806dedfd4d2a5238ae Mon Sep 17 00:00:00 2001 From: Alessio Balsini Date: Wed, 26 Feb 2020 21:49:25 +0000 Subject: [PATCH 112/388] libsnapshot/test: Re-enable the failing tests Some tests were temporarily disabled due to errors in Cuttlefish. Now that the issues were fixed, the tests can be put back in presubmit. Bug: 148889015 Test: vts_libsnapshot_test (Cuttlefish + Pixel 4) Signed-off-by: Alessio Balsini Change-Id: Idcb2b7831b2183b2d734bdf8821fd34746f2beee Merged-In: Idcb2b7831b2183b2d734bdf8821fd34746f2beee --- fs_mgr/TEST_MAPPING | 2 +- fs_mgr/libsnapshot/Android.bp | 8 -------- fs_mgr/libsnapshot/snapshot_test.cpp | 18 ------------------ 3 files changed, 1 insertion(+), 27 deletions(-) diff --git a/fs_mgr/TEST_MAPPING b/fs_mgr/TEST_MAPPING index 705d4e313..676f446e7 100644 --- a/fs_mgr/TEST_MAPPING +++ b/fs_mgr/TEST_MAPPING @@ -13,7 +13,7 @@ "name": "fiemap_writer_test" }, { - "name": "vts_libsnapshot_test_presubmit" + "name": "vts_libsnapshot_test" } ] } diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp index 2d6261731..6c739fc19 100644 --- a/fs_mgr/libsnapshot/Android.bp +++ b/fs_mgr/libsnapshot/Android.bp @@ -208,14 +208,6 @@ cc_test { defaults: ["libsnapshot_test_defaults"], } -cc_test { - name: "vts_libsnapshot_test_presubmit", - defaults: ["libsnapshot_test_defaults"], - cppflags: [ - "-DSKIP_TEST_IN_PRESUBMIT", - ], -} - cc_binary { name: "snapshotctl", srcs: [ diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp index 5d2840f99..0ffaa71ba 100644 --- a/fs_mgr/libsnapshot/snapshot_test.cpp +++ b/fs_mgr/libsnapshot/snapshot_test.cpp @@ -506,9 +506,6 @@ TEST_F(SnapshotTest, Merge) { } TEST_F(SnapshotTest, FirstStageMountAndMerge) { -#ifdef SKIP_TEST_IN_PRESUBMIT - GTEST_SKIP() << "WIP failure b/148889015"; -#endif ASSERT_TRUE(AcquireLock()); static const uint64_t kDeviceSize = 1024 * 1024; @@ -565,9 +562,6 @@ TEST_F(SnapshotTest, FlashSuperDuringUpdate) { } TEST_F(SnapshotTest, FlashSuperDuringMerge) { -#ifdef SKIP_TEST_IN_PRESUBMIT - GTEST_SKIP() << "WIP failure b/148889015"; -#endif ASSERT_TRUE(AcquireLock()); static const uint64_t kDeviceSize = 1024 * 1024; @@ -979,9 +973,6 @@ class SnapshotUpdateTest : public SnapshotTest { // Also test UnmapUpdateSnapshot unmaps everything. // Also test first stage mount and merge after this. TEST_F(SnapshotUpdateTest, FullUpdateFlow) { -#ifdef SKIP_TEST_IN_PRESUBMIT - GTEST_SKIP() << "WIP failure b/148889015"; -#endif // OTA client blindly unmaps all partitions that are possibly mapped. for (const auto& name : {"sys_b", "vnd_b", "prd_b"}) { ASSERT_TRUE(sm->UnmapUpdateSnapshot(name)); @@ -1129,9 +1120,6 @@ TEST_F(SnapshotUpdateTest, SnapshotStatusFileWithoutCow) { // Test that the old partitions are not modified. TEST_F(SnapshotUpdateTest, TestRollback) { -#ifdef SKIP_TEST_IN_PRESUBMIT - GTEST_SKIP() << "WIP failure b/148889015"; -#endif // Execute the update. ASSERT_TRUE(sm->BeginUpdate()); ASSERT_TRUE(sm->UnmapUpdateSnapshot("sys_b")); @@ -1309,9 +1297,6 @@ TEST_F(SnapshotUpdateTest, RetrofitAfterRegularAb) { } TEST_F(SnapshotUpdateTest, MergeCannotRemoveCow) { -#ifdef SKIP_TEST_IN_PRESUBMIT - GTEST_SKIP() << "WIP failure b/148889015"; -#endif // Make source partitions as big as possible to force COW image to be created. SetSize(sys_, 5_MiB); SetSize(vnd_, 5_MiB); @@ -1586,9 +1571,6 @@ TEST_F(SnapshotUpdateTest, Overflow) { } TEST_F(SnapshotUpdateTest, WaitForMerge) { -#ifdef SKIP_TEST_IN_PRESUBMIT - GTEST_SKIP() << "WIP failure b/148889015"; -#endif AddOperationForPartitions(); // Execute the update. From c6411c2d37b2451948c5376e05ed60f347836648 Mon Sep 17 00:00:00 2001 From: Alessio Balsini Date: Tue, 21 Jan 2020 18:38:34 +0000 Subject: [PATCH 113/388] snapshotctl: init reports merge statistics Enable the --report flag in init rc script to collect and send snapshot merge statistics after OTA. Bug: 138817833 Test: statsd_testdrive Change-Id: Ie32a2c6d7d1671ca2b1846c6a8d33cea2ab22a4c Signed-off-by: Alessio Balsini Merged-In: Ie32a2c6d7d1671ca2b1846c6a8d33cea2ab22a4c --- fs_mgr/libsnapshot/snapshotctl.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs_mgr/libsnapshot/snapshotctl.rc b/fs_mgr/libsnapshot/snapshotctl.rc index 5dbe35255..ccb2c410b 100644 --- a/fs_mgr/libsnapshot/snapshotctl.rc +++ b/fs_mgr/libsnapshot/snapshotctl.rc @@ -1,2 +1,2 @@ on property:sys.boot_completed=1 - exec_background - root root -- /system/bin/snapshotctl merge --logcat --log-to-file + exec_background - root root -- /system/bin/snapshotctl merge --logcat --log-to-file --report From 91ffe19c4e3c6b36d98fdcad44e0dd7666c9dea9 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 18 Feb 2020 13:47:26 -0800 Subject: [PATCH 114/388] snapshotctl don't auto-merge. update_engine is now responsible for initiating the merge. snapshotctl becomes a debugging tool for libsnapshot now. Bug: 147696014 Test: libsnapshot_test Change-Id: Ia2527a35e0c0f0789dbe5c477e174663ef406903 Merged-In: Ia2527a35e0c0f0789dbe5c477e174663ef406903 --- CleanSpec.mk | 1 + fs_mgr/libsnapshot/Android.bp | 3 --- fs_mgr/libsnapshot/snapshotctl.cpp | 1 + fs_mgr/libsnapshot/snapshotctl.rc | 2 -- 4 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 fs_mgr/libsnapshot/snapshotctl.rc diff --git a/CleanSpec.mk b/CleanSpec.mk index c84bd24c4..0a534a2bd 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -90,3 +90,4 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/product_services) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/debug_ramdisk/product_services) $(call add-clean-step, find $(PRODUCT_OUT) -type l -name "charger" -print0 | xargs -0 rm -f) $(call add-clean-step, rm -f $(PRODUCT_OUT)/system/bin/adbd) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/snapshotctl.rc) diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp index 6c739fc19..0a0a21ddb 100644 --- a/fs_mgr/libsnapshot/Android.bp +++ b/fs_mgr/libsnapshot/Android.bp @@ -235,7 +235,4 @@ cc_binary { // TODO(b/148818798): remove when parent bug is fixed. "libutilscallstack", ], - init_rc: [ - "snapshotctl.rc", - ], } diff --git a/fs_mgr/libsnapshot/snapshotctl.cpp b/fs_mgr/libsnapshot/snapshotctl.cpp index 34d3d69d1..4670eeea0 100644 --- a/fs_mgr/libsnapshot/snapshotctl.cpp +++ b/fs_mgr/libsnapshot/snapshotctl.cpp @@ -178,6 +178,7 @@ bool MergeCmdHandler(int argc, char** argv) { } LOG(ERROR) << "Snapshot failed to merge with state \"" << state << "\"."; + return false; } diff --git a/fs_mgr/libsnapshot/snapshotctl.rc b/fs_mgr/libsnapshot/snapshotctl.rc deleted file mode 100644 index ccb2c410b..000000000 --- a/fs_mgr/libsnapshot/snapshotctl.rc +++ /dev/null @@ -1,2 +0,0 @@ -on property:sys.boot_completed=1 - exec_background - root root -- /system/bin/snapshotctl merge --logcat --log-to-file --report From 83fe0a3572bd4f9385a34e2e6b02de5fbbf2eeab Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 18 Feb 2020 15:04:28 -0800 Subject: [PATCH 115/388] libsnapshot: Add prolog to RemoveAllUpdateStates. Add an optional prolog arg (function) that is invoked before snapshots are deleted and update state set to none. This allows update_engine to delete markers before deleting snapshots to avoid depending on the erroneous markers. Otherwise, if update_engine delete markers after libsnapshot deletes update states, the device could technically get into a state where update_engine thinks the update has been applied, but snapshots are gone. Bug: 147696014 Test: libsnapshot_test Change-Id: I71bfc04a81ea4f94b3072558be50d2f80565113e Merged-In: I71bfc04a81ea4f94b3072558be50d2f80565113e --- .../include/libsnapshot/snapshot.h | 14 ++++---- fs_mgr/libsnapshot/snapshot.cpp | 35 ++++++++++++------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index b440c7190..e2699f289 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -169,7 +169,8 @@ class SnapshotManager final { // // The optional callback allows the caller to periodically check the // progress with GetUpdateState(). - UpdateState ProcessUpdateState(const std::function& callback = {}); + UpdateState ProcessUpdateState(const std::function& callback = {}, + const std::function& before_cancel = {}); public: // Initiate the merge if necessary, then wait for the merge to finish. @@ -179,7 +180,8 @@ class SnapshotManager final { // - Unverified if called on the source slot // - MergeCompleted if merge is completed // - other states indicating an error has occurred - UpdateState InitiateMergeAndWait(SnapshotMergeReport* report = nullptr); + UpdateState InitiateMergeAndWait(SnapshotMergeReport* report = nullptr, + const std::function& before_cancel = {}); // Wait for the merge if rebooted into the new slot. Does NOT initiate a // merge. If the merge has not been initiated (but should be), wait. @@ -375,14 +377,14 @@ class SnapshotManager final { // Check for a cancelled or rolled back merge, returning true if such a // condition was detected and handled. - bool HandleCancelledUpdate(LockedFile* lock); + bool HandleCancelledUpdate(LockedFile* lock, const std::function& before_cancel); // Helper for HandleCancelledUpdate. Assumes booting from new slot. bool AreAllSnapshotsCancelled(LockedFile* lock); // Remove artifacts created by the update process, such as snapshots, and // set the update state to None. - bool RemoveAllUpdateState(LockedFile* lock); + bool RemoveAllUpdateState(LockedFile* lock, const std::function& prolog = {}); // Interact with /metadata/ota. std::unique_ptr OpenLock(int lock_flags); @@ -437,8 +439,8 @@ class SnapshotManager final { // UpdateState::MergeCompleted // UpdateState::MergeFailed // UpdateState::MergeNeedsReboot - UpdateState CheckMergeState(); - UpdateState CheckMergeState(LockedFile* lock); + UpdateState CheckMergeState(const std::function& before_cancel); + UpdateState CheckMergeState(LockedFile* lock, const std::function& before_cancel); UpdateState CheckTargetMergeState(LockedFile* lock, const std::string& name); // Interact with status files under /metadata/ota/snapshots. diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 2fe06fb22..b3aa9f0d5 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -219,7 +219,12 @@ static bool RemoveFileIfExists(const std::string& path) { return true; } -bool SnapshotManager::RemoveAllUpdateState(LockedFile* lock) { +bool SnapshotManager::RemoveAllUpdateState(LockedFile* lock, const std::function& prolog) { + if (prolog && !prolog()) { + LOG(WARNING) << "Can't RemoveAllUpdateState: prolog failed."; + return false; + } + LOG(INFO) << "Removing all update state."; #ifdef LIBSNAPSHOT_USE_CALLSTACK @@ -789,9 +794,10 @@ bool SnapshotManager::QuerySnapshotStatus(const std::string& dm_name, std::strin // Note that when a merge fails, we will *always* try again to complete the // merge each time the device boots. There is no harm in doing so, and if // the problem was transient, we might manage to get a new outcome. -UpdateState SnapshotManager::ProcessUpdateState(const std::function& callback) { +UpdateState SnapshotManager::ProcessUpdateState(const std::function& callback, + const std::function& before_cancel) { while (true) { - UpdateState state = CheckMergeState(); + UpdateState state = CheckMergeState(before_cancel); if (state == UpdateState::MergeFailed) { AcknowledgeMergeFailure(); } @@ -811,24 +817,25 @@ UpdateState SnapshotManager::ProcessUpdateState(const std::function& cal } } -UpdateState SnapshotManager::CheckMergeState() { +UpdateState SnapshotManager::CheckMergeState(const std::function& before_cancel) { auto lock = LockExclusive(); if (!lock) { return UpdateState::MergeFailed; } - UpdateState state = CheckMergeState(lock.get()); + UpdateState state = CheckMergeState(lock.get(), before_cancel); if (state == UpdateState::MergeCompleted) { // Do this inside the same lock. Failures get acknowledged without the // lock, because flock() might have failed. AcknowledgeMergeSuccess(lock.get()); } else if (state == UpdateState::Cancelled) { - RemoveAllUpdateState(lock.get()); + RemoveAllUpdateState(lock.get(), before_cancel); } return state; } -UpdateState SnapshotManager::CheckMergeState(LockedFile* lock) { +UpdateState SnapshotManager::CheckMergeState(LockedFile* lock, + const std::function& before_cancel) { UpdateState state = ReadUpdateState(lock); switch (state) { case UpdateState::None: @@ -849,7 +856,7 @@ UpdateState SnapshotManager::CheckMergeState(LockedFile* lock) { // This is an edge case. Normally cancelled updates are detected // via the merge poll below, but if we never started a merge, we // need to also check here. - if (HandleCancelledUpdate(lock)) { + if (HandleCancelledUpdate(lock, before_cancel)) { return UpdateState::Cancelled; } return state; @@ -1169,7 +1176,8 @@ bool SnapshotManager::CollapseSnapshotDevice(const std::string& name, return true; } -bool SnapshotManager::HandleCancelledUpdate(LockedFile* lock) { +bool SnapshotManager::HandleCancelledUpdate(LockedFile* lock, + const std::function& before_cancel) { auto slot = GetCurrentSlot(); if (slot == Slot::Unknown) { return false; @@ -1177,7 +1185,7 @@ bool SnapshotManager::HandleCancelledUpdate(LockedFile* lock) { // If all snapshots were reflashed, then cancel the entire update. if (AreAllSnapshotsCancelled(lock)) { - RemoveAllUpdateState(lock); + RemoveAllUpdateState(lock, before_cancel); return true; } @@ -2388,7 +2396,8 @@ std::unique_ptr SnapshotManager::EnsureMetadataMounted() { return AutoUnmountDevice::New(device_->GetMetadataDir()); } -UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_report) { +UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_report, + const std::function& before_cancel) { { auto lock = LockExclusive(); // Sync update state from file with bootloader. @@ -2413,7 +2422,7 @@ UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_rep LOG(INFO) << "Waiting for any previous merge request to complete. " << "This can take up to several minutes."; merge_stats.Resume(); - auto state = ProcessUpdateState(callback); + auto state = ProcessUpdateState(callback, before_cancel); merge_stats.set_state(state); if (state == UpdateState::None) { LOG(INFO) << "Can't find any snapshot to merge."; @@ -2436,7 +2445,7 @@ UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_rep // All other states can be handled by ProcessUpdateState. LOG(INFO) << "Waiting for merge to complete. This can take up to several minutes."; last_progress = 0; - state = ProcessUpdateState(callback); + state = ProcessUpdateState(callback, before_cancel); merge_stats.set_state(state); } From f6d4e74bc60736c22e452983ba5a4ca0a74ca150 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Wed, 19 Feb 2020 17:45:49 -0800 Subject: [PATCH 116/388] libsnapshot: Re-expose InitiateMerge and ProcessUpdateState These functions are used directly in update_engine now that it is responsible for initiating the merge. update_engine has its own message loop, so WaitForMerge / InitiateMergeAndWait becomes useless and are deprecated. Bug: 147696014 Test: compiles Change-Id: Id8cb14f5f18b4893e2fc3d0d2b374a867a220e6f Merged-In: Id8cb14f5f18b4893e2fc3d0d2b374a867a220e6f --- fs_mgr/libsnapshot/include/libsnapshot/snapshot.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index e2699f289..c8cbb1e7a 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -140,7 +140,6 @@ class SnapshotManager final { // Before calling this function, all snapshots must be mapped. bool FinishedSnapshotWrites(); - private: // Initiate a merge on all snapshot devices. This should only be used after an // update has been marked successful after booting. bool InitiateMerge(); @@ -172,7 +171,6 @@ class SnapshotManager final { UpdateState ProcessUpdateState(const std::function& callback = {}, const std::function& before_cancel = {}); - public: // Initiate the merge if necessary, then wait for the merge to finish. // See InitiateMerge() and ProcessUpdateState() for details. // Returns: From ef9e44ae78b4e65a2ced2e3cf0617ce1280fda25 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Wed, 19 Feb 2020 13:14:05 -0800 Subject: [PATCH 117/388] Allow ProcessUpdateState to be paused. Change callback type of ProcessUpdateState to bool() so that, when callback returns false, immediately returns Merging. Test: libsnapshot_test Bug: 147696014 Change-Id: I9dcb8e1658b95216c0f1991e2e4c1ea2e7e7b2e5 Merged-In: I9dcb8e1658b95216c0f1991e2e4c1ea2e7e7b2e5 --- fs_mgr/libsnapshot/include/libsnapshot/snapshot.h | 8 ++++++-- fs_mgr/libsnapshot/snapshot.cpp | 14 +++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index c8cbb1e7a..72f1d91de 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -148,7 +148,11 @@ class SnapshotManager final { // /data is mounted. // // If a merge is in progress, this function will block until the merge is - // completed. If a merge or update was cancelled, this will clean up any + // completed. + // - Callback is called periodically during the merge. If callback() + // returns false during the merge, ProcessUpdateState() will pause + // and returns Merging. + // If a merge or update was cancelled, this will clean up any // update artifacts and return. // // Note that after calling this, GetUpdateState() may still return that a @@ -168,7 +172,7 @@ class SnapshotManager final { // // The optional callback allows the caller to periodically check the // progress with GetUpdateState(). - UpdateState ProcessUpdateState(const std::function& callback = {}, + UpdateState ProcessUpdateState(const std::function& callback = {}, const std::function& before_cancel = {}); // Initiate the merge if necessary, then wait for the merge to finish. diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index b3aa9f0d5..7a4f3dcad 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -794,7 +794,7 @@ bool SnapshotManager::QuerySnapshotStatus(const std::string& dm_name, std::strin // Note that when a merge fails, we will *always* try again to complete the // merge each time the device boots. There is no harm in doing so, and if // the problem was transient, we might manage to get a new outcome. -UpdateState SnapshotManager::ProcessUpdateState(const std::function& callback, +UpdateState SnapshotManager::ProcessUpdateState(const std::function& callback, const std::function& before_cancel) { while (true) { UpdateState state = CheckMergeState(before_cancel); @@ -807,8 +807,8 @@ UpdateState SnapshotManager::ProcessUpdateState(const std::function& cal return state; } - if (callback) { - callback(); + if (callback && !callback()) { + return state; } // This wait is not super time sensitive, so we have a relatively @@ -2410,13 +2410,14 @@ UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_rep SnapshotMergeStats merge_stats(*this); unsigned int last_progress = 0; - auto callback = [&]() -> void { + auto callback = [&]() -> bool { double progress; GetUpdateState(&progress); if (last_progress < static_cast(progress)) { last_progress = progress; LOG(INFO) << "Waiting for merge to complete: " << last_progress << "%."; } + return true; // continue }; LOG(INFO) << "Waiting for any previous merge request to complete. " @@ -2512,7 +2513,10 @@ bool SnapshotManager::HandleImminentDataWipe(const std::function& callba return false; } - UpdateState state = ProcessUpdateState(callback); + UpdateState state = ProcessUpdateState([&]() -> bool { + callback(); + return true; + }); LOG(INFO) << "Update state in recovery: " << state; switch (state) { case UpdateState::MergeFailed: From 1d32aa1a376eb7be0ac294357f4075429a1da305 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 20 Feb 2020 17:09:55 -0800 Subject: [PATCH 118/388] libsnapshot: NeedSnapshotsInFirstStageMount don't test for IsRecovery Init skips first stage mount entirely in recovery, so the check is useless. Also, __ANDROID_RECOVERY__ is always set for first stage init. Also add logs if rollback indicator is set. Fixes: 149956852 Test: apply OTA, manually rollback, reboot, see rollback indicator Change-Id: Iac967baf4b51ea5ce9f6eb962a33cb7ee5819c1d Merged-In: Iac967baf4b51ea5ce9f6eb962a33cb7ee5819c1d --- fs_mgr/libsnapshot/snapshot.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 7a4f3dcad..152ea9c3e 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -1387,12 +1387,14 @@ bool SnapshotManager::NeedSnapshotsInFirstStageMount() { auto slot = GetCurrentSlot(); if (slot != Slot::Target) { - if (slot == Slot::Source && !device_->IsRecovery()) { + if (slot == Slot::Source) { // Device is rebooting into the original slot, so mark this as a // rollback. auto path = GetRollbackIndicatorPath(); if (!android::base::WriteStringToFile("1", path)) { PLOG(ERROR) << "Unable to write rollback indicator: " << path; + } else { + LOG(INFO) << "Rollback detected, writing rollback indicator to " << path; } } LOG(INFO) << "Not booting from new slot. Will not mount snapshots."; From ae2558d900d5eafe2a511f8debe72a8564f5f966 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 18 Feb 2020 14:19:14 -0800 Subject: [PATCH 119/388] libsnapshot: RemoveUpdateState on rollback. If rollback is detected in ProcessUpdateState, call RemoveUpdateState and return UpdateState::Cancelled. Now that update_engine is reponsible for initiating the merge, it can react to this state and clean up markers appropriately. Test: libsnapshot_test Test: apply OTA, manually rollback (by setting the active slot), then inspect /metadata/ota as well as /data/misc/update_engine/prefs. Bug: 147696014 Change-Id: Ibfee11fb50e4f4fb7c6cf02b4921b35e77b8f5a5 Merged-In: Ibfee11fb50e4f4fb7c6cf02b4921b35e77b8f5a5 --- fs_mgr/libsnapshot/snapshot.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 152ea9c3e..c51c977db 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -1185,15 +1185,32 @@ bool SnapshotManager::HandleCancelledUpdate(LockedFile* lock, // If all snapshots were reflashed, then cancel the entire update. if (AreAllSnapshotsCancelled(lock)) { + LOG(WARNING) << "Detected re-flashing, cancelling unverified update."; RemoveAllUpdateState(lock, before_cancel); return true; } - // This unverified update might be rolled back, or it might not (b/147347110 - // comment #77). Take no action, as update_engine is responsible for deciding - // whether to cancel. - LOG(ERROR) << "Update state is being processed before reboot, taking no action."; - return false; + // If update has been rolled back, then cancel the entire update. + // Client (update_engine) is responsible for doing additional cleanup work on its own states + // when ProcessUpdateState() returns UpdateState::Cancelled. + auto current_slot = GetCurrentSlot(); + if (current_slot != Slot::Source) { + LOG(INFO) << "Update state is being processed while booting at " << current_slot + << " slot, taking no action."; + return false; + } + + // current_slot == Source. Attempt to detect rollbacks. + if (access(GetRollbackIndicatorPath().c_str(), F_OK) != 0) { + // This unverified update is not attempted. Take no action. + PLOG(INFO) << "Rollback indicator not detected. " + << "Update state is being processed before reboot, taking no action."; + return false; + } + + LOG(WARNING) << "Detected rollback, cancelling unverified update."; + RemoveAllUpdateState(lock, before_cancel); + return true; } std::unique_ptr SnapshotManager::ReadCurrentMetadata() { From 7c5ae0a12ef22f9dba005da9db13a8f37945f1a9 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 20 Feb 2020 19:51:05 -0800 Subject: [PATCH 120/388] libsnapshot: remove snapshots properly after flashing If updated then immediately flashed target slot at unverified stage, update_engine attempts to call RemoveAllSnapshots, but it used to fail because unmapping fails. In reality, these devices are dm-linear targets, so unmapping them is optional. - Introduce a GetSnapshotFlashingStatus function that expose more information than AreAllSnapshotsCancelled. We can use the returned map to determine whether a partition is flashed or not. - Introduce ShouldUnmapDeleteSnapshot which determines whether unmapping / deleteting a snapshot is needed in RemoveAllSnapshots. Test: apply OTA, flash target slot, then inspect logs Bug: 147696014 Change-Id: I0853d1e213566af2a3401e46fac7d9586cee7aaf Merged-In: I0853d1e213566af2a3401e46fac7d9586cee7aaf --- .../include/libsnapshot/snapshot.h | 14 +++ fs_mgr/libsnapshot/snapshot.cpp | 95 +++++++++++++++++-- 2 files changed, 99 insertions(+), 10 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 72f1d91de..1c9b9e525 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -384,6 +384,15 @@ class SnapshotManager final { // Helper for HandleCancelledUpdate. Assumes booting from new slot. bool AreAllSnapshotsCancelled(LockedFile* lock); + // Determine whether partition names in |snapshots| have been flashed and + // store result to |out|. + // Return true if values are successfully retrieved and false on error + // (e.g. super partition metadata cannot be read). When it returns true, + // |out| stores true for partitions that have been flashed and false for + // partitions that have not been flashed. + bool GetSnapshotFlashingStatus(LockedFile* lock, const std::vector& snapshots, + std::map* out); + // Remove artifacts created by the update process, such as snapshots, and // set the update state to None. bool RemoveAllUpdateState(LockedFile* lock, const std::function& prolog = {}); @@ -517,6 +526,11 @@ class SnapshotManager final { std::string ReadUpdateSourceSlotSuffix(); + // Helper for RemoveAllSnapshots. + // Check whether |name| should be deleted as a snapshot name. + bool ShouldDeleteSnapshot(LockedFile* lock, const std::map& flashing_status, + Slot current_slot, const std::string& name); + std::string gsid_dir_; std::string metadata_dir_; std::unique_ptr device_; diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index c51c977db..e13fc879f 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -1244,6 +1244,28 @@ bool SnapshotManager::AreAllSnapshotsCancelled(LockedFile* lock) { return true; } + std::map flashing_status; + + if (!GetSnapshotFlashingStatus(lock, snapshots, &flashing_status)) { + LOG(WARNING) << "Failed to determine whether partitions have been flashed. Not" + << "removing update states."; + return false; + } + + bool all_snapshots_cancelled = std::all_of(flashing_status.begin(), flashing_status.end(), + [](const auto& pair) { return pair.second; }); + + if (all_snapshots_cancelled) { + LOG(WARNING) << "All partitions are re-flashed after update, removing all update states."; + } + return all_snapshots_cancelled; +} + +bool SnapshotManager::GetSnapshotFlashingStatus(LockedFile* lock, + const std::vector& snapshots, + std::map* out) { + CHECK(lock); + auto source_slot_suffix = ReadUpdateSourceSlotSuffix(); if (source_slot_suffix.empty()) { return false; @@ -1269,20 +1291,17 @@ bool SnapshotManager::AreAllSnapshotsCancelled(LockedFile* lock) { return false; } - bool all_snapshots_cancelled = true; for (const auto& snapshot_name : snapshots) { if (GetMetadataPartitionState(*metadata, snapshot_name) == MetadataPartitionState::Updated) { - all_snapshots_cancelled = false; - continue; + out->emplace(snapshot_name, false); + } else { + // Delete snapshots for partitions that are re-flashed after the update. + LOG(WARNING) << "Detected re-flashing of partition " << snapshot_name << "."; + out->emplace(snapshot_name, true); } - // Delete snapshots for partitions that are re-flashed after the update. - LOG(WARNING) << "Detected re-flashing of partition " << snapshot_name << "."; } - if (all_snapshots_cancelled) { - LOG(WARNING) << "All partitions are re-flashed after update, removing all update states."; - } - return all_snapshots_cancelled; + return true; } bool SnapshotManager::RemoveAllSnapshots(LockedFile* lock) { @@ -1292,10 +1311,38 @@ bool SnapshotManager::RemoveAllSnapshots(LockedFile* lock) { return false; } + std::map flashing_status; + if (!GetSnapshotFlashingStatus(lock, snapshots, &flashing_status)) { + LOG(WARNING) << "Failed to get flashing status"; + } + + auto current_slot = GetCurrentSlot(); bool ok = true; bool has_mapped_cow_images = false; for (const auto& name : snapshots) { - if (!UnmapPartitionWithSnapshot(lock, name) || !DeleteSnapshot(lock, name)) { + // If booting off source slot, it is okay to unmap and delete all the snapshots. + // If boot indicator is missing, update state is None or Initiated, so + // it is also okay to unmap and delete all the snapshots. + // If booting off target slot, + // - should not unmap because: + // - In Android mode, snapshots are not mapped, but + // filesystems are mounting off dm-linear targets directly. + // - In recovery mode, assume nothing is mapped, so it is optional to unmap. + // - If partition is flashed or unknown, it is okay to delete snapshots. + // Otherwise (UPDATED flag), only delete snapshots if they are not mapped + // as dm-snapshot (for example, after merge completes). + bool should_unmap = current_slot != Slot::Target; + bool should_delete = ShouldDeleteSnapshot(lock, flashing_status, current_slot, name); + + bool partition_ok = true; + if (should_unmap && !UnmapPartitionWithSnapshot(lock, name)) { + partition_ok = false; + } + if (partition_ok && should_delete && !DeleteSnapshot(lock, name)) { + partition_ok = false; + } + + if (!partition_ok) { // Remember whether or not we were able to unmap the cow image. auto cow_image_device = GetCowImageDeviceName(name); has_mapped_cow_images |= @@ -1318,6 +1365,34 @@ bool SnapshotManager::RemoveAllSnapshots(LockedFile* lock) { return ok; } +// See comments in RemoveAllSnapshots(). +bool SnapshotManager::ShouldDeleteSnapshot(LockedFile* lock, + const std::map& flashing_status, + Slot current_slot, const std::string& name) { + if (current_slot != Slot::Target) { + return true; + } + auto it = flashing_status.find(name); + if (it == flashing_status.end()) { + LOG(WARNING) << "Can't determine flashing status for " << name; + return true; + } + if (it->second) { + // partition flashed, okay to delete obsolete snapshots + return true; + } + // partition updated, only delete if not dm-snapshot + SnapshotStatus status; + if (!ReadSnapshotStatus(lock, name, &status)) { + LOG(WARNING) << "Unable to read snapshot status for " << name + << ", guessing snapshot device name"; + auto extra_name = GetSnapshotExtraDeviceName(name); + return !IsSnapshotDevice(name) && !IsSnapshotDevice(extra_name); + } + auto dm_name = GetSnapshotDeviceName(name, status); + return !IsSnapshotDevice(dm_name); +} + UpdateState SnapshotManager::GetUpdateState(double* progress) { // If we've never started an update, the state file won't exist. auto state_file = GetStateFilePath(); From d5675f672870600249ef518a91eeb895cbcba600 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 20 Feb 2020 20:06:51 -0800 Subject: [PATCH 121/388] libsnapshot: handle errors in RemoveAllUpdateState appropriately. In CheckMergeState / HandleCancelledUpdate, if removing update state fails, just return the previous state. It used to return Cancelled, and the error goes unnoticed. Test: pass Bug: 147696014 Change-Id: I9cb3d20c5c886afa1913740c903eaad08f0cc041 Merged-In: I9cb3d20c5c886afa1913740c903eaad08f0cc041 --- fs_mgr/libsnapshot/snapshot.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index e13fc879f..f1a90c59e 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -829,7 +829,9 @@ UpdateState SnapshotManager::CheckMergeState(const std::function& before // lock, because flock() might have failed. AcknowledgeMergeSuccess(lock.get()); } else if (state == UpdateState::Cancelled) { - RemoveAllUpdateState(lock.get(), before_cancel); + if (!RemoveAllUpdateState(lock.get(), before_cancel)) { + return ReadSnapshotUpdateStatus(lock.get()).state(); + } } return state; } @@ -1186,8 +1188,7 @@ bool SnapshotManager::HandleCancelledUpdate(LockedFile* lock, // If all snapshots were reflashed, then cancel the entire update. if (AreAllSnapshotsCancelled(lock)) { LOG(WARNING) << "Detected re-flashing, cancelling unverified update."; - RemoveAllUpdateState(lock, before_cancel); - return true; + return RemoveAllUpdateState(lock, before_cancel); } // If update has been rolled back, then cancel the entire update. @@ -1209,8 +1210,7 @@ bool SnapshotManager::HandleCancelledUpdate(LockedFile* lock, } LOG(WARNING) << "Detected rollback, cancelling unverified update."; - RemoveAllUpdateState(lock, before_cancel); - return true; + return RemoveAllUpdateState(lock, before_cancel); } std::unique_ptr SnapshotManager::ReadCurrentMetadata() { From 3634255e66d61f522f88ef0ad3b06c644f6a72e4 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Wed, 19 Feb 2020 20:46:37 -0800 Subject: [PATCH 122/388] libsnapshot: delete WaitForMerge. Now that update_engine is responsible for initiating the merge, WaitForMerge function becomes useless. Bug: 147696014 Test: compiles Change-Id: I3779bdf9dd8d1716238e21d09acf0499e3fc90a3 Merged-In: I3779bdf9dd8d1716238e21d09acf0499e3fc90a3 --- .../libsnapshot/include/libsnapshot/return.h | 2 - .../include/libsnapshot/snapshot.h | 9 ----- fs_mgr/libsnapshot/return.cpp | 2 - fs_mgr/libsnapshot/snapshot.cpp | 26 ------------- fs_mgr/libsnapshot/snapshot_test.cpp | 39 ------------------- 5 files changed, 78 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/return.h b/fs_mgr/libsnapshot/include/libsnapshot/return.h index 1f132fa84..dedc44501 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/return.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/return.h @@ -30,7 +30,6 @@ class Return { enum class ErrorCode : int32_t { SUCCESS = static_cast(FiemapStatus::ErrorCode::SUCCESS), ERROR = static_cast(FiemapStatus::ErrorCode::ERROR), - NEEDS_REBOOT = ERROR + 1, NO_SPACE = static_cast(FiemapStatus::ErrorCode::NO_SPACE), }; ErrorCode error_code() const { return error_code_; } @@ -43,7 +42,6 @@ class Return { static Return Ok() { return Return(ErrorCode::SUCCESS); } static Return Error() { return Return(ErrorCode::ERROR); } static Return NoSpace(uint64_t size) { return Return(ErrorCode::NO_SPACE, size); } - static Return NeedsReboot() { return Return(ErrorCode::NEEDS_REBOOT); } // Does not set required_size_ properly even when status.error_code() == NO_SPACE. explicit Return(const FiemapStatus& status) : error_code_(FromFiemapStatusErrorCode(status.error_code())), required_size_(0) {} diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 1c9b9e525..32345d26f 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -185,15 +185,6 @@ class SnapshotManager final { UpdateState InitiateMergeAndWait(SnapshotMergeReport* report = nullptr, const std::function& before_cancel = {}); - // Wait for the merge if rebooted into the new slot. Does NOT initiate a - // merge. If the merge has not been initiated (but should be), wait. - // Returns: - // - Return::Ok(): there is no merge or merge finishes - // - Return::NeedsReboot(): merge finishes but need a reboot before - // applying the next update. - // - Return::Error(): other irrecoverable errors - Return WaitForMerge(); - // Find the status of the current update, if any. // // |progress| depends on the returned status: diff --git a/fs_mgr/libsnapshot/return.cpp b/fs_mgr/libsnapshot/return.cpp index 6559c12f1..cc64af5cb 100644 --- a/fs_mgr/libsnapshot/return.cpp +++ b/fs_mgr/libsnapshot/return.cpp @@ -24,8 +24,6 @@ std::string Return::string() const { switch (error_code()) { case ErrorCode::ERROR: return "Error"; - case ErrorCode::NEEDS_REBOOT: - return "Retry after reboot"; case ErrorCode::SUCCESS: [[fallthrough]]; case ErrorCode::NO_SPACE: diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index f1a90c59e..30993794e 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2551,32 +2551,6 @@ UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_rep return state; } -Return SnapshotManager::WaitForMerge() { - LOG(INFO) << "Waiting for any previous merge request to complete. " - << "This can take up to several minutes."; - while (true) { - auto state = ProcessUpdateState(); - if (state == UpdateState::Unverified && GetCurrentSlot() == Slot::Target) { - LOG(INFO) << "Wait for merge to be initiated."; - std::this_thread::sleep_for(kUpdateStateCheckInterval); - continue; - } - LOG(INFO) << "Wait for merge exits with state " << state; - switch (state) { - case UpdateState::None: - [[fallthrough]]; - case UpdateState::MergeCompleted: - [[fallthrough]]; - case UpdateState::Cancelled: - return Return::Ok(); - case UpdateState::MergeNeedsReboot: - return Return::NeedsReboot(); - default: - return Return::Error(); - } - } -} - bool SnapshotManager::HandleImminentDataWipe(const std::function& callback) { if (!device_->IsRecovery()) { LOG(ERROR) << "Data wipes are only allowed in recovery."; diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp index 0ffaa71ba..7d16ec280 100644 --- a/fs_mgr/libsnapshot/snapshot_test.cpp +++ b/fs_mgr/libsnapshot/snapshot_test.cpp @@ -1570,45 +1570,6 @@ TEST_F(SnapshotUpdateTest, Overflow) { << "FinishedSnapshotWrites should detect overflow of CoW device."; } -TEST_F(SnapshotUpdateTest, WaitForMerge) { - AddOperationForPartitions(); - - // Execute the update. - ASSERT_TRUE(sm->BeginUpdate()); - ASSERT_TRUE(sm->CreateUpdateSnapshots(manifest_)); - - // Write some data to target partitions. - for (const auto& name : {"sys_b", "vnd_b", "prd_b"}) { - ASSERT_TRUE(WriteSnapshotAndHash(name)); - } - - ASSERT_TRUE(sm->FinishedSnapshotWrites()); - - // Simulate shutting down the device. - ASSERT_TRUE(UnmapAll()); - - // After reboot, init does first stage mount. - { - auto init = SnapshotManager::NewForFirstStageMount(new TestDeviceInfo(fake_super, "_b")); - ASSERT_NE(nullptr, init); - ASSERT_TRUE(init->CreateLogicalAndSnapshotPartitions("super", snapshot_timeout_)); - } - - auto new_sm = SnapshotManager::New(new TestDeviceInfo(fake_super, "_b")); - ASSERT_NE(nullptr, new_sm); - - auto waiter = std::async(std::launch::async, [&new_sm] { return new_sm->WaitForMerge(); }); - ASSERT_EQ(std::future_status::timeout, waiter.wait_for(1s)) - << "WaitForMerge should block when not initiated"; - - auto merger = - std::async(std::launch::async, [&new_sm] { return new_sm->InitiateMergeAndWait(); }); - // Small images, so should be merged pretty quickly. - ASSERT_EQ(std::future_status::ready, waiter.wait_for(3s)) << "WaitForMerge did not finish"; - ASSERT_TRUE(waiter.get()); - ASSERT_THAT(merger.get(), AnyOf(UpdateState::None, UpdateState::MergeCompleted)); -} - TEST_F(SnapshotUpdateTest, LowSpace) { static constexpr auto kMaxFree = 10_MiB; auto userdata = std::make_unique(); From 2cea7249a95cd02e27252e6938a249b59e93fe2f Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 25 Feb 2020 15:15:23 -0800 Subject: [PATCH 123/388] libsnapshot: Expose SnapshotMergeStats Test: builds Bug: 147696014 Change-Id: Ia59a3f9226628558bdd1fdb0966812c2f652190c Merged-In: Ia59a3f9226628558bdd1fdb0966812c2f652190c --- fs_mgr/libsnapshot/{ => include/libsnapshot}/snapshot_stats.h | 0 fs_mgr/libsnapshot/snapshot.cpp | 2 +- fs_mgr/libsnapshot/snapshot_stats.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename fs_mgr/libsnapshot/{ => include/libsnapshot}/snapshot_stats.h (100%) diff --git a/fs_mgr/libsnapshot/snapshot_stats.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h similarity index 100% rename from fs_mgr/libsnapshot/snapshot_stats.h rename to fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 30993794e..896857f4a 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -43,10 +43,10 @@ #endif #include +#include #include "device_info.h" #include "partition_cow_creator.h" #include "snapshot_metadata_updater.h" -#include "snapshot_stats.h" #include "utility.h" namespace android { diff --git a/fs_mgr/libsnapshot/snapshot_stats.cpp b/fs_mgr/libsnapshot/snapshot_stats.cpp index 635b47d80..f4ebae81e 100644 --- a/fs_mgr/libsnapshot/snapshot_stats.cpp +++ b/fs_mgr/libsnapshot/snapshot_stats.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "snapshot_stats.h" +#include #include From e53129819d1761cd62d5a07f6f8d25f7378e5871 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 25 Feb 2020 14:47:38 -0800 Subject: [PATCH 124/388] libsnapshot: SnapshotMergeStats::Start/Finish Change API for SnapshotMergeStats so that it is easier for update_engine to use. Test: apply OTA and look at stats Bug: 147696014 Bug: 138817833 Change-Id: Ie4036ac7382102c00f0761f443d78e00b9e585d5 Merged-In: Ie4036ac7382102c00f0761f443d78e00b9e585d5 --- .../include/libsnapshot/snapshot_stats.h | 30 +++++-- fs_mgr/libsnapshot/snapshot.cpp | 19 +++-- fs_mgr/libsnapshot/snapshot_stats.cpp | 82 +++++++++++++------ fs_mgr/libsnapshot/snapshotctl.cpp | 2 +- 4 files changed, 91 insertions(+), 42 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h index 60109a4d1..91dd34f80 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot_stats.h @@ -15,6 +15,7 @@ #pragma once #include +#include #include #include @@ -24,21 +25,34 @@ namespace snapshot { class SnapshotMergeStats { public: - SnapshotMergeStats(SnapshotManager& parent); - ~SnapshotMergeStats(); - void Start(); - void Resume(); + // Not thread safe. + static SnapshotMergeStats* GetInstance(SnapshotManager& manager); + + // Called when merge starts or resumes. + bool Start(); void set_state(android::snapshot::UpdateState state); - SnapshotMergeReport GetReport(); + + // Called when merge ends. Properly clean up permanent storage. + class Result { + public: + virtual ~Result() {} + virtual const SnapshotMergeReport& report() const = 0; + // Time between successful Start() / Resume() to Finish(). + virtual std::chrono::steady_clock::duration merge_time() const = 0; + }; + std::unique_ptr Finish(); private: bool ReadState(); bool WriteState(); + bool DeleteState(); + SnapshotMergeStats(const std::string& path); - const SnapshotManager& parent_; + std::string path_; SnapshotMergeReport report_; - std::chrono::time_point init_time_; - std::chrono::time_point end_time_; + // Time of the last successful Start() / Resume() call. + std::chrono::time_point start_time_; + bool running_{false}; }; } // namespace snapshot diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 896857f4a..61fc2dff6 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2501,7 +2501,7 @@ UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_rep } } - SnapshotMergeStats merge_stats(*this); + auto merge_stats = SnapshotMergeStats::GetInstance(*this); unsigned int last_progress = 0; auto callback = [&]() -> bool { @@ -2516,9 +2516,9 @@ UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_rep LOG(INFO) << "Waiting for any previous merge request to complete. " << "This can take up to several minutes."; - merge_stats.Resume(); + merge_stats->Start(); auto state = ProcessUpdateState(callback, before_cancel); - merge_stats.set_state(state); + merge_stats->set_state(state); if (state == UpdateState::None) { LOG(INFO) << "Can't find any snapshot to merge."; return state; @@ -2529,10 +2529,6 @@ UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_rep return state; } - // This is the first snapshot merge that is requested after OTA. We can - // initialize the merge duration statistics. - merge_stats.Start(); - if (!InitiateMerge()) { LOG(ERROR) << "Failed to initiate merge."; return state; @@ -2541,12 +2537,17 @@ UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_rep LOG(INFO) << "Waiting for merge to complete. This can take up to several minutes."; last_progress = 0; state = ProcessUpdateState(callback, before_cancel); - merge_stats.set_state(state); + merge_stats->set_state(state); } LOG(INFO) << "Merge finished with state \"" << state << "\"."; if (stats_report) { - *stats_report = merge_stats.GetReport(); + auto result = merge_stats->Finish(); + if (result) { + *stats_report = result->report(); + } else { + LOG(WARNING) << "SnapshotMergeStatus::Finish failed."; + } } return state; } diff --git a/fs_mgr/libsnapshot/snapshot_stats.cpp b/fs_mgr/libsnapshot/snapshot_stats.cpp index f4ebae81e..5da7b9873 100644 --- a/fs_mgr/libsnapshot/snapshot_stats.cpp +++ b/fs_mgr/libsnapshot/snapshot_stats.cpp @@ -23,22 +23,17 @@ namespace android { namespace snapshot { -SnapshotMergeStats::SnapshotMergeStats(SnapshotManager& parent) : parent_(parent) { - init_time_ = std::chrono::steady_clock::now(); +SnapshotMergeStats* SnapshotMergeStats::GetInstance(SnapshotManager& parent) { + static SnapshotMergeStats g_instance(parent.GetMergeStateFilePath()); + CHECK(g_instance.path_ == parent.GetMergeStateFilePath()); + return &g_instance; } -SnapshotMergeStats::~SnapshotMergeStats() { - std::string error; - auto file_path = parent_.GetMergeStateFilePath(); - if (!android::base::RemoveFileIfExists(file_path, &error)) { - LOG(ERROR) << "Failed to remove merge statistics file " << file_path << ": " << error; - return; - } -} +SnapshotMergeStats::SnapshotMergeStats(const std::string& path) : path_(path), running_(false) {} bool SnapshotMergeStats::ReadState() { std::string contents; - if (!android::base::ReadFileToString(parent_.GetMergeStateFilePath(), &contents)) { + if (!android::base::ReadFileToString(path_, &contents)) { PLOG(INFO) << "Read merge statistics file failed"; return false; } @@ -55,34 +50,73 @@ bool SnapshotMergeStats::WriteState() { LOG(ERROR) << "Unable to serialize SnapshotMergeStats."; return false; } - auto file_path = parent_.GetMergeStateFilePath(); - if (!WriteStringToFileAtomic(contents, file_path)) { + if (!WriteStringToFileAtomic(contents, path_)) { PLOG(ERROR) << "Could not write to merge statistics file"; return false; } return true; } -void SnapshotMergeStats::Start() { - report_.set_resume_count(0); - report_.set_state(UpdateState::None); - WriteState(); +bool SnapshotMergeStats::DeleteState() { + std::string error; + if (!android::base::RemoveFileIfExists(path_, &error)) { + LOG(ERROR) << "Failed to remove merge statistics file " << path_ << ": " << error; + return false; + } + return true; } -void SnapshotMergeStats::Resume() { - if (!ReadState()) { - return; +bool SnapshotMergeStats::Start() { + if (running_) { + LOG(ERROR) << "SnapshotMergeStats running_ == " << running_; + return false; } - report_.set_resume_count(report_.resume_count() + 1); - WriteState(); + running_ = true; + + start_time_ = std::chrono::steady_clock::now(); + if (ReadState()) { + report_.set_resume_count(report_.resume_count() + 1); + } else { + report_.set_resume_count(0); + report_.set_state(UpdateState::None); + } + + return WriteState(); } void SnapshotMergeStats::set_state(android::snapshot::UpdateState state) { report_.set_state(state); } -SnapshotMergeReport SnapshotMergeStats::GetReport() { - return report_; +class SnapshotMergeStatsResultImpl : public SnapshotMergeStats::Result { + public: + SnapshotMergeStatsResultImpl(const SnapshotMergeReport& report, + std::chrono::steady_clock::duration merge_time) + : report_(report), merge_time_(merge_time) {} + const SnapshotMergeReport& report() const override { return report_; } + std::chrono::steady_clock::duration merge_time() const override { return merge_time_; } + + private: + SnapshotMergeReport report_; + std::chrono::steady_clock::duration merge_time_; +}; + +std::unique_ptr SnapshotMergeStats::Finish() { + if (!running_) { + LOG(ERROR) << "SnapshotMergeStats running_ == " << running_; + return nullptr; + } + running_ = false; + + auto result = std::make_unique( + report_, std::chrono::steady_clock::now() - start_time_); + + // We still want to report result if state is not deleted. Just leave + // it there and move on. A side effect is that it may be reported over and + // over again in the future, but there is nothing we can do. + (void)DeleteState(); + + return result; } } // namespace snapshot diff --git a/fs_mgr/libsnapshot/snapshotctl.cpp b/fs_mgr/libsnapshot/snapshotctl.cpp index 4670eeea0..aa5e9c1fa 100644 --- a/fs_mgr/libsnapshot/snapshotctl.cpp +++ b/fs_mgr/libsnapshot/snapshotctl.cpp @@ -26,9 +26,9 @@ #include #include #include +#include #include -#include "snapshot_stats.h" #include "utility.h" using namespace std::string_literals; From b9a0e2ad60ea4f96399c57f4c7035ea96345944b Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 5 Mar 2020 10:00:52 -0800 Subject: [PATCH 125/388] base: access all new liblog symbols through liblog_functions The original CL was missing these. Bug: 149591522 Test: build Merged-In: I99615b81cfe9166a00c812a8642ecf1244bf08b9 Change-Id: I99615b81cfe9166a00c812a8642ecf1244bf08b9 (cherry picked from commit d620ec7fb97e0036dd37be23cc94745e80ef51fa) --- base/logging.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base/logging.cpp b/base/logging.cpp index f42b9966b..9360a56d5 100644 --- a/base/logging.cpp +++ b/base/logging.cpp @@ -447,7 +447,7 @@ void SetAborter(AbortFunction&& aborter) { // See the comment in SetLogger(). static std::atomic abort_function(nullptr); auto* old_abort_function = abort_function.exchange(new AbortFunction(aborter)); - __android_log_set_aborter([](const char* abort_message) { + liblog_functions->__android_log_set_aborter([](const char* abort_message) { auto& function = *abort_function.load(std::memory_order_acquire); function(abort_message); }); @@ -578,7 +578,7 @@ void LogMessage::LogLine(const char* file, unsigned int line, LogSeverity severi if (liblog_functions) { __android_logger_data logger_data = { sizeof(__android_logger_data), LOG_ID_DEFAULT, priority, tag, file, line}; - __android_log_write_logger_data(&logger_data, message); + liblog_functions->__android_log_write_logger_data(&logger_data, message); } else { if (tag == nullptr) { std::lock_guard lock(TagLock()); From 960a81f4a1055ea72e53ac361a45e93dfa903447 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 21 Feb 2020 17:11:07 -0800 Subject: [PATCH 126/388] init: Make sure ImageManager status files are labelled. adb remount and snapshot-based updates use ImageManager in first-stage init. This creates status files, which need to be labelled. Bug: 148834619 Test: manual test Change-Id: I72949fca2889f9e5612049844a78bf9355b48797 Merged-In: I72949fca2889f9e5612049844a78bf9355b48797 --- init/selinux.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/init/selinux.cpp b/init/selinux.cpp index c5b7576c9..2faa16720 100644 --- a/init/selinux.cpp +++ b/init/selinux.cpp @@ -535,7 +535,9 @@ void SelinuxRestoreContext() { selinux_android_restorecon("/linkerconfig", 0); - selinux_android_restorecon(gsi::kDsuAvbKeyDir, SELINUX_ANDROID_RESTORECON_RECURSE); + // adb remount, snapshot-based updates, and DSUs all create files during + // first-stage init. + selinux_android_restorecon("/metadata", SELINUX_ANDROID_RESTORECON_RECURSE); } int SelinuxKlogCallback(int type, const char* fmt, ...) { From dd4e7ef6ce7e40d8922d0d6bdca0d59121c36759 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 20 Feb 2020 17:54:57 -0800 Subject: [PATCH 127/388] init: restorecon libsnapshot rollback indicator The rollback indicator is created during first stage init and is unlabeled. Need to restorecon it properly so that it can be properly deleted by update_engine later. Bug: 149956852 Bug: 150907679 Test: apply OTA, reboot, look at serial console Change-Id: Ie954023b557865691fec2ae378145596bf1973a9 --- fs_mgr/libsnapshot/include/libsnapshot/snapshot.h | 3 +++ fs_mgr/libsnapshot/snapshot.cpp | 7 ++++++- init/selinux.cpp | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 32345d26f..81f616ce6 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -125,6 +125,9 @@ class SnapshotManager final { // might be needed to perform first-stage mounts. static bool IsSnapshotManagerNeeded(); + // Helper function for second stage init to restorecon on the rollback indicator. + static std::string GetGlobalRollbackIndicatorPath(); + // Begin an update. This must be called before creating any snapshots. It // will fail if GetUpdateState() != None. bool BeginUpdate(); diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 61fc2dff6..154b5d755 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -81,6 +81,7 @@ using namespace std::chrono_literals; using namespace std::string_literals; static constexpr char kBootIndicatorPath[] = "/metadata/ota/snapshot-boot"; +static constexpr char kRollbackIndicatorPath[] = "/metadata/ota/rollback-indicator"; static constexpr auto kUpdateStateCheckInterval = 2s; // Note: IImageManager is an incomplete type in the header, so the default @@ -1012,7 +1013,7 @@ std::string SnapshotManager::GetSnapshotBootIndicatorPath() { } std::string SnapshotManager::GetRollbackIndicatorPath() { - return metadata_dir_ + "/rollback-indicator"; + return metadata_dir_ + "/" + android::base::Basename(kRollbackIndicatorPath); } void SnapshotManager::AcknowledgeMergeSuccess(LockedFile* lock) { @@ -1469,6 +1470,10 @@ bool SnapshotManager::IsSnapshotManagerNeeded() { return access(kBootIndicatorPath, F_OK) == 0; } +std::string SnapshotManager::GetGlobalRollbackIndicatorPath() { + return kRollbackIndicatorPath; +} + bool SnapshotManager::NeedSnapshotsInFirstStageMount() { // If we fail to read, we'll wind up using CreateLogicalPartitions, which // will create devices that look like the old slot, except with extra diff --git a/init/selinux.cpp b/init/selinux.cpp index 2faa16720..acbcbd647 100644 --- a/init/selinux.cpp +++ b/init/selinux.cpp @@ -66,6 +66,7 @@ #include #include #include +#include #include #include "debug_ramdisk.h" @@ -78,6 +79,7 @@ using android::base::ParseInt; using android::base::Timer; using android::base::unique_fd; using android::fs_mgr::AvbHandle; +using android::snapshot::SnapshotManager; namespace android { namespace init { @@ -538,6 +540,8 @@ void SelinuxRestoreContext() { // adb remount, snapshot-based updates, and DSUs all create files during // first-stage init. selinux_android_restorecon("/metadata", SELINUX_ANDROID_RESTORECON_RECURSE); + + selinux_android_restorecon(SnapshotManager::GetGlobalRollbackIndicatorPath().c_str(), 0); } int SelinuxKlogCallback(int type, const char* fmt, ...) { From 76eb935bd42a8fb162b2b1df261a7483ed01ac79 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 24 Feb 2020 16:17:19 -0800 Subject: [PATCH 128/388] debuggerd: add an opt-out for OEMs that would rather collect core dumps. On userdebug/eng devices, check a system property to see whether we should create tombstones or not. OEMs that would rather have core dumps can set this property and configure /proc/sys/kernel/core_pattern appropriately. Bug: https://issuetracker.google.com/149663286 Test: set the property, cause a crash Change-Id: If894b4582a1820b64bdae819cec593b7710cb6e3 (cherry picked from commit 530ab81e4215c86832294434f032306656c8f3b7) --- debuggerd/include/debuggerd/handler.h | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/debuggerd/include/debuggerd/handler.h b/debuggerd/include/debuggerd/handler.h index 4f24360dc..665d24a7f 100644 --- a/debuggerd/include/debuggerd/handler.h +++ b/debuggerd/include/debuggerd/handler.h @@ -19,7 +19,9 @@ #include #include #include +#include #include +#include #include __BEGIN_DECLS @@ -50,16 +52,21 @@ void debuggerd_init(debuggerd_callbacks_t* callbacks); #define DEBUGGER_SIGNAL BIONIC_SIGNAL_DEBUGGER static void __attribute__((__unused__)) debuggerd_register_handlers(struct sigaction* action) { - sigaction(SIGABRT, action, nullptr); - sigaction(SIGBUS, action, nullptr); - sigaction(SIGFPE, action, nullptr); - sigaction(SIGILL, action, nullptr); - sigaction(SIGSEGV, action, nullptr); -#if defined(SIGSTKFLT) - sigaction(SIGSTKFLT, action, nullptr); -#endif - sigaction(SIGSYS, action, nullptr); - sigaction(SIGTRAP, action, nullptr); + char value[PROP_VALUE_MAX] = ""; + bool enabled = + !(__system_property_get("ro.debuggable", value) > 0 && !strcmp(value, "1") && + __system_property_get("debug.debuggerd.disable", value) > 0 && !strcmp(value, "1")); + if (enabled) { + sigaction(SIGABRT, action, nullptr); + sigaction(SIGBUS, action, nullptr); + sigaction(SIGFPE, action, nullptr); + sigaction(SIGILL, action, nullptr); + sigaction(SIGSEGV, action, nullptr); + sigaction(SIGSTKFLT, action, nullptr); + sigaction(SIGSYS, action, nullptr); + sigaction(SIGTRAP, action, nullptr); + } + sigaction(BIONIC_SIGNAL_DEBUGGER, action, nullptr); } From 8f50cfc28d2d91f91f45370bd9859a328ffc6c16 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 6 Mar 2020 15:55:20 +0000 Subject: [PATCH 129/388] Move GetMountedEntryForUserdata to fs_mgr.h Logic of unwinding dm-device stack to figure out what entry was used to mount userdata turned out to be a little bit more involved, and it shouldn't be part of libfstab This CL just moves code around and cleans API a little bit, actual fix will be in the follow-up CL. Test: atest CtsFsMgrTest Test: atest CtsUserspaceRebootHostSideTestCases Bug: 148612148 Change-Id: If0f8a765dba63adb0e6a711eb81fffdcabea3480 --- fs_mgr/fs_mgr.cpp | 85 +++++++++++++++++++++++++++--- fs_mgr/fs_mgr_fstab.cpp | 83 ----------------------------- fs_mgr/include/fs_mgr.h | 4 ++ fs_mgr/include_fstab/fstab/fstab.h | 1 - fs_mgr/tests/fs_mgr_test.cpp | 7 ++- 5 files changed, 88 insertions(+), 92 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 59cae61d7..2e46b4f87 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -96,6 +96,7 @@ using android::base::Basename; using android::base::GetBoolProperty; +using android::base::Readlink; using android::base::Realpath; using android::base::SetProperty; using android::base::StartsWith; @@ -1588,6 +1589,79 @@ static bool fs_mgr_unmount_all_data_mounts(const std::string& block_device) { } } +static std::string ResolveBlockDevice(const std::string& block_device) { + if (!StartsWith(block_device, "/dev/block/")) { + LWARNING << block_device << " is not a block device"; + return block_device; + } + std::string name = block_device.substr(5); + if (!StartsWith(name, "block/dm-")) { + // Not a dm-device, but might be a symlink. Optimistically try to readlink. + std::string result; + if (Readlink(block_device, &result)) { + return result; + } else if (errno == EINVAL) { + // After all, it wasn't a symlink. + return block_device; + } else { + LERROR << "Failed to readlink " << block_device; + return ""; + } + } + // It's a dm-device, let's find what's inside! + std::string sys_dir = "/sys/" + name; + while (true) { + std::string slaves_dir = sys_dir + "/slaves"; + std::unique_ptr dir(opendir(slaves_dir.c_str()), closedir); + if (!dir) { + LERROR << "Failed to open " << slaves_dir; + return ""; + } + std::string sub_device_name = ""; + for (auto entry = readdir(dir.get()); entry; entry = readdir(dir.get())) { + if (entry->d_type != DT_LNK) continue; + if (!sub_device_name.empty()) { + LERROR << "Too many slaves in " << slaves_dir; + return ""; + } + sub_device_name = entry->d_name; + } + if (sub_device_name.empty()) { + LERROR << "No slaves in " << slaves_dir; + return ""; + } + if (!StartsWith(sub_device_name, "dm-")) { + // Not a dm-device! We can stop now. + return "/dev/block/" + sub_device_name; + } + // Still a dm-device, keep digging. + sys_dir = "/sys/block/" + sub_device_name; + } +} + +FstabEntry* fs_mgr_get_mounted_entry_for_userdata(Fstab* fstab, const FstabEntry& mounted_entry) { + std::string resolved_block_device = ResolveBlockDevice(mounted_entry.blk_device); + if (resolved_block_device.empty()) { + return nullptr; + } + LINFO << "/data is mounted on " << resolved_block_device; + for (auto& entry : *fstab) { + if (entry.mount_point != "/data") { + continue; + } + std::string block_device; + if (!Readlink(entry.blk_device, &block_device)) { + LWARNING << "Failed to readlink " << entry.blk_device; + block_device = entry.blk_device; + } + if (block_device == resolved_block_device) { + return &entry; + } + } + LERROR << "Didn't find entry that was used to mount /data"; + return nullptr; +} + // TODO(b/143970043): return different error codes based on which step failed. int fs_mgr_remount_userdata_into_checkpointing(Fstab* fstab) { Fstab proc_mounts; @@ -1596,16 +1670,13 @@ int fs_mgr_remount_userdata_into_checkpointing(Fstab* fstab) { return -1; } std::string block_device; - if (auto entry = GetEntryForMountPoint(&proc_mounts, "/data"); entry != nullptr) { - // Note: we don't care about a userdata wrapper here, since it's safe - // to remount on top of the bow device instead, there will be no - // conflicts. - block_device = entry->blk_device; - } else { + auto mounted_entry = GetEntryForMountPoint(&proc_mounts, "/data"); + if (mounted_entry == nullptr) { LERROR << "/data is not mounted"; return -1; } - auto fstab_entry = GetMountedEntryForUserdata(fstab); + block_device = mounted_entry->blk_device; + auto fstab_entry = fs_mgr_get_mounted_entry_for_userdata(fstab, *mounted_entry); if (fstab_entry == nullptr) { LERROR << "Can't find /data in fstab"; return -1; diff --git a/fs_mgr/fs_mgr_fstab.cpp b/fs_mgr/fs_mgr_fstab.cpp index a36934a3a..f3f1cb724 100644 --- a/fs_mgr/fs_mgr_fstab.cpp +++ b/fs_mgr/fs_mgr_fstab.cpp @@ -814,89 +814,6 @@ std::vector GetEntriesForMountPoint(Fstab* fstab, const std::string return entries; } -static std::string ResolveBlockDevice(const std::string& block_device) { - if (!StartsWith(block_device, "/dev/block/")) { - LWARNING << block_device << " is not a block device"; - return block_device; - } - std::string name = block_device.substr(5); - if (!StartsWith(name, "block/dm-")) { - // Not a dm-device, but might be a symlink. Optimistically try to readlink. - std::string result; - if (Readlink(block_device, &result)) { - return result; - } else if (errno == EINVAL) { - // After all, it wasn't a symlink. - return block_device; - } else { - LERROR << "Failed to readlink " << block_device; - return ""; - } - } - // It's a dm-device, let's find what's inside! - std::string sys_dir = "/sys/" + name; - while (true) { - std::string slaves_dir = sys_dir + "/slaves"; - std::unique_ptr dir(opendir(slaves_dir.c_str()), closedir); - if (!dir) { - LERROR << "Failed to open " << slaves_dir; - return ""; - } - std::string sub_device_name = ""; - for (auto entry = readdir(dir.get()); entry; entry = readdir(dir.get())) { - if (entry->d_type != DT_LNK) continue; - if (!sub_device_name.empty()) { - LERROR << "Too many slaves in " << slaves_dir; - return ""; - } - sub_device_name = entry->d_name; - } - if (sub_device_name.empty()) { - LERROR << "No slaves in " << slaves_dir; - return ""; - } - if (!StartsWith(sub_device_name, "dm-")) { - // Not a dm-device! We can stop now. - return "/dev/block/" + sub_device_name; - } - // Still a dm-device, keep digging. - sys_dir = "/sys/block/" + sub_device_name; - } -} - -FstabEntry* GetMountedEntryForUserdata(Fstab* fstab) { - Fstab mounts; - if (!ReadFstabFromFile("/proc/mounts", &mounts)) { - LERROR << "Failed to read /proc/mounts"; - return nullptr; - } - auto mounted_entry = GetEntryForMountPoint(&mounts, "/data"); - if (mounted_entry == nullptr) { - LWARNING << "/data is not mounted"; - return nullptr; - } - std::string resolved_block_device = ResolveBlockDevice(mounted_entry->blk_device); - if (resolved_block_device.empty()) { - return nullptr; - } - LINFO << "/data is mounted on " << resolved_block_device; - for (auto& entry : *fstab) { - if (entry.mount_point != "/data") { - continue; - } - std::string block_device; - if (!Readlink(entry.blk_device, &block_device)) { - LWARNING << "Failed to readlink " << entry.blk_device; - block_device = entry.blk_device; - } - if (block_device == resolved_block_device) { - return &entry; - } - } - LERROR << "Didn't find entry that was used to mount /data"; - return nullptr; -} - std::set GetBootDevices() { // First check the kernel commandline, then try the device tree otherwise std::string dt_file_name = get_android_dt_dir() + "/boot_devices"; diff --git a/fs_mgr/include/fs_mgr.h b/fs_mgr/include/fs_mgr.h index 9bc38f97b..3d556c9e5 100644 --- a/fs_mgr/include/fs_mgr.h +++ b/fs_mgr/include/fs_mgr.h @@ -107,6 +107,10 @@ enum FsMgrUmountStatus : int { // it destroys verity devices from device mapper after the device is unmounted. int fs_mgr_umount_all(android::fs_mgr::Fstab* fstab); +// Finds a entry in |fstab| that was used to mount a /data |mounted_entry| from +// /proc/mounts. +android::fs_mgr::FstabEntry* fs_mgr_get_mounted_entry_for_userdata( + android::fs_mgr::Fstab* fstab, const android::fs_mgr::FstabEntry& mounted_entry); int fs_mgr_remount_userdata_into_checkpointing(android::fs_mgr::Fstab* fstab); // Finds the dm_bow device on which this block device is stacked, or returns diff --git a/fs_mgr/include_fstab/fstab/fstab.h b/fs_mgr/include_fstab/fstab/fstab.h index c94d7acd1..009c04c19 100644 --- a/fs_mgr/include_fstab/fstab/fstab.h +++ b/fs_mgr/include_fstab/fstab/fstab.h @@ -102,7 +102,6 @@ bool SkipMountingPartitions(Fstab* fstab); FstabEntry* GetEntryForMountPoint(Fstab* fstab, const std::string& path); // The Fstab can contain multiple entries for the same mount point with different configurations. std::vector GetEntriesForMountPoint(Fstab* fstab, const std::string& path); -FstabEntry* GetMountedEntryForUserdata(Fstab* fstab); // This method builds DSU fstab entries and transfer the fstab. // diff --git a/fs_mgr/tests/fs_mgr_test.cpp b/fs_mgr/tests/fs_mgr_test.cpp index 9caae3597..16e38f157 100644 --- a/fs_mgr/tests/fs_mgr_test.cpp +++ b/fs_mgr/tests/fs_mgr_test.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -1001,6 +1002,10 @@ TEST(fs_mgr, UserdataMountedFromDefaultFstab) { } Fstab fstab; ASSERT_TRUE(ReadDefaultFstab(&fstab)) << "Failed to read default fstab"; - ASSERT_NE(nullptr, GetMountedEntryForUserdata(&fstab)) + Fstab proc_mounts; + ASSERT_TRUE(ReadFstabFromFile("/proc/mounts", &proc_mounts)) << "Failed to read /proc/mounts"; + auto mounted_entry = GetEntryForMountPoint(&proc_mounts, "/data"); + ASSERT_NE(mounted_entry, nullptr) << "/data is not mounted"; + ASSERT_NE(nullptr, fs_mgr_get_mounted_entry_for_userdata(&fstab, *mounted_entry)) << "/data wasn't mounted from default fstab"; } From 7452e46ae0b2d961ea47b3f0ac1b87a7d9f8e19b Mon Sep 17 00:00:00 2001 From: Luke Huang Date: Tue, 18 Feb 2020 15:53:44 +0800 Subject: [PATCH 130/388] Use libbase to get the elapsed time instead of libutils To minimize the external library dependencies Bug: 149721367 Test: atest Change-Id: I7b79223ad58c2af94d01a35ad39be6cdd1de7f47 Merged-In: I7b79223ad58c2af94d01a35ad39be6cdd1de7f47 (cherry picked from commit cab9854fa91b4721eef4d4a549f702f73b7edd8a) --- libstats/push_compat/Android.bp | 1 - libstats/push_compat/StatsEventCompat.cpp | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/libstats/push_compat/Android.bp b/libstats/push_compat/Android.bp index 3e695567a..4de95dc0d 100644 --- a/libstats/push_compat/Android.bp +++ b/libstats/push_compat/Android.bp @@ -36,7 +36,6 @@ cc_defaults { static_libs: [ "libbase", "liblog", - "libutils", ], } diff --git a/libstats/push_compat/StatsEventCompat.cpp b/libstats/push_compat/StatsEventCompat.cpp index de458b3e5..b065af21c 100644 --- a/libstats/push_compat/StatsEventCompat.cpp +++ b/libstats/push_compat/StatsEventCompat.cpp @@ -15,12 +15,16 @@ */ #include "include/StatsEventCompat.h" + +#include + +#include #include #include #include #include -#include +using android::base::boot_clock; using android::base::GetProperty; const static int kStatsEventTag = 1937006964; @@ -41,6 +45,12 @@ bool StatsEventCompat::mAttemptedLoad = false; void* StatsEventCompat::mStatsEventApi = nullptr; std::mutex StatsEventCompat::mLoadLock; +static int64_t elapsedRealtimeNano() { + return std::chrono::time_point_cast(boot_clock::now()) + .time_since_epoch() + .count(); +} + StatsEventCompat::StatsEventCompat() : mEventQ(kStatsEventTag) { // guard loading because StatsEventCompat might be called from multithreaded // environment @@ -61,7 +71,7 @@ StatsEventCompat::StatsEventCompat() : mEventQ(kStatsEventTag) { if (mStatsEventApi) { // mEventR = mStatsEventApi->obtain(); } else if (!mPlatformAtLeastR) { - mEventQ << android::elapsedRealtimeNano(); + mEventQ << elapsedRealtimeNano(); } } From 2ba869b77044930ee9a125f0ea60872582ca055b Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 6 Mar 2020 21:25:39 -0800 Subject: [PATCH 131/388] Remove mips pixelflinger. All of pixelflinger is gone in R, but these parts haven't been used in years. Test: treehugger Change-Id: I7e743da2b6f142884b3c41fd60550a381df51d54 From 7a287d075129bbe058f8df666ead2a0e5c5c5c2b Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Wed, 19 Feb 2020 16:31:13 -0800 Subject: [PATCH 132/388] Use dlsym to load libstatssocket API Also fixes a bug in the tests where the platform version was being checked by querying version.release instead of version.codename (currently, version.release == 10, while version.codename == R). Test: bit libstatspush_compat_test:* (on Q and R) Test: libsstatssocket.so is not placed in resolv apex (on R) 1|bonito:/ $ ls apex/com.android.resolv/lib64 libclang_rt.ubsan_standalone-aarch64-android.so libcrypto.so libnetd_resolv.so libssl.so Test: NETWORK_DNS_EVENT_REPORTED atom is logged to statsd (on R) - adb shell cmd stats print-stats (atom 116 count > 0) Bug: 148743333 Change-Id: Ib3eaa32835905bcf6e3b003054bf0f3c4e7ec0a4 Merged-In: Ib3eaa32835905bcf6e3b003054bf0f3c4e7ec0a4 (cherry picked from commit 9848eb4f1c6780c0cfb253417d7542663421fb7e) --- libstats/push_compat/StatsEventCompat.cpp | 135 +++++++++++------- .../push_compat/include/StatsEventCompat.h | 28 +++- .../tests/StatsEventCompat_test.cpp | 4 +- 3 files changed, 111 insertions(+), 56 deletions(-) diff --git a/libstats/push_compat/StatsEventCompat.cpp b/libstats/push_compat/StatsEventCompat.cpp index b065af21c..e1a86ae1a 100644 --- a/libstats/push_compat/StatsEventCompat.cpp +++ b/libstats/push_compat/StatsEventCompat.cpp @@ -40,10 +40,10 @@ const bool StatsEventCompat::mPlatformAtLeastR = GetProperty("ro.build.version.codename", "") == "R" || android_get_device_api_level() > __ANDROID_API_Q__; -// definitions of static class variables +// initializations of static class variables bool StatsEventCompat::mAttemptedLoad = false; -void* StatsEventCompat::mStatsEventApi = nullptr; std::mutex StatsEventCompat::mLoadLock; +AStatsEventApi StatsEventCompat::mAStatsEventApi; static int64_t elapsedRealtimeNano() { return std::chrono::time_point_cast(boot_clock::now()) @@ -56,11 +56,10 @@ StatsEventCompat::StatsEventCompat() : mEventQ(kStatsEventTag) { // environment { std::lock_guard lg(mLoadLock); - if (!mAttemptedLoad) { + if (!mAttemptedLoad && mPlatformAtLeastR) { void* handle = dlopen("libstatssocket.so", RTLD_NOW); if (handle) { - // mStatsEventApi = (struct AStatsEvent_apiTable*)dlsym(handle, - // "table"); + initializeApiTableLocked(handle); } else { ALOGE("dlopen failed: %s\n", dlerror()); } @@ -68,61 +67,93 @@ StatsEventCompat::StatsEventCompat() : mEventQ(kStatsEventTag) { mAttemptedLoad = true; } - if (mStatsEventApi) { - // mEventR = mStatsEventApi->obtain(); - } else if (!mPlatformAtLeastR) { + if (useRSchema()) { + mEventR = mAStatsEventApi.obtain(); + } else if (useQSchema()) { mEventQ << elapsedRealtimeNano(); } } StatsEventCompat::~StatsEventCompat() { - // if (mStatsEventApi) mStatsEventApi->release(mEventR); + if (useRSchema()) mAStatsEventApi.release(mEventR); +} + +// Populates the AStatsEventApi struct by calling dlsym to find the address of +// each API function. +void StatsEventCompat::initializeApiTableLocked(void* handle) { + mAStatsEventApi.obtain = (AStatsEvent* (*)())dlsym(handle, "AStatsEvent_obtain"); + mAStatsEventApi.build = (void (*)(AStatsEvent*))dlsym(handle, "AStatsEvent_build"); + mAStatsEventApi.write = (int (*)(AStatsEvent*))dlsym(handle, "AStatsEvent_write"); + mAStatsEventApi.release = (void (*)(AStatsEvent*))dlsym(handle, "AStatsEvent_release"); + mAStatsEventApi.setAtomId = + (void (*)(AStatsEvent*, uint32_t))dlsym(handle, "AStatsEvent_setAtomId"); + mAStatsEventApi.writeInt32 = + (void (*)(AStatsEvent*, int32_t))dlsym(handle, "AStatsEvent_writeInt32"); + mAStatsEventApi.writeInt64 = + (void (*)(AStatsEvent*, int64_t))dlsym(handle, "AStatsEvent_writeInt64"); + mAStatsEventApi.writeFloat = + (void (*)(AStatsEvent*, float))dlsym(handle, "AStatsEvent_writeFloat"); + mAStatsEventApi.writeBool = + (void (*)(AStatsEvent*, bool))dlsym(handle, "AStatsEvent_writeBool"); + mAStatsEventApi.writeByteArray = (void (*)(AStatsEvent*, const uint8_t*, size_t))dlsym( + handle, "AStatsEvent_writeByteArray"); + mAStatsEventApi.writeString = + (void (*)(AStatsEvent*, const char*))dlsym(handle, "AStatsEvent_writeString"); + mAStatsEventApi.writeAttributionChain = + (void (*)(AStatsEvent*, const uint32_t*, const char* const*, uint8_t))dlsym( + handle, "AStatsEvent_writeAttributionChain"); + mAStatsEventApi.addBoolAnnotation = + (void (*)(AStatsEvent*, uint8_t, bool))dlsym(handle, "AStatsEvent_addBoolAnnotation"); + mAStatsEventApi.addInt32Annotation = (void (*)(AStatsEvent*, uint8_t, int32_t))dlsym( + handle, "AStatsEvent_addInt32Annotation"); + + mAStatsEventApi.initialized = true; } void StatsEventCompat::setAtomId(int32_t atomId) { - if (mStatsEventApi) { - // mStatsEventApi->setAtomId(mEventR, (uint32_t)atomId); - } else if (!mPlatformAtLeastR) { + if (useRSchema()) { + mAStatsEventApi.setAtomId(mEventR, (uint32_t)atomId); + } else if (useQSchema()) { mEventQ << atomId; } } void StatsEventCompat::writeInt32(int32_t value) { - if (mStatsEventApi) { - // mStatsEventApi->writeInt32(mEventR, value); - } else if (!mPlatformAtLeastR) { + if (useRSchema()) { + mAStatsEventApi.writeInt32(mEventR, value); + } else if (useQSchema()) { mEventQ << value; } } void StatsEventCompat::writeInt64(int64_t value) { - if (mStatsEventApi) { - // mStatsEventApi->writeInt64(mEventR, value); - } else if (!mPlatformAtLeastR) { + if (useRSchema()) { + mAStatsEventApi.writeInt64(mEventR, value); + } else if (useQSchema()) { mEventQ << value; } } void StatsEventCompat::writeFloat(float value) { - if (mStatsEventApi) { - // mStatsEventApi->writeFloat(mEventR, value); - } else if (!mPlatformAtLeastR) { + if (useRSchema()) { + mAStatsEventApi.writeFloat(mEventR, value); + } else if (useQSchema()) { mEventQ << value; } } void StatsEventCompat::writeBool(bool value) { - if (mStatsEventApi) { - // mStatsEventApi->writeBool(mEventR, value); - } else if (!mPlatformAtLeastR) { + if (useRSchema()) { + mAStatsEventApi.writeBool(mEventR, value); + } else if (useQSchema()) { mEventQ << value; } } void StatsEventCompat::writeByteArray(const char* buffer, size_t length) { - if (mStatsEventApi) { - // mStatsEventApi->writeByteArray(mEventR, (const uint8_t*)buffer, length); - } else if (!mPlatformAtLeastR) { + if (useRSchema()) { + mAStatsEventApi.writeByteArray(mEventR, reinterpret_cast(buffer), length); + } else if (useQSchema()) { mEventQ.AppendCharArray(buffer, length); } } @@ -130,19 +161,19 @@ void StatsEventCompat::writeByteArray(const char* buffer, size_t length) { void StatsEventCompat::writeString(const char* value) { if (value == nullptr) value = ""; - if (mStatsEventApi) { - // mStatsEventApi->writeString(mEventR, value); - } else if (!mPlatformAtLeastR) { + if (useRSchema()) { + mAStatsEventApi.writeString(mEventR, value); + } else if (useQSchema()) { mEventQ << value; } } void StatsEventCompat::writeAttributionChain(const int32_t* uids, size_t numUids, const vector& tags) { - if (mStatsEventApi) { - // mStatsEventApi->writeAttributionChain(mEventR, (const uint32_t*)uids, tags.data(), - // (uint8_t)numUids); - } else if (!mPlatformAtLeastR) { + if (useRSchema()) { + mAStatsEventApi.writeAttributionChain(mEventR, (const uint32_t*)uids, tags.data(), + (uint8_t)numUids); + } else if (useQSchema()) { mEventQ.begin(); for (size_t i = 0; i < numUids; i++) { mEventQ.begin(); @@ -159,8 +190,8 @@ void StatsEventCompat::writeKeyValuePairs(const map& int32Map, const map& int64Map, const map& stringMap, const map& floatMap) { - // Key value pairs are not supported with AStatsEvent. - if (!mPlatformAtLeastR) { + // AStatsEvent does not support key value pairs. + if (useQSchema()) { mEventQ.begin(); writeKeyValuePairMap(int32Map); writeKeyValuePairMap(int64Map); @@ -187,34 +218,36 @@ template void StatsEventCompat::writeKeyValuePairMap(const map(const map&); void StatsEventCompat::addBoolAnnotation(uint8_t annotationId, bool value) { - // Workaround for unused params. - (void)annotationId; - (void)value; - // if (mStatsEventApi) mStatsEventApi->addBoolAnnotation(mEventR, annotationId, value); + if (useRSchema()) { + mAStatsEventApi.addBoolAnnotation(mEventR, annotationId, value); + } // Don't do anything if on Q. } void StatsEventCompat::addInt32Annotation(uint8_t annotationId, int32_t value) { - // Workaround for unused params. - (void)annotationId; - (void)value; - // if (mStatsEventApi) mStatsEventApi->addInt32Annotation(mEventR, annotationId, value); + if (useRSchema()) { + mAStatsEventApi.addInt32Annotation(mEventR, annotationId, value); + } // Don't do anything if on Q. } int StatsEventCompat::writeToSocket() { - if (mStatsEventApi) { - // mStatsEventApi->build(mEventR); - // return mStatsEventApi->write(mEventR); + if (useRSchema()) { + mAStatsEventApi.build(mEventR); + return mAStatsEventApi.write(mEventR); } - if (!mPlatformAtLeastR) return mEventQ.write(LOG_ID_STATS); + if (useQSchema()) return mEventQ.write(LOG_ID_STATS); - // We reach here only if we're on R, but libstatspush_compat was unable to + // We reach here only if we're on R, but libstatssocket was unable to // be loaded using dlopen. return -ENOLINK; } -bool StatsEventCompat::usesNewSchema() { - return mStatsEventApi != nullptr; +bool StatsEventCompat::useRSchema() { + return mPlatformAtLeastR && mAStatsEventApi.initialized; +} + +bool StatsEventCompat::useQSchema() { + return !mPlatformAtLeastR; } diff --git a/libstats/push_compat/include/StatsEventCompat.h b/libstats/push_compat/include/StatsEventCompat.h index ad423a1c9..00bf48bf5 100644 --- a/libstats/push_compat/include/StatsEventCompat.h +++ b/libstats/push_compat/include/StatsEventCompat.h @@ -26,6 +26,26 @@ using std::map; using std::vector; +struct AStatsEventApi { + // Indicates whether the below function pointers have been set using dlsym. + bool initialized = false; + + AStatsEvent* (*obtain)(void); + void (*build)(AStatsEvent*); + int (*write)(AStatsEvent*); + void (*release)(AStatsEvent*); + void (*setAtomId)(AStatsEvent*, uint32_t); + void (*writeInt32)(AStatsEvent*, int32_t); + void (*writeInt64)(AStatsEvent*, int64_t); + void (*writeFloat)(AStatsEvent*, float); + void (*writeBool)(AStatsEvent*, bool); + void (*writeByteArray)(AStatsEvent*, const uint8_t*, size_t); + void (*writeString)(AStatsEvent*, const char*); + void (*writeAttributionChain)(AStatsEvent*, const uint32_t*, const char* const*, uint8_t); + void (*addBoolAnnotation)(AStatsEvent*, uint8_t, bool); + void (*addInt32Annotation)(AStatsEvent*, uint8_t, int32_t); +}; + class StatsEventCompat { public: StatsEventCompat(); @@ -57,8 +77,7 @@ class StatsEventCompat { const static bool mPlatformAtLeastR; static bool mAttemptedLoad; static std::mutex mLoadLock; - // static struct AStatsEvent_apiTable* mStatsEventApi; - static void* mStatsEventApi; + static AStatsEventApi mAStatsEventApi; // non-static member variables AStatsEvent* mEventR = nullptr; @@ -67,6 +86,9 @@ class StatsEventCompat { template void writeKeyValuePairMap(const map& keyValuePairMap); - bool usesNewSchema(); + void initializeApiTableLocked(void* handle); + bool useRSchema(); + bool useQSchema(); + FRIEND_TEST(StatsEventCompatTest, TestDynamicLoading); }; diff --git a/libstats/push_compat/tests/StatsEventCompat_test.cpp b/libstats/push_compat/tests/StatsEventCompat_test.cpp index 2be24ec10..dcb37973e 100644 --- a/libstats/push_compat/tests/StatsEventCompat_test.cpp +++ b/libstats/push_compat/tests/StatsEventCompat_test.cpp @@ -29,10 +29,10 @@ using android::base::GetProperty; * * TODO(b/146019024): migrate to android_get_device_api_level() */ -const static bool mPlatformAtLeastR = GetProperty("ro.build.version.release", "") == "R" || +const static bool mPlatformAtLeastR = GetProperty("ro.build.version.codename", "") == "R" || android_get_device_api_level() > __ANDROID_API_Q__; TEST(StatsEventCompatTest, TestDynamicLoading) { StatsEventCompat event; - EXPECT_EQ(mPlatformAtLeastR, event.usesNewSchema()); + EXPECT_EQ(mPlatformAtLeastR, event.useRSchema()); } From 21ab3adc735b2f973b11c15cfd9944614e95ce19 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Wed, 12 Feb 2020 18:21:20 +0000 Subject: [PATCH 133/388] Revert "libsnapshot::RemoveAllUpdateState log stack" Revert submission snapshotctl_callstack Reason for revert: Callstack should not be logged Reverted Changes: Ib80c74a9a:Temporarily add libutilscallstack dependency I2dfb6b7f1:libsnapshot::RemoveAllUpdateState log stack Test: none Bug: 148818798 Change-Id: I34683e93f10971629737f6fe648b25c6066c702f --- fs_mgr/libsnapshot/Android.bp | 16 ---------------- fs_mgr/libsnapshot/snapshot.cpp | 19 ------------------- 2 files changed, 35 deletions(-) diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp index 0a0a21ddb..d670ca064 100644 --- a/fs_mgr/libsnapshot/Android.bp +++ b/fs_mgr/libsnapshot/Android.bp @@ -96,16 +96,6 @@ cc_library_static { static_libs: [ "libfs_mgr_binder" ], - - shared_libs: [ - // TODO(b/148818798): remove when parent bug is fixed - "libutilscallstack", - ], - cflags: [ - "-g", - "-O0", - "-DLIBSNAPSHOT_USE_CALLSTACK", - ], } cc_library_static { @@ -179,9 +169,6 @@ cc_defaults { "libsparse", "libutils", "libz", - - // TODO(b/148818798): remove when parent bug is fixed - "libutilscallstack", ], static_libs: [ "libfs_mgr", @@ -231,8 +218,5 @@ cc_binary { "libprotobuf-cpp-lite", "libstatslog", "libutils", - - // TODO(b/148818798): remove when parent bug is fixed. - "libutilscallstack", ], } diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 7a72e692a..7e84c48bd 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -21,7 +21,6 @@ #include #include -#include #include #include @@ -38,10 +37,6 @@ #include #include -#ifdef LIBSNAPSHOT_USE_CALLSTACK -#include -#endif - #include #include #include "device_info.h" @@ -228,20 +223,6 @@ bool SnapshotManager::RemoveAllUpdateState(LockedFile* lock, const std::function LOG(INFO) << "Removing all update state."; -#ifdef LIBSNAPSHOT_USE_CALLSTACK - LOG(WARNING) << "Logging stack; see b/148818798."; - // Do not use CallStack's log functions because snapshotctl relies on - // android-base/logging to save log to files. - // TODO(b/148818798): remove this before we ship. - CallStack callstack; - callstack.update(); - auto callstack_str = callstack.toString(); - LOG(WARNING) << callstack_str.c_str(); - std::stringstream path; - path << "/data/misc/snapshotctl_log/libsnapshot." << Now() << ".log"; - android::base::WriteStringToFile(callstack_str.c_str(), path.str()); -#endif - if (!RemoveAllSnapshots(lock)) { LOG(ERROR) << "Could not remove all snapshots"; return false; From ffd1f52c22b59b21a332bd03b72468be21b3a394 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Wed, 19 Feb 2020 20:52:51 -0800 Subject: [PATCH 134/388] libsnapshot: delete InitiateMergeAndWait. Now that update_engine is responsible for initiating the merge, InitiateMergeAndWait function becomes useless. Bug: 147696014 Test: libsnapshot_test Change-Id: I5473dc543ca8ac2fd31f597720847b02d0e5e33d --- .../include/libsnapshot/snapshot.h | 10 -- fs_mgr/libsnapshot/snapshot.cpp | 62 -------- fs_mgr/libsnapshot/snapshot_test.cpp | 14 +- fs_mgr/libsnapshot/snapshotctl.cpp | 140 +----------------- 4 files changed, 15 insertions(+), 211 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 81f616ce6..68a81ede1 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -178,16 +178,6 @@ class SnapshotManager final { UpdateState ProcessUpdateState(const std::function& callback = {}, const std::function& before_cancel = {}); - // Initiate the merge if necessary, then wait for the merge to finish. - // See InitiateMerge() and ProcessUpdateState() for details. - // Returns: - // - None if no merge to initiate - // - Unverified if called on the source slot - // - MergeCompleted if merge is completed - // - other states indicating an error has occurred - UpdateState InitiateMergeAndWait(SnapshotMergeReport* report = nullptr, - const std::function& before_cancel = {}); - // Find the status of the current update, if any. // // |progress| depends on the returned status: diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 154b5d755..ff63f6347 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2495,68 +2495,6 @@ std::unique_ptr SnapshotManager::EnsureMetadataMounted() { return AutoUnmountDevice::New(device_->GetMetadataDir()); } -UpdateState SnapshotManager::InitiateMergeAndWait(SnapshotMergeReport* stats_report, - const std::function& before_cancel) { - { - auto lock = LockExclusive(); - // Sync update state from file with bootloader. - if (!WriteUpdateState(lock.get(), ReadUpdateState(lock.get()))) { - LOG(WARNING) << "Unable to sync write update state, fastboot may " - << "reject / accept wipes incorrectly!"; - } - } - - auto merge_stats = SnapshotMergeStats::GetInstance(*this); - - unsigned int last_progress = 0; - auto callback = [&]() -> bool { - double progress; - GetUpdateState(&progress); - if (last_progress < static_cast(progress)) { - last_progress = progress; - LOG(INFO) << "Waiting for merge to complete: " << last_progress << "%."; - } - return true; // continue - }; - - LOG(INFO) << "Waiting for any previous merge request to complete. " - << "This can take up to several minutes."; - merge_stats->Start(); - auto state = ProcessUpdateState(callback, before_cancel); - merge_stats->set_state(state); - if (state == UpdateState::None) { - LOG(INFO) << "Can't find any snapshot to merge."; - return state; - } - if (state == UpdateState::Unverified) { - if (GetCurrentSlot() != Slot::Target) { - LOG(INFO) << "Cannot merge until device reboots."; - return state; - } - - if (!InitiateMerge()) { - LOG(ERROR) << "Failed to initiate merge."; - return state; - } - // All other states can be handled by ProcessUpdateState. - LOG(INFO) << "Waiting for merge to complete. This can take up to several minutes."; - last_progress = 0; - state = ProcessUpdateState(callback, before_cancel); - merge_stats->set_state(state); - } - - LOG(INFO) << "Merge finished with state \"" << state << "\"."; - if (stats_report) { - auto result = merge_stats->Finish(); - if (result) { - *stats_report = result->report(); - } else { - LOG(WARNING) << "SnapshotMergeStatus::Finish failed."; - } - } - return state; -} - bool SnapshotManager::HandleImminentDataWipe(const std::function& callback) { if (!device_->IsRecovery()) { LOG(ERROR) << "Data wipes are only allowed in recovery."; diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp index 7d16ec280..855451d82 100644 --- a/fs_mgr/libsnapshot/snapshot_test.cpp +++ b/fs_mgr/libsnapshot/snapshot_test.cpp @@ -1027,7 +1027,8 @@ TEST_F(SnapshotUpdateTest, FullUpdateFlow) { } // Initiate the merge and wait for it to be completed. - ASSERT_EQ(UpdateState::MergeCompleted, init->InitiateMergeAndWait()); + ASSERT_TRUE(init->InitiateMerge()); + ASSERT_EQ(UpdateState::MergeCompleted, init->ProcessUpdateState()); // Check that the target partitions have the same content after the merge. for (const auto& name : {"sys_b", "vnd_b", "prd_b"}) { @@ -1201,7 +1202,8 @@ TEST_F(SnapshotUpdateTest, ReclaimCow) { // Initiate the merge and wait for it to be completed. auto new_sm = SnapshotManager::New(new TestDeviceInfo(fake_super, "_b")); - ASSERT_EQ(UpdateState::MergeCompleted, new_sm->InitiateMergeAndWait()); + ASSERT_TRUE(new_sm->InitiateMerge()); + ASSERT_EQ(UpdateState::MergeCompleted, new_sm->ProcessUpdateState()); // Execute the second update. ASSERT_TRUE(new_sm->BeginUpdate()); @@ -1341,7 +1343,8 @@ TEST_F(SnapshotUpdateTest, MergeCannotRemoveCow) { ASSERT_GE(fd, 0); // COW cannot be removed due to open fd, so expect a soft failure. - ASSERT_EQ(UpdateState::MergeNeedsReboot, init->InitiateMergeAndWait()); + ASSERT_TRUE(init->InitiateMerge()); + ASSERT_EQ(UpdateState::MergeNeedsReboot, init->ProcessUpdateState()); // Simulate shutting down the device. fd.reset(); @@ -1354,7 +1357,7 @@ TEST_F(SnapshotUpdateTest, MergeCannotRemoveCow) { ASSERT_FALSE(sm->IsSnapshotDevice("sys_b", nullptr)); // Merge should be able to complete now. - ASSERT_EQ(UpdateState::MergeCompleted, init->InitiateMergeAndWait()); + ASSERT_EQ(UpdateState::MergeCompleted, init->ProcessUpdateState()); } class MetadataMountedTest : public SnapshotUpdateTest { @@ -1691,7 +1694,8 @@ TEST_P(FlashAfterUpdateTest, FlashSlotAfterUpdate) { // There should be no snapshot to merge. auto new_sm = SnapshotManager::New(new TestDeviceInfo(fake_super, flashed_slot_suffix)); - ASSERT_EQ(UpdateState::Cancelled, new_sm->InitiateMergeAndWait()); + // update_enigne calls ProcessUpdateState first -- should see Cancelled. + ASSERT_EQ(UpdateState::Cancelled, new_sm->ProcessUpdateState()); // Next OTA calls CancelUpdate no matter what. ASSERT_TRUE(new_sm->CancelUpdate()); diff --git a/fs_mgr/libsnapshot/snapshotctl.cpp b/fs_mgr/libsnapshot/snapshotctl.cpp index aa5e9c1fa..a44de8419 100644 --- a/fs_mgr/libsnapshot/snapshotctl.cpp +++ b/fs_mgr/libsnapshot/snapshotctl.cpp @@ -24,12 +24,8 @@ #include #include #include -#include -#include -#include -#include -#include "utility.h" +#include using namespace std::string_literals; @@ -39,146 +35,22 @@ int Usage() { "Actions:\n" " dump\n" " Print snapshot states.\n" - " merge [--logcat] [--log-to-file] [--report] [--dry-run]\n" - " Initialize merge and wait for it to be completed.\n" - " If --logcat is specified, log to logcat.\n" - " If --log-to-file is specified, log to /data/misc/snapshotctl_log/.\n" - " If both specified, log to both. If none specified, log to stdout.\n" - " If --report is specified, send merge statistics to statsd.\n" - " If --dry-run flag, no real merge operation is is triggered, and\n" - " sample statistics are sent to statsd for testing purpose.\n"; + " merge\n" + " Deprecated.\n"; return EX_USAGE; } namespace android { namespace snapshot { -static SnapshotMergeReport GetDummySnapshotMergeReport() { - SnapshotMergeReport fake_report; - - fake_report.set_state(UpdateState::MergeCompleted); - fake_report.set_resume_count(56); - - return fake_report; -} - bool DumpCmdHandler(int /*argc*/, char** argv) { android::base::InitLogging(argv, &android::base::StderrLogger); return SnapshotManager::New()->Dump(std::cout); } -class FileLogger { - public: - FileLogger() { - static constexpr const char* kLogFilePath = "/data/misc/snapshotctl_log/"; - std::stringstream ss; - ss << kLogFilePath << "snapshotctl." << Now() << ".log"; - fd_.reset(TEMP_FAILURE_RETRY( - open(ss.str().c_str(), - O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NOFOLLOW | O_SYNC, 0644))); - if (fd_ == -1) { - PLOG(ERROR) << "Cannot open persistent log " << ss.str(); - return; - } - // Explicitly chmod again because mode in open() may be masked by umask. - if (fchmod(fd_.get(), 0644) == -1) { - PLOG(ERROR) << "Cannot chmod 0644 persistent log " << ss.str(); - return; - } - } - // Copy-contuctor needed to be converted to std::function. - FileLogger(const FileLogger& other) { fd_.reset(dup(other.fd_)); } - void operator()(android::base::LogId, android::base::LogSeverity, const char* /*tag*/, - const char* /*file*/, unsigned int /*line*/, const char* message) { - if (fd_ == -1) return; - std::stringstream ss; - ss << Now() << ":" << message << "\n"; - (void)android::base::WriteStringToFd(ss.str(), fd_); - } - - private: - android::base::unique_fd fd_; -}; - -class MergeCmdLogger { - public: - MergeCmdLogger(int argc, char** argv) { - for (int i = 0; i < argc; ++i) { - if (argv[i] == "--logcat"s) { - loggers_.push_back(android::base::LogdLogger()); - } - if (argv[i] == "--log-to-file"s) { - loggers_.push_back(std::move(FileLogger())); - } - } - if (loggers_.empty()) { - loggers_.push_back(&android::base::StdioLogger); - } - } - void operator()(android::base::LogId id, android::base::LogSeverity severity, const char* tag, - const char* file, unsigned int line, const char* message) { - for (auto&& logger : loggers_) { - logger(id, severity, tag, file, line, message); - } - } - - private: - std::vector loggers_; -}; - -bool MergeCmdHandler(int argc, char** argv) { - std::chrono::milliseconds passed_ms; - - bool report_to_statsd = false; - bool dry_run = false; - for (int i = 2; i < argc; ++i) { - if (argv[i] == "--report"s) { - report_to_statsd = true; - } else if (argv[i] == "--dry-run"s) { - dry_run = true; - } - } - - // 'snapshotctl merge' is stripped away from arguments to - // Logger. - android::base::InitLogging(argv); - android::base::SetLogger(MergeCmdLogger(argc - 2, argv + 2)); - - UpdateState state; - SnapshotMergeReport merge_report; - if (dry_run) { - merge_report = GetDummySnapshotMergeReport(); - state = merge_report.state(); - passed_ms = std::chrono::milliseconds(1234); - } else { - auto begin = std::chrono::steady_clock::now(); - - state = SnapshotManager::New()->InitiateMergeAndWait(&merge_report); - - // We could wind up in the Unverified state if the device rolled back or - // hasn't fully rebooted. Ignore this. - if (state == UpdateState::None || state == UpdateState::Unverified) { - return true; - } - - auto end = std::chrono::steady_clock::now(); - passed_ms = std::chrono::duration_cast(end - begin); - } - - if (report_to_statsd) { - android::util::stats_write(android::util::SNAPSHOT_MERGE_REPORTED, - static_cast(merge_report.state()), - static_cast(passed_ms.count()), - static_cast(merge_report.resume_count())); - } - - if (state == UpdateState::MergeCompleted) { - LOG(INFO) << "Snapshot merged in " << passed_ms.count() << " ms."; - return true; - } - - LOG(ERROR) << "Snapshot failed to merge with state \"" << state << "\"."; - +bool MergeCmdHandler(int /*argc*/, char** argv) { + android::base::InitLogging(argv, &android::base::StderrLogger); + LOG(WARNING) << "Deprecated. Call update_engine_client --merge instead."; return false; } From 611c6f7d79ddc7a36b72de0202bf68837efd4332 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Wed, 12 Feb 2020 18:20:07 +0000 Subject: [PATCH 135/388] Revert "libsnapshot callstack files readable by dumpstate" This reverts commit faa49d1d0052e074606d88cc56638b573d6e5fb0. Reason for revert: Callstack should not be logged. Test: none Bug: 148818798 Change-Id: Ie5506ae0c7408e255a464b2f403d0a47d272229e --- fs_mgr/libsnapshot/snapshot.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index ff63f6347..7a72e692a 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -239,12 +239,7 @@ bool SnapshotManager::RemoveAllUpdateState(LockedFile* lock, const std::function LOG(WARNING) << callstack_str.c_str(); std::stringstream path; path << "/data/misc/snapshotctl_log/libsnapshot." << Now() << ".log"; - std::string path_str = path.str(); - android::base::WriteStringToFile(callstack_str.c_str(), path_str); - if (chmod(path_str.c_str(), 0644) == -1) { - PLOG(WARNING) << "Unable to chmod 0644 " - << ", file maybe dropped from bugreport:" << path_str; - } + android::base::WriteStringToFile(callstack_str.c_str(), path.str()); #endif if (!RemoveAllSnapshots(lock)) { From 7c8e2b247d2411d76196dc8a56656d39fe40214e Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Fri, 6 Mar 2020 20:47:30 +0900 Subject: [PATCH 136/388] Whole static link libasync_safe to libbacktrace.a When libbacktrace.a is statically lined to somewhere, that library had to add libasync_safe.a to static_libs because libbacktrace.a has references to libasync_safe.a. But libbacktace depending on libasync_safe is an implementation detail of libbacktrace, and therefore its client shouldn't be affected by it. Fixing this by doing the whole static link to libasync_safe to libbacktrace.a so that the former is included in libbacktrace.a Bug: 149569129 Test: m Change-Id: If7366a240bc945dda9944fe7c111e10d328165bb --- libbacktrace/Android.bp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libbacktrace/Android.bp b/libbacktrace/Android.bp index 565f2c35e..59bd97c25 100644 --- a/libbacktrace/Android.bp +++ b/libbacktrace/Android.bp @@ -89,6 +89,9 @@ cc_library { }, android: { static_libs: ["libasync_safe"], + static: { + whole_static_libs: ["libasync_safe"], + }, }, vendor: { cflags: ["-DNO_LIBDEXFILE_SUPPORT"], From 5280b5c03ee1dc4bc60a579626190dcbcbd9849a Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 3 Mar 2020 16:12:36 +0900 Subject: [PATCH 137/388] libbase uses liblog symbols via dlsym when it is built for APEX libbase is a popular library that is used by many APEXes either directly or transitively. It is being used by several Mainline modules that were launched with Q, in which case everything in the APEX - including libbase - shouldn't use new APIs that are added post Q, i.e. R. libbase however is using a few new R symbols from liblog, and this is preventing those Q-launching Mainline modules that are built in R source tree from being installed to Q devices. Fortunately, the dependencies to the new R symbols are guarded with a flag; when the existence of the symbols are not guaranteed, it uses dlsym. This change fixes the aforementioned problem by turning on the flag also when libbase is built for an APEX. Bug: 149569129 Test: TARGET_BUILD_APPS=com.android.media vendor/google/build/build_mainline_modules.sh adb install --staged out/dist/mainline_modules_arm64/com.android.media.apex adb reboot The APEX is installed and mediaextractor process doesn't crash Change-Id: I44b5ec028850613cb45fc3e792f43cd8e87cfd00 --- base/liblog_symbols.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/base/liblog_symbols.cpp b/base/liblog_symbols.cpp index d5dfcd28b..8d5917907 100644 --- a/base/liblog_symbols.cpp +++ b/base/liblog_symbols.cpp @@ -16,14 +16,20 @@ #include "liblog_symbols.h" -#if defined(__ANDROID__) && !defined(NO_LIBLOG_DLSYM) +#if defined(__ANDROID__) +#if !defined(NO_LIBLOG_DLSYM) || defined(__ANDROID_APEX__) +#define USE_DLSYM +#endif +#endif + +#ifdef USE_DLSYM #include #endif namespace android { namespace base { -#if defined(__ANDROID__) && !defined(NO_LIBLOG_DLSYM) +#ifdef USE_DLSYM const std::optional& GetLibLogFunctions() { static std::optional liblog_functions = []() -> std::optional { From 6519ad63551d97a015fed52597232fd19e683aed Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Thu, 5 Mar 2020 17:58:53 -0800 Subject: [PATCH 138/388] adb: defer acknowledgement of pushed files until the end. Previously, we were waiting for the other end to respond after every file sent, which results in massive slowdown when there's any amount of latency on the transport. This improves performance on a cuttlefish instance with ~7ms RTT from: system/: 2037 files pushed, 0 skipped. 2.8 MB/s (762803979 bytes in 262.964s) to: system/: 2037 files pushed, 0 skipped. 11.9 MB/s (762803979 bytes in 61.278s) Bug: https://issuetracker.google.com/150827486 Test: ./test_device.py Change-Id: I3a0c893faa5d455cc6ccbc86915a17e1b5abbfbe (cherry picked from commit 64ff82ba68d9c3e169af123943ad29f95f71febf) --- adb/client/file_sync_client.cpp | 188 +++++++++++++++----------------- 1 file changed, 90 insertions(+), 98 deletions(-) diff --git a/adb/client/file_sync_client.cpp b/adb/client/file_sync_client.cpp index 922f2ba4c..cc38926a4 100644 --- a/adb/client/file_sync_client.cpp +++ b/adb/client/file_sync_client.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -203,7 +204,7 @@ struct TransferLedger { class SyncConnection { public: - SyncConnection() : expect_done_(false) { + SyncConnection() { max = SYNC_DATA_MAX; // TODO: decide at runtime. std::string error; @@ -239,16 +240,6 @@ class SyncConnection { bool IsValid() { return fd >= 0; } - bool ReceivedError(const char* from, const char* to) { - adb_pollfd pfd = {.fd = fd.get(), .events = POLLIN}; - int rc = adb_poll(&pfd, 1, 0); - if (rc < 0) { - Error("failed to poll: %s", strerror(errno)); - return true; - } - return rc != 0; - } - void NewTransfer() { current_ledger_.Reset(); } @@ -258,6 +249,11 @@ class SyncConnection { global_ledger_.bytes_transferred += bytes; } + void RecordFileSent(std::string from, std::string to) { + RecordFilesTransferred(1); + deferred_acknowledgements_.emplace_back(std::move(from), std::move(to)); + } + void RecordFilesTransferred(size_t files) { current_ledger_.files_transferred += files; global_ledger_.files_transferred += files; @@ -283,39 +279,38 @@ class SyncConnection { } } - bool SendRequest(int id, const char* path_and_mode) { - size_t path_length = strlen(path_and_mode); - if (path_length > 1024) { - Error("SendRequest failed: path too long: %zu", path_length); + bool SendRequest(int id, const std::string& path) { + if (path.length() > 1024) { + Error("SendRequest failed: path too long: %zu", path.length()); errno = ENAMETOOLONG; return false; } // Sending header and payload in a single write makes a noticeable // difference to "adb sync" performance. - std::vector buf(sizeof(SyncRequest) + path_length); + std::vector buf(sizeof(SyncRequest) + path.length()); SyncRequest* req = reinterpret_cast(&buf[0]); req->id = id; - req->path_length = path_length; + req->path_length = path.length(); char* data = reinterpret_cast(req + 1); - memcpy(data, path_and_mode, path_length); + memcpy(data, path.data(), path.length()); - return WriteFdExactly(fd, &buf[0], buf.size()); + return WriteFdExactly(fd, buf.data(), buf.size()); } - bool SendStat(const char* path_and_mode) { + bool SendStat(const std::string& path) { if (!have_stat_v2_) { errno = ENOTSUP; return false; } - return SendRequest(ID_STAT_V2, path_and_mode); + return SendRequest(ID_STAT_V2, path); } - bool SendLstat(const char* path_and_mode) { + bool SendLstat(const std::string& path) { if (have_stat_v2_) { - return SendRequest(ID_LSTAT_V2, path_and_mode); + return SendRequest(ID_LSTAT_V2, path); } else { - return SendRequest(ID_LSTAT_V1, path_and_mode); + return SendRequest(ID_LSTAT_V1, path); } } @@ -374,7 +369,7 @@ class SyncConnection { return true; } - bool SendLs(const char* path) { + bool SendLs(const std::string& path) { return SendRequest(have_ls_v2_ ? ID_LIST_V2 : ID_LIST_V1, path); } @@ -415,28 +410,26 @@ class SyncConnection { // Sending header, payload, and footer in a single write makes a huge // difference to "adb sync" performance. - bool SendSmallFile(const char* path_and_mode, - const char* lpath, const char* rpath, - unsigned mtime, - const char* data, size_t data_length) { - size_t path_length = strlen(path_and_mode); - if (path_length > 1024) { - Error("SendSmallFile failed: path too long: %zu", path_length); + bool SendSmallFile(const std::string& path, mode_t mode, const std::string& lpath, + const std::string& rpath, unsigned mtime, const char* data, + size_t data_length) { + std::string path_and_mode = android::base::StringPrintf("%s,%d", path.c_str(), mode); + if (path_and_mode.length() > 1024) { + Error("SendSmallFile failed: path too long: %zu", path_and_mode.length()); errno = ENAMETOOLONG; return false; } - std::vector buf(sizeof(SyncRequest) + path_length + - sizeof(SyncRequest) + data_length + - sizeof(SyncRequest)); + std::vector buf(sizeof(SyncRequest) + path_and_mode.length() + sizeof(SyncRequest) + + data_length + sizeof(SyncRequest)); char* p = &buf[0]; SyncRequest* req_send = reinterpret_cast(p); req_send->id = ID_SEND; - req_send->path_length = path_length; + req_send->path_length = path_and_mode.length(); p += sizeof(SyncRequest); - memcpy(p, path_and_mode, path_length); - p += path_length; + memcpy(p, path_and_mode.data(), path_and_mode.size()); + p += path_and_mode.length(); SyncRequest* req_data = reinterpret_cast(p); req_data->id = ID_DATA; @@ -451,34 +444,34 @@ class SyncConnection { p += sizeof(SyncRequest); WriteOrDie(lpath, rpath, &buf[0], (p - &buf[0])); - expect_done_ = true; - // RecordFilesTransferred gets called in CopyDone. + RecordFileSent(lpath, rpath); RecordBytesTransferred(data_length); ReportProgress(rpath, data_length, data_length); return true; } - bool SendLargeFile(const char* path_and_mode, - const char* lpath, const char* rpath, - unsigned mtime) { + bool SendLargeFile(const std::string& path, mode_t mode, const std::string& lpath, + const std::string& rpath, unsigned mtime) { + std::string path_and_mode = android::base::StringPrintf("%s,%d", path.c_str(), mode); if (!SendRequest(ID_SEND, path_and_mode)) { - Error("failed to send ID_SEND message '%s': %s", path_and_mode, strerror(errno)); + Error("failed to send ID_SEND message '%s': %s", path_and_mode.c_str(), + strerror(errno)); return false; } struct stat st; - if (stat(lpath, &st) == -1) { - Error("cannot stat '%s': %s", lpath, strerror(errno)); + if (stat(lpath.c_str(), &st) == -1) { + Error("cannot stat '%s': %s", lpath.c_str(), strerror(errno)); return false; } uint64_t total_size = st.st_size; uint64_t bytes_copied = 0; - unique_fd lfd(adb_open(lpath, O_RDONLY)); + unique_fd lfd(adb_open(lpath.c_str(), O_RDONLY)); if (lfd < 0) { - Error("opening '%s' locally failed: %s", lpath, strerror(errno)); + Error("opening '%s' locally failed: %s", lpath.c_str(), strerror(errno)); return false; } @@ -487,7 +480,7 @@ class SyncConnection { while (true) { int bytes_read = adb_read(lfd, sbuf.data, max - sizeof(SyncRequest)); if (bytes_read == -1) { - Error("reading '%s' locally failed: %s", lpath, strerror(errno)); + Error("reading '%s' locally failed: %s", lpath.c_str(), strerror(errno)); return false; } else if (bytes_read == 0) { break; @@ -499,55 +492,53 @@ class SyncConnection { RecordBytesTransferred(bytes_read); bytes_copied += bytes_read; - // Check to see if we've received an error from the other side. - if (ReceivedError(lpath, rpath)) { - break; - } - ReportProgress(rpath, bytes_copied, total_size); } syncmsg msg; msg.data.id = ID_DONE; msg.data.size = mtime; - expect_done_ = true; - - // RecordFilesTransferred gets called in CopyDone. + RecordFileSent(lpath, rpath); return WriteOrDie(lpath, rpath, &msg.data, sizeof(msg.data)); } - bool CopyDone(const char* from, const char* to) { + bool ReadAcknowledgments() { + bool result = true; + while (!deferred_acknowledgements_.empty()) { + auto [from, to] = std::move(deferred_acknowledgements_.front()); + deferred_acknowledgements_.pop_front(); + result &= CopyDone(from, to); + } + return result; + } + + bool CopyDone(const std::string& from, const std::string& to) { syncmsg msg; if (!ReadFdExactly(fd, &msg.status, sizeof(msg.status))) { - Error("failed to copy '%s' to '%s': couldn't read from device", from, to); + Error("failed to copy '%s' to '%s': couldn't read from device", from.c_str(), + to.c_str()); return false; } if (msg.status.id == ID_OKAY) { - if (expect_done_) { - expect_done_ = false; - RecordFilesTransferred(1); - return true; - } else { - Error("failed to copy '%s' to '%s': received premature success", from, to); - return true; - } + return true; } if (msg.status.id != ID_FAIL) { - Error("failed to copy '%s' to '%s': unknown reason %d", from, to, msg.status.id); + Error("failed to copy '%s' to '%s': unknown reason %d", from.c_str(), to.c_str(), + msg.status.id); return false; } return ReportCopyFailure(from, to, msg); } - bool ReportCopyFailure(const char* from, const char* to, const syncmsg& msg) { + bool ReportCopyFailure(const std::string& from, const std::string& to, const syncmsg& msg) { std::vector buf(msg.status.msglen + 1); if (!ReadFdExactly(fd, &buf[0], msg.status.msglen)) { - Error("failed to copy '%s' to '%s'; failed to read reason (!): %s", - from, to, strerror(errno)); + Error("failed to copy '%s' to '%s'; failed to read reason (!): %s", from.c_str(), + to.c_str(), strerror(errno)); return false; } buf[msg.status.msglen] = 0; - Error("failed to copy '%s' to '%s': remote %s", from, to, &buf[0]); + Error("failed to copy '%s' to '%s': remote %s", from.c_str(), to.c_str(), &buf[0]); return false; } @@ -616,7 +607,7 @@ class SyncConnection { size_t max; private: - bool expect_done_; + std::deque> deferred_acknowledgements_; FeatureSet features_; bool have_stat_v2_; bool have_ls_v2_; @@ -629,16 +620,19 @@ class SyncConnection { return SendRequest(ID_QUIT, ""); // TODO: add a SendResponse? } - bool WriteOrDie(const char* from, const char* to, const void* data, size_t data_length) { + bool WriteOrDie(const std::string& from, const std::string& to, const void* data, + size_t data_length) { if (!WriteFdExactly(fd, data, data_length)) { if (errno == ECONNRESET) { // Assume adbd told us why it was closing the connection, and // try to read failure reason from adbd. syncmsg msg; if (!ReadFdExactly(fd, &msg.status, sizeof(msg.status))) { - Error("failed to copy '%s' to '%s': no response: %s", from, to, strerror(errno)); + Error("failed to copy '%s' to '%s': no response: %s", from.c_str(), to.c_str(), + strerror(errno)); } else if (msg.status.id != ID_FAIL) { - Error("failed to copy '%s' to '%s': not ID_FAIL: %d", from, to, msg.status.id); + Error("failed to copy '%s' to '%s': not ID_FAIL: %d", from.c_str(), to.c_str(), + msg.status.id); } else { ReportCopyFailure(from, to, msg); } @@ -651,20 +645,20 @@ class SyncConnection { } }; -static bool sync_ls(SyncConnection& sc, const char* path, +static bool sync_ls(SyncConnection& sc, const std::string& path, const std::function& func) { return sc.SendLs(path) && sc.FinishLs(func); } -static bool sync_stat(SyncConnection& sc, const char* path, struct stat* st) { +static bool sync_stat(SyncConnection& sc, const std::string& path, struct stat* st) { return sc.SendStat(path) && sc.FinishStat(st); } -static bool sync_lstat(SyncConnection& sc, const char* path, struct stat* st) { +static bool sync_lstat(SyncConnection& sc, const std::string& path, struct stat* st) { return sc.SendLstat(path) && sc.FinishStat(st); } -static bool sync_stat_fallback(SyncConnection& sc, const char* path, struct stat* st) { +static bool sync_stat_fallback(SyncConnection& sc, const std::string& path, struct stat* st) { if (sync_stat(sc, path, st)) { return true; } @@ -688,7 +682,7 @@ static bool sync_stat_fallback(SyncConnection& sc, const char* path, struct stat struct stat tmp_st; st->st_mode &= ~S_IFMT; - if (sync_lstat(sc, dir_path.c_str(), &tmp_st)) { + if (sync_lstat(sc, dir_path, &tmp_st)) { st->st_mode |= S_IFDIR; } else { st->st_mode |= S_IFREG; @@ -697,10 +691,8 @@ static bool sync_stat_fallback(SyncConnection& sc, const char* path, struct stat return true; } -static bool sync_send(SyncConnection& sc, const char* lpath, const char* rpath, unsigned mtime, - mode_t mode, bool sync) { - std::string path_and_mode = android::base::StringPrintf("%s,%d", rpath, mode); - +static bool sync_send(SyncConnection& sc, const std::string& lpath, const std::string& rpath, + unsigned mtime, mode_t mode, bool sync) { if (sync) { struct stat st; if (sync_lstat(sc, rpath, &st)) { @@ -714,41 +706,40 @@ static bool sync_send(SyncConnection& sc, const char* lpath, const char* rpath, if (S_ISLNK(mode)) { #if !defined(_WIN32) char buf[PATH_MAX]; - ssize_t data_length = readlink(lpath, buf, PATH_MAX - 1); + ssize_t data_length = readlink(lpath.c_str(), buf, PATH_MAX - 1); if (data_length == -1) { - sc.Error("readlink '%s' failed: %s", lpath, strerror(errno)); + sc.Error("readlink '%s' failed: %s", lpath.c_str(), strerror(errno)); return false; } buf[data_length++] = '\0'; - if (!sc.SendSmallFile(path_and_mode.c_str(), lpath, rpath, mtime, buf, data_length)) { + if (!sc.SendSmallFile(rpath, mode, lpath, rpath, mtime, buf, data_length)) { return false; } - return sc.CopyDone(lpath, rpath); + return true; #endif } struct stat st; - if (stat(lpath, &st) == -1) { - sc.Error("failed to stat local file '%s': %s", lpath, strerror(errno)); + if (stat(lpath.c_str(), &st) == -1) { + sc.Error("failed to stat local file '%s': %s", lpath.c_str(), strerror(errno)); return false; } if (st.st_size < SYNC_DATA_MAX) { std::string data; if (!android::base::ReadFileToString(lpath, &data, true)) { - sc.Error("failed to read all of '%s': %s", lpath, strerror(errno)); + sc.Error("failed to read all of '%s': %s", lpath.c_str(), strerror(errno)); return false; } - if (!sc.SendSmallFile(path_and_mode.c_str(), lpath, rpath, mtime, - data.data(), data.size())) { + if (!sc.SendSmallFile(rpath, mode, lpath, rpath, mtime, data.data(), data.size())) { return false; } } else { - if (!sc.SendLargeFile(path_and_mode.c_str(), lpath, rpath, mtime)) { + if (!sc.SendLargeFile(rpath, mode, lpath, rpath, mtime)) { return false; } } - return sc.CopyDone(lpath, rpath); + return true; } static bool sync_recv(SyncConnection& sc, const char* rpath, const char* lpath, @@ -943,7 +934,7 @@ static bool copy_local_dir_remote(SyncConnection& sc, std::string lpath, if (check_timestamps) { for (const copyinfo& ci : file_list) { - if (!sc.SendLstat(ci.rpath.c_str())) { + if (!sc.SendLstat(ci.rpath)) { sc.Error("failed to send lstat"); return false; } @@ -965,7 +956,7 @@ static bool copy_local_dir_remote(SyncConnection& sc, std::string lpath, if (list_only) { sc.Println("would push: %s -> %s", ci.lpath.c_str(), ci.rpath.c_str()); } else { - if (!sync_send(sc, ci.lpath.c_str(), ci.rpath.c_str(), ci.time, ci.mode, false)) { + if (!sync_send(sc, ci.lpath, ci.rpath, ci.time, ci.mode, false)) { return false; } } @@ -1069,6 +1060,7 @@ bool do_sync_push(const std::vector& srcs, const char* dst, bool sy sc.ReportTransferRate(src_path, TransferDirection::push); } + success &= sc.ReadAcknowledgments(); sc.ReportOverallTransferRate(TransferDirection::push); return success; } From c7e257c1e9035d0ccc8138a475d9ab6b914bd0a7 Mon Sep 17 00:00:00 2001 From: Howard Chen Date: Sat, 15 Feb 2020 17:46:20 +0800 Subject: [PATCH 139/388] Convert gsid to use the dynamic AIDL service infrastructure Replace the original on demand start mechanism with the new dynamic AIDL service infrastructure to resolve a possible race condition. Bug: 149130673 Test: gsi_tool status Merged-In: Ia5f32579a8dcf62d700d974c7f4e3c65647f3b8b Change-Id: Ia5f32579a8dcf62d700d974c7f4e3c65647f3b8b --- fs_mgr/libfiemap/binder.cpp | 53 +++++++------------------------------ 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/fs_mgr/libfiemap/binder.cpp b/fs_mgr/libfiemap/binder.cpp index 96c36ed7c..5e29d4e26 100644 --- a/fs_mgr/libfiemap/binder.cpp +++ b/fs_mgr/libfiemap/binder.cpp @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -225,54 +224,22 @@ bool ImageManagerBinder::MapAllImages(const std::function AcquireIGsid(const std::chrono::milliseconds& timeout_ms) { - if (android::base::GetProperty("init.svc.gsid", "") != "running") { - if (!android::base::SetProperty("ctl.start", "gsid") || - !android::base::WaitForProperty("init.svc.gsid", "running", timeout_ms)) { - LOG(ERROR) << "Could not start the gsid service"; - return nullptr; - } - // Sleep for 250ms to give the service time to register. - usleep(250 * 1000); - } +static sp GetGsiService() { auto sm = android::defaultServiceManager(); auto name = android::String16(kGsiServiceName); - auto service = sm->checkService(name); - return android::interface_cast(service); -} - -static android::sp GetGsiService(const std::chrono::milliseconds& timeout_ms) { - auto start_time = std::chrono::steady_clock::now(); - - std::chrono::milliseconds elapsed = std::chrono::milliseconds::zero(); - do { - if (auto gsid = AcquireIGsid(timeout_ms - elapsed); gsid != nullptr) { - return gsid; - } - auto now = std::chrono::steady_clock::now(); - elapsed = std::chrono::duration_cast(now - start_time); - } while (elapsed <= timeout_ms); - - LOG(ERROR) << "Timed out trying to acquire IGsid interface"; + android::sp res = sm->waitForService(name); + if (res) { + return android::interface_cast(res); + } return nullptr; } -std::unique_ptr IImageManager::Open(const std::string& dir, - const std::chrono::milliseconds& timeout_ms) { - auto gsid = GetGsiService(timeout_ms); - if (!gsid) { - return nullptr; - } - - android::sp service; - auto status = gsid->getClient(&service); - if (!status.isOk() || !service) { - LOG(ERROR) << "Could not acquire IGsiService"; - return nullptr; - } - +std::unique_ptr IImageManager::Open( + const std::string& dir, const std::chrono::milliseconds& /*timeout_ms*/) { + android::sp service = GetGsiService(); android::sp manager; - status = service->openImageService(dir, &manager); + + auto status = service->openImageService(dir, &manager); if (!status.isOk() || !manager) { LOG(ERROR) << "Could not acquire IImageManager: " << status.exceptionMessage().string(); return nullptr; From 1588e9b0c22c0d014955fc60bbf4123ee4a23ee8 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Mon, 9 Mar 2020 12:43:18 -0700 Subject: [PATCH 140/388] liblog: minimum_log_priority should be atomic In case multiple threads try to reference this variable while it is being set, it should be atomic so that all threads always see a valid value. Bug: 150898477 Test: liblog, libbase unit tests Merged-In: If6c9e291f2471b96a752dc6e76e3e63458b71391 Change-Id: If6c9e291f2471b96a752dc6e76e3e63458b71391 (cherry picked from commit bbb16022c7d13e9cfc628bf0f3de4b40a3670679) --- liblog/logger_write.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/liblog/logger_write.cpp b/liblog/logger_write.cpp index cf82e0f26..454a13bde 100644 --- a/liblog/logger_write.cpp +++ b/liblog/logger_write.cpp @@ -27,6 +27,7 @@ #include #endif +#include #include #include @@ -148,11 +149,9 @@ void __android_log_set_default_tag(const char* tag) { GetDefaultTag().assign(tag, 0, LOGGER_ENTRY_MAX_PAYLOAD); } -static int minimum_log_priority = ANDROID_LOG_DEFAULT; +static std::atomic_int minimum_log_priority = ANDROID_LOG_DEFAULT; int __android_log_set_minimum_priority(int priority) { - int old_minimum_log_priority = minimum_log_priority; - minimum_log_priority = priority; - return old_minimum_log_priority; + return minimum_log_priority.exchange(priority, std::memory_order_relaxed); } int __android_log_get_minimum_priority() { From 060f58ad35d4e14ea364cd1bd42226cc437c94f7 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 5 Mar 2020 13:45:42 -0800 Subject: [PATCH 141/388] liblog: add API level guard to NDK log.h header Bug: 119867234 Test: build Merged-In: I6fdd7c070af06f04314b9bf7bbfede2a106e0d7c Change-Id: I6fdd7c070af06f04314b9bf7bbfede2a106e0d7c (cherry picked from commit 59e93a55fc1cbe0373bcb708469d73b5d22fc5a4) --- liblog/include/android/log.h | 57 +++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/liblog/include/android/log.h b/liblog/include/android/log.h index c98455dfa..1c4ec6422 100644 --- a/liblog/include/android/log.h +++ b/liblog/include/android/log.h @@ -56,6 +56,11 @@ #include #include +#include + +#if !defined(__BIONIC__) && !defined(__INTRODUCED_IN) +#define __INTRODUCED_IN(x) +#endif #ifdef __cplusplus extern "C" { @@ -190,6 +195,18 @@ struct __android_logger_data { unsigned int line; /* Optional line number, ignore if file is nullptr. */ }; +/** + * Prototype for the 'logger' function that is called for every log message. + */ +typedef void (*__android_logger_function)(const struct __android_logger_data* logger_data, + const char* message); +/** + * Prototype for the 'abort' function that is called when liblog will abort due to + * __android_log_assert() failures. + */ +typedef void (*__android_aborter_function)(const char* abort_message); + +#if __ANDROID_API__ >= 30 || !defined(__ANDROID__) /** * Writes the log message specified with logger_data and msg to the log. logger_data includes * additional file name and line number information that a logger may use. logger_data is versioned @@ -199,54 +216,44 @@ struct __android_logger_data { * buffers, then pass the message to liblog via this function, and therefore we do not want to * duplicate the loggability check here. */ -void __android_log_write_logger_data(struct __android_logger_data* logger_data, const char* msg); - -/** - * Prototype for the 'logger' function that is called for every log message. - */ -typedef void (*__android_logger_function)(const struct __android_logger_data* logger_data, - const char* message); +void __android_log_write_logger_data(struct __android_logger_data* logger_data, const char* msg) + __INTRODUCED_IN(30); /** * Sets a user defined logger function. All log messages sent to liblog will be set to the * function pointer specified by logger for processing. */ -void __android_log_set_logger(__android_logger_function logger); +void __android_log_set_logger(__android_logger_function logger) __INTRODUCED_IN(30); /** * Writes the log message to logd. This is an __android_logger_function and can be provided to * __android_log_set_logger(). It is the default logger when running liblog on a device. */ -void __android_log_logd_logger(const struct __android_logger_data* logger_data, const char* msg); +void __android_log_logd_logger(const struct __android_logger_data* logger_data, const char* msg) + __INTRODUCED_IN(30); /** * Writes the log message to stderr. This is an __android_logger_function and can be provided to * __android_log_set_logger(). It is the default logger when running liblog on host. */ void __android_log_stderr_logger(const struct __android_logger_data* logger_data, - const char* message); - -/** - * Prototype for the 'abort' function that is called when liblog will abort due to - * __android_log_assert() failures. - */ -typedef void (*__android_aborter_function)(const char* abort_message); + const char* message) __INTRODUCED_IN(30); /** * Sets a user defined aborter function that is called for __android_log_assert() failures. */ -void __android_log_set_aborter(__android_aborter_function aborter); +void __android_log_set_aborter(__android_aborter_function aborter) __INTRODUCED_IN(30); /** * Calls the stored aborter function. This allows for other logging libraries to use the same * aborter function by calling this function in liblog. */ -void __android_log_call_aborter(const char* abort_message); +void __android_log_call_aborter(const char* abort_message) __INTRODUCED_IN(30); /** * Sets android_set_abort_message() on device then aborts(). This is the default aborter. */ -void __android_log_default_aborter(const char* abort_message); +void __android_log_default_aborter(const char* abort_message) __INTRODUCED_IN(30); /** * Use the per-tag properties "log.tag." along with the minimum priority from @@ -260,28 +267,30 @@ void __android_log_default_aborter(const char* abort_message); * * prio is ANDROID_LOG_VERBOSE to ANDROID_LOG_FATAL. */ -int __android_log_is_loggable(int prio, const char* tag, int default_prio); -int __android_log_is_loggable_len(int prio, const char* tag, size_t len, int default_prio); +int __android_log_is_loggable(int prio, const char* tag, int default_prio) __INTRODUCED_IN(30); +int __android_log_is_loggable_len(int prio, const char* tag, size_t len, int default_prio) + __INTRODUCED_IN(30); /** * Sets the minimum priority that will be logged for this process. * * This returns the previous set minimum priority, or ANDROID_LOG_DEFAULT if none was set. */ -int __android_log_set_minimum_priority(int priority); +int __android_log_set_minimum_priority(int priority) __INTRODUCED_IN(30); /** * Gets the minimum priority that will be logged for this process. If none has been set by a * previous __android_log_set_minimum_priority() call, this returns ANDROID_LOG_DEFAULT. */ -int __android_log_get_minimum_priority(void); +int __android_log_get_minimum_priority(void) __INTRODUCED_IN(30); /** * Sets the default tag if no tag is provided when writing a log message. Defaults to * getprogname(). This truncates tag to the maximum log message size, though appropriate tags * should be much smaller. */ -void __android_log_set_default_tag(const char* tag); +void __android_log_set_default_tag(const char* tag) __INTRODUCED_IN(30); +#endif #ifdef __cplusplus } From 0c3d4843deb5b89d133894c4a57680f7106d3bb5 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Tue, 10 Mar 2020 09:07:14 -0700 Subject: [PATCH 142/388] Revert "Stop & Resume property service when switching to bootstrap namespace" Dependent change was reverted. This reverts commit 352ae2d225cd78248cdb0c5cbf829a49ed227e75. Bug: 150863651 Test: build Merged-In: I2e11b782fcd2b7baded133a841fdcf519f702b84 Change-Id: I2e11b782fcd2b7baded133a841fdcf519f702b84 --- init/mount_namespace.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/init/mount_namespace.cpp b/init/mount_namespace.cpp index 21750754e..aa368492d 100644 --- a/init/mount_namespace.cpp +++ b/init/mount_namespace.cpp @@ -323,20 +323,10 @@ bool SwitchToBootstrapMountNamespaceIfNeeded() { } if (bootstrap_ns_id != GetMountNamespaceId() && bootstrap_ns_fd.get() != -1 && IsApexUpdatable()) { - // The property service thread and its descendent threads must be in the correct mount - // namespace to call Service::Start(), however setns() only operates on a single thread and - // fails when secondary threads attempt to join the same mount namespace. Therefore, we - // must join the property service thread and its descendents before the setns() call. Those - // threads are then started again after the setns() call, and they'll be in the proper - // namespace. - PausePropertyService(); - if (setns(bootstrap_ns_fd.get(), CLONE_NEWNS) == -1) { PLOG(ERROR) << "Failed to switch to bootstrap mount namespace."; return false; } - - ResumePropertyService(); } return true; } From 01aa81cec546e625f13375f6d6929cbc77d64965 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Mon, 9 Mar 2020 14:35:57 +0900 Subject: [PATCH 143/388] don't include liblog to APEXes liblog is a platform library that provides stable C API. There is no need to include the library, especialy by statically linking to it, in any APEX. It not only wastes the storage/ram, but also is incorrect because the socket interface to logd which is implemented in liblog is not guaranteed to be stable. Fixing this issue by converting static_libs: ["liblog"] into shared_libs: ["liblog"], in which case the dependency to the library is satisfied via the stub variant of the library. As a result, we could restrict the availablity of the library to the platform and the runtime APEX. Exempt-From-Owner-Approval: already approved when this was in internal master (ag/10572699) Bug: http://b/151051671 Bug: http://b/150827719 Test: m Merged-In: I5aab863cb12b8767b6979255c247000a59355b0e (cherry picked from commit 95b6f45b0e09b45daf6a7999cef039fabf587327) Change-Id: I5aab863cb12b8767b6979255c247000a59355b0e --- adb/Android.bp | 2 +- liblog/Android.bp | 6 +++++- libstats/push_compat/Android.bp | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/adb/Android.bp b/adb/Android.bp index a26017fc2..137168609 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -575,7 +575,6 @@ cc_binary { "libcrypto_utils", "libcutils_sockets", "libdiagnose_usb", - "liblog", "libmdnssd", "libminijail", "libselinux", @@ -588,6 +587,7 @@ cc_binary { "libadbd_auth", "libadbd_fs", "libcrypto", + "liblog", ], target: { diff --git a/liblog/Android.bp b/liblog/Android.bp index f1e511868..841037066 100644 --- a/liblog/Android.bp +++ b/liblog/Android.bp @@ -117,8 +117,12 @@ cc_library { logtags: ["event.logtags"], compile_multilib: "both", apex_available: [ - "//apex_available:anyapex", "//apex_available:platform", + // liblog is exceptionally available to the runtime APEX + // because the dynamic linker has to use it statically. + // See b/151051671 + "com.android.runtime", + // DO NOT add more apex names here ], } diff --git a/libstats/push_compat/Android.bp b/libstats/push_compat/Android.bp index 3e695567a..28bc02b0e 100644 --- a/libstats/push_compat/Android.bp +++ b/libstats/push_compat/Android.bp @@ -35,6 +35,8 @@ cc_defaults { header_libs: ["libstatssocket_headers"], static_libs: [ "libbase", + ], + shared_libs: [ "liblog", "libutils", ], From f495fe798b180345371beec82e4aa74c5feb0dea Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 6 Mar 2020 17:36:05 +0000 Subject: [PATCH 144/388] fs_mgr_get_mounted_entry_for_userdata: handle logical partitions In case of GSI on DSU, /data is mounted on the following stack: userdata -> userdata_gsi -> actual block device, and fstab returned from ReadDefaultFstab() function will say that /data should be mounted onto userdata_gsi. This configuration wasn't supported. To support it, fs_mgr_get_mounted_entry_for_userdata now unwinds the dm-device stack /data is mounted onto, and for each entry in fstab resolves corresponding block device (in case of logical partitions by asking DeviceMapper to resolve name -> path, and for other cases by reading a symlink), and then checking whenever resolved block device belongs to the unwinded stack. Test: on both normal boot & DSU Test: atest CtsUserspaceRebootHostSideTestCases Test: atest CtsFsMgrTestCases Bug: 148612148 Change-Id: I1bb3e64ae92d56de905b4f7f1997b7499b101b0f --- fs_mgr/fs_mgr.cpp | 78 ++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 48 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 2e46b4f87..d509e7153 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -1589,76 +1589,58 @@ static bool fs_mgr_unmount_all_data_mounts(const std::string& block_device) { } } -static std::string ResolveBlockDevice(const std::string& block_device) { +static bool UnwindDmDeviceStack(const std::string& block_device, + std::vector* dm_stack) { if (!StartsWith(block_device, "/dev/block/")) { LWARNING << block_device << " is not a block device"; - return block_device; + return false; } - std::string name = block_device.substr(5); - if (!StartsWith(name, "block/dm-")) { - // Not a dm-device, but might be a symlink. Optimistically try to readlink. - std::string result; - if (Readlink(block_device, &result)) { - return result; - } else if (errno == EINVAL) { - // After all, it wasn't a symlink. - return block_device; - } else { - LERROR << "Failed to readlink " << block_device; - return ""; - } - } - // It's a dm-device, let's find what's inside! - std::string sys_dir = "/sys/" + name; + std::string current = block_device; + DeviceMapper& dm = DeviceMapper::Instance(); while (true) { - std::string slaves_dir = sys_dir + "/slaves"; - std::unique_ptr dir(opendir(slaves_dir.c_str()), closedir); - if (!dir) { - LERROR << "Failed to open " << slaves_dir; - return ""; + dm_stack->push_back(current); + if (!dm.IsDmBlockDevice(current)) { + break; } - std::string sub_device_name = ""; - for (auto entry = readdir(dir.get()); entry; entry = readdir(dir.get())) { - if (entry->d_type != DT_LNK) continue; - if (!sub_device_name.empty()) { - LERROR << "Too many slaves in " << slaves_dir; - return ""; - } - sub_device_name = entry->d_name; + auto parent = dm.GetParentBlockDeviceByPath(current); + if (!parent) { + return false; } - if (sub_device_name.empty()) { - LERROR << "No slaves in " << slaves_dir; - return ""; - } - if (!StartsWith(sub_device_name, "dm-")) { - // Not a dm-device! We can stop now. - return "/dev/block/" + sub_device_name; - } - // Still a dm-device, keep digging. - sys_dir = "/sys/block/" + sub_device_name; + current = *parent; } + return true; } FstabEntry* fs_mgr_get_mounted_entry_for_userdata(Fstab* fstab, const FstabEntry& mounted_entry) { - std::string resolved_block_device = ResolveBlockDevice(mounted_entry.blk_device); - if (resolved_block_device.empty()) { + if (mounted_entry.mount_point != "/data") { + LERROR << mounted_entry.mount_point << " is not /data"; + return nullptr; + } + std::vector dm_stack; + if (!UnwindDmDeviceStack(mounted_entry.blk_device, &dm_stack)) { + LERROR << "Failed to unwind dm-device stack for " << mounted_entry.blk_device; return nullptr; } - LINFO << "/data is mounted on " << resolved_block_device; for (auto& entry : *fstab) { if (entry.mount_point != "/data") { continue; } std::string block_device; - if (!Readlink(entry.blk_device, &block_device)) { - LWARNING << "Failed to readlink " << entry.blk_device; + if (entry.fs_mgr_flags.logical) { + if (!fs_mgr_update_logical_partition(&entry)) { + LERROR << "Failed to update logic partition " << entry.blk_device; + continue; + } + block_device = entry.blk_device; + } else if (!Readlink(entry.blk_device, &block_device)) { + PWARNING << "Failed to read link " << entry.blk_device; block_device = entry.blk_device; } - if (block_device == resolved_block_device) { + if (std::find(dm_stack.begin(), dm_stack.end(), block_device) != dm_stack.end()) { return &entry; } } - LERROR << "Didn't find entry that was used to mount /data"; + LERROR << "Didn't find entry that was used to mount /data onto " << mounted_entry.blk_device; return nullptr; } From 253b0729bc6e97e6a877fc98347e894c70dacb95 Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Wed, 12 Feb 2020 12:27:33 -0800 Subject: [PATCH 145/388] run ext4 tools in first_stage_ramdisk Bug: 149039306 Change-Id: I646960baa3c0d5a0dedda82b1fdc3816321aaa2e Merged-In: I646960baa3c0d5a0dedda82b1fdc3816321aaa2e Signed-off-by: Jaegeuk Kim --- libcutils/fs_config.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libcutils/fs_config.cpp b/libcutils/fs_config.cpp index c4e4f8574..5805a4d19 100644 --- a/libcutils/fs_config.cpp +++ b/libcutils/fs_config.cpp @@ -201,6 +201,8 @@ static const struct fs_path_config android_files[] = { CAP_MASK_LONG(CAP_SETGID), "system/bin/simpleperf_app_runner" }, { 00755, AID_ROOT, AID_ROOT, 0, "first_stage_ramdisk/system/bin/e2fsck" }, + { 00755, AID_ROOT, AID_ROOT, 0, "first_stage_ramdisk/system/bin/tune2fs" }, + { 00755, AID_ROOT, AID_ROOT, 0, "first_stage_ramdisk/system/bin/resize2fs" }, // generic defaults { 00755, AID_ROOT, AID_ROOT, 0, "bin/*" }, { 00640, AID_ROOT, AID_SHELL, 0, "fstab.*" }, From d1ee5085f3bb08e5ad6dca077c311c4538f406d0 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Mon, 9 Mar 2020 15:20:55 -0700 Subject: [PATCH 146/388] adbd: make libadbd_services cc_library again. For currently unknown reasons, sideloading is broken with libadbd_services as a cc_library_static. Partial revert of commit a9b62d545275ca32775a0bc5f004abe03aaa38ad. Bug: http://b/151056300 Test: xunchang@ tested manually Change-Id: Iaffad9c476ba0adcffc5db512ba4a7ee0fb5cb22 (cherry picked from commit 7f8a37c8c7b038f1ea1a91a0ab91c503dcf7d7e6) --- adb/Android.bp | 5 +++-- libcutils/Android.bp | 7 ++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/adb/Android.bp b/adb/Android.bp index a26017fc2..e02a54e64 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -429,7 +429,7 @@ cc_library_static { }, } -cc_library_static { +cc_library { name: "libadbd_services", defaults: ["adbd_defaults", "host_adbd_supported"], recovery_available: true, @@ -464,6 +464,7 @@ cc_library_static { "libbase", "libcrypto", "libcrypto_utils", + "libcutils_sockets", "liblog", ], @@ -515,6 +516,7 @@ cc_library { "libadb_tls_connection", "libadbd_auth", "libadbd_fs", + "libadbd_services", "libasyncio", "libbase", "libcrypto", @@ -533,7 +535,6 @@ cc_library { }, static_libs: [ - "libadbd_services", "libcutils_sockets", "libdiagnose_usb", "libmdnssd", diff --git a/libcutils/Android.bp b/libcutils/Android.bp index 4e93df370..fc06c1d1b 100644 --- a/libcutils/Android.bp +++ b/libcutils/Android.bp @@ -45,13 +45,9 @@ cc_library_headers { } // Socket specific parts of libcutils that are safe to statically link into an APEX. -cc_library_static { +cc_library { name: "libcutils_sockets", vendor_available: true, - vndk: { - enabled: true, - support_system_process: true, - }, recovery_available: true, host_supported: true, native_bridge_supported: true, @@ -62,6 +58,7 @@ cc_library_static { export_include_dirs: ["include"], + shared_libs: ["liblog"], srcs: ["sockets.cpp"], target: { linux_bionic: { From d8a38e7c230eec27ebfeaf2640765adfa508f25b Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 10 Mar 2020 12:18:11 -0700 Subject: [PATCH 147/388] Add OptimizeSourceCopyOperation ... so that an operation can be skipped partially. For example, if an operation contains blocks: 563412 -> 123456 ... then optimized operation is: 5612 -> 1256 Test: update_engine_unittests Test: apply incremental OTA Bug: 148623880 In an experiment, this reduces CoW size of an incremental update package by 200MB (out of 700MB). Change-Id: I86ca23fd589ddbc84c81318283b5f4e71782a759 Merged-In: I86ca23fd589ddbc84c81318283b5f4e71782a759 --- .../include/libsnapshot/snapshot.h | 3 +- fs_mgr/libsnapshot/partition_cow_creator.cpp | 80 +++++++++++++++--- .../partition_cow_creator_test.cpp | 81 +++++++++++++++++++ fs_mgr/libsnapshot/utility.cpp | 16 ++++ fs_mgr/libsnapshot/utility.h | 4 + 5 files changed, 170 insertions(+), 14 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 81f616ce6..eab3a160a 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -74,7 +74,8 @@ class SnapshotStatus; static constexpr const std::string_view kCowGroupName = "cow"; -bool SourceCopyOperationIsClone(const chromeos_update_engine::InstallOperation& operation); +bool OptimizeSourceCopyOperation(const chromeos_update_engine::InstallOperation& operation, + chromeos_update_engine::InstallOperation* optimized); enum class CreateResult : unsigned int { ERROR, diff --git a/fs_mgr/libsnapshot/partition_cow_creator.cpp b/fs_mgr/libsnapshot/partition_cow_creator.cpp index 61f5c0cab..efdb59f78 100644 --- a/fs_mgr/libsnapshot/partition_cow_creator.cpp +++ b/fs_mgr/libsnapshot/partition_cow_creator.cpp @@ -62,17 +62,68 @@ bool PartitionCowCreator::HasExtent(Partition* p, Extent* e) { return false; } -bool SourceCopyOperationIsClone(const InstallOperation& operation) { - using ChromeOSExtent = chromeos_update_engine::Extent; - if (operation.src_extents().size() != operation.dst_extents().size()) { +bool OptimizeSourceCopyOperation(const InstallOperation& operation, InstallOperation* optimized) { + if (operation.type() != InstallOperation::SOURCE_COPY) { return false; } - return std::equal(operation.src_extents().begin(), operation.src_extents().end(), - operation.dst_extents().begin(), - [](const ChromeOSExtent& src, const ChromeOSExtent& dst) { - return src.start_block() == dst.start_block() && - src.num_blocks() == dst.num_blocks(); - }); + + optimized->Clear(); + optimized->set_type(InstallOperation::SOURCE_COPY); + + const auto& src_extents = operation.src_extents(); + const auto& dst_extents = operation.dst_extents(); + + // If input is empty, skip by returning an empty result. + if (src_extents.empty() && dst_extents.empty()) { + return true; + } + + auto s_it = src_extents.begin(); + auto d_it = dst_extents.begin(); + uint64_t s_offset = 0; // offset within *s_it + uint64_t d_offset = 0; // offset within *d_it + bool is_optimized = false; + + while (s_it != src_extents.end() || d_it != dst_extents.end()) { + if (s_it == src_extents.end() || d_it == dst_extents.end()) { + LOG(ERROR) << "number of blocks do not equal in src_extents and dst_extents"; + return false; + } + if (s_it->num_blocks() <= s_offset || d_it->num_blocks() <= d_offset) { + LOG(ERROR) << "Offset goes out of bounds."; + return false; + } + + // Check the next |step| blocks, where |step| is the min of remaining blocks in the current + // source extent and current destination extent. + auto s_step = s_it->num_blocks() - s_offset; + auto d_step = d_it->num_blocks() - d_offset; + auto step = std::min(s_step, d_step); + + bool moved = s_it->start_block() + s_offset != d_it->start_block() + d_offset; + if (moved) { + // If the next |step| blocks are not copied to the same location, add them to result. + AppendExtent(optimized->mutable_src_extents(), s_it->start_block() + s_offset, step); + AppendExtent(optimized->mutable_dst_extents(), d_it->start_block() + d_offset, step); + } else { + // The next |step| blocks are optimized out. + is_optimized = true; + } + + // Advance offsets by |step|, and go to the next non-empty extent if the current extent is + // depleted. + s_offset += step; + d_offset += step; + while (s_it != src_extents.end() && s_offset >= s_it->num_blocks()) { + ++s_it; + s_offset = 0; + } + while (d_it != dst_extents.end() && d_offset >= d_it->num_blocks()) { + ++d_it; + d_offset = 0; + } + } + return is_optimized; } void WriteExtent(DmSnapCowSizeCalculator* sc, const chromeos_update_engine::Extent& de, @@ -101,12 +152,15 @@ uint64_t PartitionCowCreator::GetCowSize() { if (operations == nullptr) return sc.cow_size_bytes(); for (const auto& iop : *operations) { - // Do not allocate space for operations that are going to be skipped + const InstallOperation* written_op = &iop; + InstallOperation buf; + // Do not allocate space for extents that are going to be skipped // during OTA application. - if (iop.type() == InstallOperation::SOURCE_COPY && SourceCopyOperationIsClone(iop)) - continue; + if (iop.type() == InstallOperation::SOURCE_COPY && OptimizeSourceCopyOperation(iop, &buf)) { + written_op = &buf; + } - for (const auto& de : iop.dst_extents()) { + for (const auto& de : written_op->dst_extents()) { WriteExtent(&sc, de, sectors_per_block); } } diff --git a/fs_mgr/libsnapshot/partition_cow_creator_test.cpp b/fs_mgr/libsnapshot/partition_cow_creator_test.cpp index 9da3f0525..526f8749a 100644 --- a/fs_mgr/libsnapshot/partition_cow_creator_test.cpp +++ b/fs_mgr/libsnapshot/partition_cow_creator_test.cpp @@ -12,6 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include +#include + #include #include #include @@ -26,6 +29,13 @@ using namespace android::fs_mgr; +using chromeos_update_engine::InstallOperation; +using UeExtent = chromeos_update_engine::Extent; +using google::protobuf::RepeatedPtrField; +using ::testing::Matches; +using ::testing::Pointwise; +using ::testing::Truly; + namespace android { namespace snapshot { @@ -213,5 +223,76 @@ TEST(DmSnapshotInternals, CowSizeCalculator) { } } +void BlocksToExtents(const std::vector& blocks, + google::protobuf::RepeatedPtrField* extents) { + for (uint64_t block : blocks) { + AppendExtent(extents, block, 1); + } +} + +template +std::vector ExtentsToBlocks(const T& extents) { + std::vector blocks; + for (const auto& extent : extents) { + for (uint64_t offset = 0; offset < extent.num_blocks(); ++offset) { + blocks.push_back(extent.start_block() + offset); + } + } + return blocks; +} + +InstallOperation CreateCopyOp(const std::vector& src_blocks, + const std::vector& dst_blocks) { + InstallOperation op; + op.set_type(InstallOperation::SOURCE_COPY); + BlocksToExtents(src_blocks, op.mutable_src_extents()); + BlocksToExtents(dst_blocks, op.mutable_dst_extents()); + return op; +} + +// ExtentEqual(tuple) +MATCHER(ExtentEqual, "") { + auto&& [a, b] = arg; + return a.start_block() == b.start_block() && a.num_blocks() == b.num_blocks(); +} + +struct OptimizeOperationTestParam { + InstallOperation input; + std::optional expected_output; +}; + +class OptimizeOperationTest : public ::testing::TestWithParam {}; +TEST_P(OptimizeOperationTest, Test) { + InstallOperation actual_output; + EXPECT_EQ(GetParam().expected_output.has_value(), + OptimizeSourceCopyOperation(GetParam().input, &actual_output)) + << "OptimizeSourceCopyOperation should " + << (GetParam().expected_output.has_value() ? "succeed" : "fail"); + if (!GetParam().expected_output.has_value()) return; + EXPECT_THAT(actual_output.src_extents(), + Pointwise(ExtentEqual(), GetParam().expected_output->src_extents())); + EXPECT_THAT(actual_output.dst_extents(), + Pointwise(ExtentEqual(), GetParam().expected_output->dst_extents())); +} + +std::vector GetOptimizeOperationTestParams() { + return { + {CreateCopyOp({}, {}), CreateCopyOp({}, {})}, + {CreateCopyOp({1, 2, 4}, {1, 2, 4}), CreateCopyOp({}, {})}, + {CreateCopyOp({1, 2, 3}, {4, 5, 6}), std::nullopt}, + {CreateCopyOp({3, 2}, {1, 2}), CreateCopyOp({3}, {1})}, + {CreateCopyOp({5, 6, 3, 4, 1, 2}, {1, 2, 3, 4, 5, 6}), + CreateCopyOp({5, 6, 1, 2}, {1, 2, 5, 6})}, + {CreateCopyOp({1, 2, 3, 5, 5, 6}, {5, 6, 3, 4, 1, 2}), + CreateCopyOp({1, 2, 5, 5, 6}, {5, 6, 4, 1, 2})}, + {CreateCopyOp({1, 2, 5, 6, 9, 10}, {1, 4, 5, 6, 7, 8}), + CreateCopyOp({2, 9, 10}, {4, 7, 8})}, + {CreateCopyOp({2, 3, 3, 4, 4}, {1, 2, 3, 4, 5}), CreateCopyOp({2, 3, 4}, {1, 2, 5})}, + }; +} + +INSTANTIATE_TEST_CASE_P(Snapshot, OptimizeOperationTest, + ::testing::ValuesIn(GetOptimizeOperationTestParams())); + } // namespace snapshot } // namespace android diff --git a/fs_mgr/libsnapshot/utility.cpp b/fs_mgr/libsnapshot/utility.cpp index 3318b331e..d32b61eaa 100644 --- a/fs_mgr/libsnapshot/utility.cpp +++ b/fs_mgr/libsnapshot/utility.cpp @@ -34,6 +34,7 @@ using android::fs_mgr::GetEntryForPath; using android::fs_mgr::MetadataBuilder; using android::fs_mgr::Partition; using android::fs_mgr::ReadDefaultFstab; +using google::protobuf::RepeatedPtrField; namespace android { namespace snapshot { @@ -166,5 +167,20 @@ std::ostream& operator<<(std::ostream& os, const Now&) { return os << std::put_time(&now, "%Y%m%d-%H%M%S"); } +void AppendExtent(RepeatedPtrField* extents, uint64_t start_block, + uint64_t num_blocks) { + if (extents->size() > 0) { + auto last_extent = extents->rbegin(); + auto next_block = last_extent->start_block() + last_extent->num_blocks(); + if (start_block == next_block) { + last_extent->set_num_blocks(last_extent->num_blocks() + num_blocks); + return; + } + } + auto* new_extent = extents->Add(); + new_extent->set_start_block(start_block); + new_extent->set_num_blocks(num_blocks); +} + } // namespace snapshot } // namespace android diff --git a/fs_mgr/libsnapshot/utility.h b/fs_mgr/libsnapshot/utility.h index 90ad0fec7..e69bdadc9 100644 --- a/fs_mgr/libsnapshot/utility.h +++ b/fs_mgr/libsnapshot/utility.h @@ -125,5 +125,9 @@ bool WriteStringToFileAtomic(const std::string& content, const std::string& path struct Now {}; std::ostream& operator<<(std::ostream& os, const Now&); +// Append to |extents|. Merged into the last element if possible. +void AppendExtent(google::protobuf::RepeatedPtrField* extents, + uint64_t start_block, uint64_t num_blocks); + } // namespace snapshot } // namespace android From b6545b80a0d02b680068da7e376a4fe3be80e383 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Wed, 11 Mar 2020 09:56:15 -0700 Subject: [PATCH 148/388] init.rc: disable kernel module autoloading There is a longstanding bug where file-based encryption causes spurious SELinux denials of module_request because it uses the kernel's crypto API, and the crypto API tries to autoload kernel modules. While this sometimes indicate missing kconfig options, it can still happen even if all needed kconfig options are enabled. This is because a crypto algorithm can be a composition like "hmac(sha512)", and the crypto API will first look for the full composition before it instantiates it using the components like "hmac" and "sha512". But often an implementation of the full composition doesn't exist. However, as far as I can tell, Android doesn't actually use kernel module autoloading at all. First, Android never changes /proc/sys/kernel/modprobe from the default of "/sbin/modprobe", yet this isn't where modprobe is located on Android. Android's SELinux policy contains a neverallow rule that ensures that only init (not even vendor_init) can write to this setting, so vendors can't be changing it. Vendors could potentially be setting CONFIG_STATIC_USERMODEHELPER_PATH, which overrides the path of all usermode helpers including modprobe. But this is a relatively new kconfig option, available only in android-4.14 and later. Also, for a vendor to actually do this they'd also need to extend the SELinux policy with a domain_auto_trans rule to allow their usermode helper to be executed by the kernel. Android does increasingly use kernel modules, and GKI (Generic Kernel Image) will require them. However, the modules are actually inserted by userspace by 'init', not autoloaded. It's possible to disable kernel module autoloading completely by setting /proc/sys/kernel/modprobe to an empty string. So, let's do that. This prevents lots of spurious SELinux denials, and allows removing unnecessary rules to allow or dontaudit the module_request permission. Note: when the kernel doesn't have CONFIG_ANDROID_BINDERFS enabled, this change exposes a kernel bug that causes a WARNING in get_fs_type(). To avoid this WARNING, a kernel fix should be applied too -- currently under discussion upstream (https://lkml.kernel.org/r/20200310223731.126894-1-ebiggers@kernel.org). Bug: 130424539 Bug: 132409186 Bug: 144399145 Bug: 146477240 Bug: 148005188 Bug: 149542343 Test: Tested on cuttlefish and coral: - Checked that /proc/sys/kernel/modprobe contains /sbin/modprobe before this change, and the empty string after. - Checked that if all SELinux rules for module_request are removed, there are SELinux denials for module_request before this change but none after. - Ran lsmod both before and after and verified that the list is the same, i.e. checked that this change doesn't break how Android actually loads kernel modules. Change-Id: I4132fe1a491e7b789311afcf693c1f6493fb9dc5 Merged-In: I4132fe1a491e7b789311afcf693c1f6493fb9dc5 --- rootdir/init.rc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rootdir/init.rc b/rootdir/init.rc index ae9d6953c..4cb4c8b11 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -16,6 +16,11 @@ on early-init # Disable sysrq from keyboard write /proc/sys/kernel/sysrq 0 + # Android doesn't need kernel module autoloading, and it causes SELinux + # denials. So disable it by setting modprobe to the empty string. Note: to + # explicitly set a sysctl to an empty string, a trailing newline is needed. + write /proc/sys/kernel/modprobe \n + # Set the security context of /adb_keys if present. restorecon /adb_keys From e712eed24cb4b9c9e7f0e4237e353cfe6a9e714e Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Tue, 10 Mar 2020 19:13:18 -0700 Subject: [PATCH 149/388] Support atom-level annotations within AStatsEvent Refactors implementation details to allow for atom-level annotations. This CL does not change the API surface. addBoolAnnotation and addInt32Annotation work for both atom-level and proto field annotations. Test: bit libstatssocket_test:* Bug: 151158794 Change-Id: I2c340b201aeb3bcddd5cfde171b7c4df1d8d69a4 --- libstats/socket/include/stats_event.h | 16 +++--- libstats/socket/stats_event.c | 57 ++++++++++++---------- libstats/socket/tests/stats_event_test.cpp | 47 ++++++++++++++++-- 3 files changed, 81 insertions(+), 39 deletions(-) diff --git a/libstats/socket/include/stats_event.h b/libstats/socket/include/stats_event.h index ff842838b..35762989b 100644 --- a/libstats/socket/include/stats_event.h +++ b/libstats/socket/include/stats_event.h @@ -29,8 +29,9 @@ * AStatsEvent* event = AStatsEvent_obtain(); * * AStatsEvent_setAtomId(event, atomId); + * AStatsEvent_addBoolAnnotation(event, 5, false); // atom-level annotation * AStatsEvent_writeInt32(event, 24); - * AStatsEvent_addBoolAnnotation(event, 1, true); // annotations apply to the previous field + * AStatsEvent_addBoolAnnotation(event, 1, true); // annotation for preceding atom field * AStatsEvent_addInt32Annotation(event, 2, 128); * AStatsEvent_writeFloat(event, 2.0); * @@ -38,13 +39,8 @@ * AStatsEvent_write(event); * AStatsEvent_release(event); * - * Notes: - * (a) write_() and add__annotation() should be called in the order that fields - * and annotations are defined in the atom. - * (b) set_atom_id() can be called anytime before stats_event_write(). - * (c) add__annotation() calls apply to the previous field. - * (d) If errors occur, stats_event_write() will write a bitmask of the errors to the socket. - * (e) All strings should be encoded using UTF8. + * Note that calls to add atom fields and annotations should be made in the + * order that they are defined in the atom. */ #ifdef __cplusplus @@ -84,7 +80,7 @@ void AStatsEvent_build(AStatsEvent* event); int AStatsEvent_write(AStatsEvent* event); /** - * Frees the memory held by this StatsEvent + * Frees the memory held by this StatsEvent. * * After calling this, the StatsEvent must not be used or modified in any way. */ @@ -92,6 +88,8 @@ void AStatsEvent_release(AStatsEvent* event); /** * Sets the atom id for this StatsEvent. + * + * This function should be called immediately after AStatsEvent_obtain. **/ void AStatsEvent_setAtomId(AStatsEvent* event, uint32_t atomId); diff --git a/libstats/socket/stats_event.c b/libstats/socket/stats_event.c index b045d9341..24d2ea87e 100644 --- a/libstats/socket/stats_event.c +++ b/libstats/socket/stats_event.c @@ -29,7 +29,6 @@ #define POS_NUM_ELEMENTS 1 #define POS_TIMESTAMP (POS_NUM_ELEMENTS + sizeof(uint8_t)) #define POS_ATOM_ID (POS_TIMESTAMP + sizeof(uint8_t) + sizeof(uint64_t)) -#define POS_FIRST_FIELD (POS_ATOM_ID + sizeof(uint8_t) + sizeof(uint32_t)) /* LIMITS */ #define MAX_ANNOTATION_COUNT 15 @@ -66,8 +65,11 @@ // within a buf. Also includes other required fields. struct AStatsEvent { uint8_t* buf; - size_t lastFieldPos; // location of last field within the buf - size_t size; // number of valid bytes within buffer + // Location of last field within the buf. Here, field denotes either a + // metadata field (e.g. timestamp) or an atom field. + size_t lastFieldPos; + // Number of valid bytes within the buffer. + size_t size; uint32_t numElements; uint32_t atomId; uint32_t errors; @@ -85,20 +87,21 @@ static int64_t get_elapsed_realtime_ns() { AStatsEvent* AStatsEvent_obtain() { AStatsEvent* event = malloc(sizeof(AStatsEvent)); event->buf = (uint8_t*)calloc(MAX_EVENT_PAYLOAD, 1); - event->buf[0] = OBJECT_TYPE; + event->lastFieldPos = 0; + event->size = 2; // reserve first two bytes for outer event type and number of elements + event->numElements = 0; event->atomId = 0; event->errors = 0; event->truncate = true; // truncate for both pulled and pushed atoms event->built = false; - // place the timestamp - uint64_t timestampNs = get_elapsed_realtime_ns(); - event->buf[POS_TIMESTAMP] = INT64_TYPE; - memcpy(&event->buf[POS_TIMESTAMP + sizeof(uint8_t)], ×tampNs, sizeof(timestampNs)); + event->buf[0] = OBJECT_TYPE; + AStatsEvent_writeInt64(event, get_elapsed_realtime_ns()); // write the timestamp - event->numElements = 1; - event->lastFieldPos = 0; // 0 since we haven't written a field yet - event->size = POS_FIRST_FIELD; + // Force client to set atom id immediately (this is required for atom-level + // annotations to be written correctly). All atom field and annotation + // writes will fail until the atom id is set because event->errors != 0. + event->errors |= ERROR_NO_ATOM_ID; return event; } @@ -109,10 +112,12 @@ void AStatsEvent_release(AStatsEvent* event) { } void AStatsEvent_setAtomId(AStatsEvent* event, uint32_t atomId) { + if ((event->errors & ERROR_NO_ATOM_ID) == 0) return; + + // Clear the ERROR_NO_ATOM_ID bit. + event->errors &= ~ERROR_NO_ATOM_ID; event->atomId = atomId; - event->buf[POS_ATOM_ID] = INT32_TYPE; - memcpy(&event->buf[POS_ATOM_ID + sizeof(uint8_t)], &atomId, sizeof(atomId)); - event->numElements++; + AStatsEvent_writeInt32(event, atomId); } // Overwrites the timestamp populated in AStatsEvent_obtain with a custom @@ -306,23 +311,23 @@ void AStatsEvent_truncateBuffer(AStatsEvent* event, bool truncate) { void AStatsEvent_build(AStatsEvent* event) { if (event->built) return; - if (event->atomId == 0) event->errors |= ERROR_NO_ATOM_ID; - - if (event->numElements > MAX_BYTE_VALUE) { - event->errors |= ERROR_TOO_MANY_FIELDS; - } else { - event->buf[POS_NUM_ELEMENTS] = event->numElements; - } + if (event->numElements > MAX_BYTE_VALUE) event->errors |= ERROR_TOO_MANY_FIELDS; // If there are errors, rewrite buffer. if (event->errors) { - event->buf[POS_NUM_ELEMENTS] = 3; - event->buf[POS_FIRST_FIELD] = ERROR_TYPE; - memcpy(&event->buf[POS_FIRST_FIELD + sizeof(uint8_t)], &event->errors, - sizeof(event->errors)); - event->size = POS_FIRST_FIELD + sizeof(uint8_t) + sizeof(uint32_t); + // Discard everything after the atom id (including atom-level + // annotations). This leaves only two elements (timestamp and atom id). + event->numElements = 2; + // Reset number of atom-level annotations to 0. + event->buf[POS_ATOM_ID] = INT32_TYPE; + // Now, write errors to the buffer immediately after the atom id. + event->size = POS_ATOM_ID + sizeof(uint8_t) + sizeof(uint32_t); + start_field(event, ERROR_TYPE); + append_int32(event, event->errors); } + event->buf[POS_NUM_ELEMENTS] = event->numElements; + // Truncate the buffer to the appropriate length in order to limit our // memory usage. if (event->truncate) event->buf = (uint8_t*)realloc(event->buf, event->size); diff --git a/libstats/socket/tests/stats_event_test.cpp b/libstats/socket/tests/stats_event_test.cpp index 69d0a9b75..04eff3689 100644 --- a/libstats/socket/tests/stats_event_test.cpp +++ b/libstats/socket/tests/stats_event_test.cpp @@ -89,7 +89,7 @@ void checkAnnotation(uint8_t** buffer, uint8_t annotationId, uint8_t typeId, T a } void checkMetadata(uint8_t** buffer, uint8_t numElements, int64_t startTime, int64_t endTime, - uint32_t atomId) { + uint32_t atomId, uint8_t numAtomLevelAnnotations = 0) { // All events start with OBJECT_TYPE id. checkTypeHeader(buffer, OBJECT_TYPE); @@ -104,7 +104,7 @@ void checkMetadata(uint8_t** buffer, uint8_t numElements, int64_t startTime, int EXPECT_LE(timestamp, endTime); // Check atom id - checkTypeHeader(buffer, INT32_TYPE); + checkTypeHeader(buffer, INT32_TYPE, numAtomLevelAnnotations); checkScalar(buffer, atomId); } @@ -240,7 +240,7 @@ TEST(StatsEventTest, TestAttributionChains) { AStatsEvent_release(event); } -TEST(StatsEventTest, TestAnnotations) { +TEST(StatsEventTest, TestFieldAnnotations) { uint32_t atomId = 100; // first element information @@ -259,7 +259,7 @@ TEST(StatsEventTest, TestAnnotations) { int64_t startTime = android::elapsedRealtimeNano(); AStatsEvent* event = AStatsEvent_obtain(); - AStatsEvent_setAtomId(event, 100); + AStatsEvent_setAtomId(event, atomId); AStatsEvent_writeBool(event, boolValue); AStatsEvent_addBoolAnnotation(event, boolAnnotation1Id, boolAnnotation1Value); AStatsEvent_addInt32Annotation(event, boolAnnotation2Id, boolAnnotation2Value); @@ -292,6 +292,45 @@ TEST(StatsEventTest, TestAnnotations) { AStatsEvent_release(event); } +TEST(StatsEventTest, TestAtomLevelAnnotations) { + uint32_t atomId = 100; + // atom-level annotation information + uint8_t boolAnnotationId = 1; + uint8_t int32AnnotationId = 2; + bool boolAnnotationValue = false; + int32_t int32AnnotationValue = 5; + + float fieldValue = -3.5; + + int64_t startTime = android::elapsedRealtimeNano(); + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, atomId); + AStatsEvent_addBoolAnnotation(event, boolAnnotationId, boolAnnotationValue); + AStatsEvent_addInt32Annotation(event, int32AnnotationId, int32AnnotationValue); + AStatsEvent_writeFloat(event, fieldValue); + AStatsEvent_build(event); + int64_t endTime = android::elapsedRealtimeNano(); + + size_t bufferSize; + uint8_t* buffer = AStatsEvent_getBuffer(event, &bufferSize); + uint8_t* bufferEnd = buffer + bufferSize; + + checkMetadata(&buffer, /*numElements=*/1, startTime, endTime, atomId, + /*numAtomLevelAnnotations=*/2); + + // check atom-level annotations + checkAnnotation(&buffer, boolAnnotationId, BOOL_TYPE, boolAnnotationValue); + checkAnnotation(&buffer, int32AnnotationId, INT32_TYPE, int32AnnotationValue); + + // check first element + checkTypeHeader(&buffer, FLOAT_TYPE); + checkScalar(&buffer, fieldValue); + + EXPECT_EQ(buffer, bufferEnd); // ensure that we have read the entire buffer + EXPECT_EQ(AStatsEvent_getErrors(event), 0); + AStatsEvent_release(event); +} + TEST(StatsEventTest, TestNoAtomIdError) { AStatsEvent* event = AStatsEvent_obtain(); // Don't set the atom id in order to trigger the error. From 891893ba7b960cd8c646e9577f7f1dad4c94eb45 Mon Sep 17 00:00:00 2001 From: Kazuhiro Inaba Date: Wed, 12 Jun 2019 13:46:08 +0900 Subject: [PATCH 150/388] healthd: Don't take device-scoped battery as the main system battery. Some devices expose the battery state of stylus etc in sysfs, in addition to the whole system's main battery. Android only recognizes the first battery enumerated here. We need to filter out such HID-specific battery to let Android correctly monitor the main battery status. Bug: 136111013 Test: CtsBatterySavingTestCases on arcada Change-Id: I4cbf6e3bf883fb3d107bedd2849d8ad525538629 --- healthd/BatteryMonitor.cpp | 14 ++++++++++++++ healthd/include/healthd/BatteryMonitor.h | 1 + 2 files changed, 15 insertions(+) diff --git a/healthd/BatteryMonitor.cpp b/healthd/BatteryMonitor.cpp index 8e9e074ab..8b67e2268 100644 --- a/healthd/BatteryMonitor.cpp +++ b/healthd/BatteryMonitor.cpp @@ -233,6 +233,15 @@ int BatteryMonitor::getIntField(const String8& path) { return value; } +bool BatteryMonitor::isScopedPowerSupply(const char* name) { + constexpr char kScopeDevice[] = "Device"; + + String8 path; + path.appendFormat("%s/%s/scope", POWER_SUPPLY_SYSFS_PATH, name); + std::string scope; + return (readFromFile(path, &scope) > 0 && scope == kScopeDevice); +} + void BatteryMonitor::updateValues(void) { initHealthInfo(mHealthInfo.get()); @@ -547,6 +556,11 @@ void BatteryMonitor::init(struct healthd_config *hc) { break; case ANDROID_POWER_SUPPLY_TYPE_BATTERY: + // Some devices expose the battery status of sub-component like + // stylus. Such a device-scoped battery info needs to be skipped + // in BatteryMonitor, which is intended to report the status of + // the battery supplying the power to the whole system. + if (isScopedPowerSupply(name)) continue; mBatteryDevicePresent = true; if (mHealthdConfig->batteryStatusPath.isEmpty()) { diff --git a/healthd/include/healthd/BatteryMonitor.h b/healthd/include/healthd/BatteryMonitor.h index d41a374a6..fadb5a58c 100644 --- a/healthd/include/healthd/BatteryMonitor.h +++ b/healthd/include/healthd/BatteryMonitor.h @@ -78,6 +78,7 @@ class BatteryMonitor { PowerSupplyType readPowerSupplyType(const String8& path); bool getBooleanField(const String8& path); int getIntField(const String8& path); + bool isScopedPowerSupply(const char* name); }; }; // namespace android From 8ce4a3067c1f0bdb10262b93f0283b84c5ebe816 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Wed, 11 Mar 2020 14:00:33 +0900 Subject: [PATCH 151/388] Make libselinux a stub library libselinux is currently being copied to APEXes. This is risky because the library is not designed to be portable; part of it is tied to the specific version of the Android that it was developed for. This change fixes the problem by declaring that the library supports a stub with the list of C APIs that are included in the stub. Then there is only one copy of libselinux in /system/lib and other APEXes use the copy by dynamically linking to it. Also, adbd no longer statically links to it, because doing so brings libselinux in it. Bug: 151053366 Test: m com.android.adbd. It doesn't include libselinux in it. Test: m com.android.adbd-deps-info. then inspect out/soong/com.android.adbd-deps-info.txt. The dependency to libselinux is shown as '(external)'. Exempt-From-Owner-Approval: cherry-pick from AOSP Merged-In: If418cbe3abdeacb759d59052e6dca4c2067678dd (cherry picked from commit 3ffdad0cb5bbc3855af7705fee62e2be09583a17) Change-Id: If418cbe3abdeacb759d59052e6dca4c2067678dd --- adb/Android.bp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adb/Android.bp b/adb/Android.bp index 137168609..c2ca2cb76 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -577,7 +577,6 @@ cc_binary { "libdiagnose_usb", "libmdnssd", "libminijail", - "libselinux", "libssl", ], @@ -588,6 +587,7 @@ cc_binary { "libadbd_fs", "libcrypto", "liblog", + "libselinux", ], target: { From 33ac1b05f9e90e0ba99c49d31e2676c382695189 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Fri, 13 Mar 2020 08:39:31 -0700 Subject: [PATCH 152/388] Implement the new v4 signing scheme in adb To be submitted along with changes in apksigner tool and the framework. Merged to AOSP after that. Test: adb install --incremental go/apk-v4-signature-format Bug: b/151241461 Change-Id: I26e187f8e389e31e2759037057b96fc6c9cb1e94 --- adb/client/incremental.cpp | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/adb/client/incremental.cpp b/adb/client/incremental.cpp index 6499d4603..3ceb3748a 100644 --- a/adb/client/incremental.cpp +++ b/adb/client/incremental.cpp @@ -45,33 +45,29 @@ static inline int32_t read_int32(borrowed_fd fd) { return result; } -static inline int32_t read_be_int32(borrowed_fd fd) { - return int32_t(be32toh(read_int32(fd))); -} - static inline void append_int(borrowed_fd fd, std::vector* bytes) { - int32_t be_val = read_int32(fd); + int32_t le_val = read_int32(fd); auto old_size = bytes->size(); - bytes->resize(old_size + sizeof(be_val)); - memcpy(bytes->data() + old_size, &be_val, sizeof(be_val)); + bytes->resize(old_size + sizeof(le_val)); + memcpy(bytes->data() + old_size, &le_val, sizeof(le_val)); } static inline void append_bytes_with_size(borrowed_fd fd, std::vector* bytes) { - int32_t be_size = read_int32(fd); - int32_t size = int32_t(be32toh(be_size)); + int32_t le_size = read_int32(fd); + int32_t size = int32_t(le32toh(le_size)); auto old_size = bytes->size(); - bytes->resize(old_size + sizeof(be_size) + size); - memcpy(bytes->data() + old_size, &be_size, sizeof(be_size)); - ReadFully(fd, bytes->data() + old_size + sizeof(be_size), size); + bytes->resize(old_size + sizeof(le_size) + size); + memcpy(bytes->data() + old_size, &le_size, sizeof(le_size)); + ReadFully(fd, bytes->data() + old_size + sizeof(le_size), size); } static inline std::pair, int32_t> read_id_sig_headers(borrowed_fd fd) { std::vector result; append_int(fd, &result); // version - append_bytes_with_size(fd, &result); // verityRootHash - append_bytes_with_size(fd, &result); // v3Digest - append_bytes_with_size(fd, &result); // pkcs7SignatureBlock - auto tree_size = read_be_int32(fd); // size of the verity tree + append_bytes_with_size(fd, &result); // hashingInfo + append_bytes_with_size(fd, &result); // signingInfo + auto le_tree_size = read_int32(fd); + auto tree_size = int32_t(le32toh(le_tree_size)); // size of the verity tree return {std::move(result), tree_size}; } From 7c59f1ae9d097f2d5e6ad1c3d5aea52beb456547 Mon Sep 17 00:00:00 2001 From: Daniel Rosenberg Date: Fri, 28 Feb 2020 18:37:22 -0800 Subject: [PATCH 153/388] Set GC threshold when mounting with checkpointing This steps up our garbage collection threshold over time when mounting userdata with checkpointing=disable for f2fs. With this scheme, we step up the percent of disk we will tolerate being unusable during checkpointing. At 100%, the filesystem will be able to always mount. This means we will attempt to mount at most 10 times, for a max time of about 50 seconds. Also logs mount time under ro.boottime.init.mount.[target] If the device does not support checkpoint=disable:[n%], it will mount with checkpoint=disable, which is equivalent to checkpoint=disable:0% Test: Boot in checkpointing mode Bug: 150506496 Change-Id: I047ff98513f4ea832e1216b91e454a57fd2e8bf6 --- fs_mgr/fs_mgr.cpp | 28 ++++++++++++++++++++++++---- fs_mgr/include_fstab/fstab/fstab.h | 1 + 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index d509e7153..46018b955 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -737,15 +737,33 @@ static int __mount(const std::string& source, const std::string& target, const F unsigned long mountflags = entry.flags; int ret = 0; int save_errno = 0; + int gc_allowance = 0; + std::string opts; + bool try_f2fs_gc_allowance = is_f2fs(entry.fs_type) && entry.fs_checkpoint_opts.length() > 0; + Timer t; + do { + if (save_errno == EINVAL && try_f2fs_gc_allowance) { + PINFO << "Kernel does not support checkpoint=disable:[n]%, trying without."; + try_f2fs_gc_allowance = false; + } + if (try_f2fs_gc_allowance) { + opts = entry.fs_options + entry.fs_checkpoint_opts + ":" + + std::to_string(gc_allowance) + "%"; + } else { + opts = entry.fs_options; + } if (save_errno == EAGAIN) { PINFO << "Retrying mount (source=" << source << ",target=" << target - << ",type=" << entry.fs_type << ")=" << ret << "(" << save_errno << ")"; + << ",type=" << entry.fs_type << ", gc_allowance=" << gc_allowance << "%)=" << ret + << "(" << save_errno << ")"; } ret = mount(source.c_str(), target.c_str(), entry.fs_type.c_str(), mountflags, - entry.fs_options.c_str()); + opts.c_str()); save_errno = errno; - } while (ret && save_errno == EAGAIN); + if (try_f2fs_gc_allowance) gc_allowance += 10; + } while ((ret && save_errno == EAGAIN && gc_allowance <= 100) || + (ret && save_errno == EINVAL && try_f2fs_gc_allowance)); const char* target_missing = ""; const char* source_missing = ""; if (save_errno == ENOENT) { @@ -761,6 +779,8 @@ static int __mount(const std::string& source, const std::string& target, const F if ((ret == 0) && (mountflags & MS_RDONLY) != 0) { fs_mgr_set_blk_ro(source); } + android::base::SetProperty("ro.boottime.init.mount." + Basename(target), + std::to_string(t.duration().count())); errno = save_errno; return ret; } @@ -1075,7 +1095,7 @@ class CheckpointManager { bool UpdateCheckpointPartition(FstabEntry* entry, const std::string& block_device) { if (entry->fs_mgr_flags.checkpoint_fs) { if (is_f2fs(entry->fs_type)) { - entry->fs_options += ",checkpoint=disable"; + entry->fs_checkpoint_opts = ",checkpoint=disable"; } else { LERROR << entry->fs_type << " does not implement checkpoints."; } diff --git a/fs_mgr/include_fstab/fstab/fstab.h b/fs_mgr/include_fstab/fstab/fstab.h index 009c04c19..7cf4f8997 100644 --- a/fs_mgr/include_fstab/fstab/fstab.h +++ b/fs_mgr/include_fstab/fstab/fstab.h @@ -36,6 +36,7 @@ struct FstabEntry { std::string fs_type; unsigned long flags = 0; std::string fs_options; + std::string fs_checkpoint_opts; std::string key_loc; std::string metadata_key_dir; std::string metadata_encryption; From a9a6d49ec0304e5c5e42b29d89ffb6c173cff197 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 12 Mar 2020 11:07:07 -0700 Subject: [PATCH 154/388] liblog: use int32_t and uint32_t for new NDK APIs As requested during the API review. Bug: 150898477 Test: liblog and libbase unit tests Merged-In: I0c1dd57f7499e432bb881e1da1beb55f1ff7de05 Change-Id: I0c1dd57f7499e432bb881e1da1beb55f1ff7de05 (cherry picked from commit f1a975bece11df9ad900e0ddde0c9ec75e297d53) --- base/liblog_symbols.h | 4 ++-- base/logging.cpp | 16 ++++++++-------- liblog/include/android/log.h | 11 ++++++----- liblog/logger_name.cpp | 5 ++++- liblog/logger_write.cpp | 8 ++++---- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/base/liblog_symbols.h b/base/liblog_symbols.h index d3134e9c5..b4ab06a88 100644 --- a/base/liblog_symbols.h +++ b/base/liblog_symbols.h @@ -36,8 +36,8 @@ struct LibLogFunctions { void (*__android_log_set_aborter)(__android_aborter_function aborter); void (*__android_log_call_aborter)(const char* abort_message); void (*__android_log_default_aborter)(const char* abort_message); - int (*__android_log_set_minimum_priority)(int priority); - int (*__android_log_get_minimum_priority)(); + int32_t (*__android_log_set_minimum_priority)(int32_t priority); + int32_t (*__android_log_get_minimum_priority)(); void (*__android_log_set_default_tag)(const char* tag); }; diff --git a/base/logging.cpp b/base/logging.cpp index 9360a56d5..9a6e0fb7e 100644 --- a/base/logging.cpp +++ b/base/logging.cpp @@ -118,7 +118,7 @@ static int OpenKmsg() { } #endif -static LogId log_id_tToLogId(int buffer_id) { +static LogId log_id_tToLogId(int32_t buffer_id) { switch (buffer_id) { case LOG_ID_MAIN: return MAIN; @@ -134,7 +134,7 @@ static LogId log_id_tToLogId(int buffer_id) { } } -static int LogIdTolog_id_t(LogId log_id) { +static int32_t LogIdTolog_id_t(LogId log_id) { switch (log_id) { case MAIN: return LOG_ID_MAIN; @@ -171,7 +171,7 @@ static LogSeverity PriorityToLogSeverity(int priority) { } } -static android_LogPriority LogSeverityToPriority(LogSeverity severity) { +static int32_t LogSeverityToPriority(LogSeverity severity) { switch (severity) { case VERBOSE: return ANDROID_LOG_VERBOSE; @@ -333,12 +333,12 @@ LogdLogger::LogdLogger(LogId default_log_id) : default_log_id_(default_log_id) { void LogdLogger::operator()(LogId id, LogSeverity severity, const char* tag, const char* file, unsigned int line, const char* message) { - android_LogPriority priority = LogSeverityToPriority(severity); + int32_t priority = LogSeverityToPriority(severity); if (id == DEFAULT) { id = default_log_id_; } - int lg_id = LogIdTolog_id_t(id); + int32_t lg_id = LogIdTolog_id_t(id); char log_message_with_file[4068]; // LOGGER_ENTRY_MAX_PAYLOAD, not available in the NDK. if (priority == ANDROID_LOG_FATAL && file != nullptr) { @@ -574,7 +574,7 @@ std::ostream& LogMessage::stream() { void LogMessage::LogLine(const char* file, unsigned int line, LogSeverity severity, const char* tag, const char* message) { static auto& liblog_functions = GetLibLogFunctions(); - auto priority = LogSeverityToPriority(severity); + int32_t priority = LogSeverityToPriority(severity); if (liblog_functions) { __android_logger_data logger_data = { sizeof(__android_logger_data), LOG_ID_DEFAULT, priority, tag, file, line}; @@ -608,7 +608,7 @@ bool ShouldLog(LogSeverity severity, const char* tag) { // we need to fall back to using gMinimumLogSeverity, since __android_log_is_loggable() will not // take into consideration the value from SetMinimumLogSeverity(). if (liblog_functions) { - int priority = LogSeverityToPriority(severity); + int32_t priority = LogSeverityToPriority(severity); return __android_log_is_loggable(priority, tag, ANDROID_LOG_INFO); } else { return severity >= gMinimumLogSeverity; @@ -618,7 +618,7 @@ bool ShouldLog(LogSeverity severity, const char* tag) { LogSeverity SetMinimumLogSeverity(LogSeverity new_severity) { static auto& liblog_functions = GetLibLogFunctions(); if (liblog_functions) { - auto priority = LogSeverityToPriority(new_severity); + int32_t priority = LogSeverityToPriority(new_severity); return PriorityToLogSeverity(liblog_functions->__android_log_set_minimum_priority(priority)); } else { LogSeverity old_severity = gMinimumLogSeverity; diff --git a/liblog/include/android/log.h b/liblog/include/android/log.h index 1c4ec6422..b3324a305 100644 --- a/liblog/include/android/log.h +++ b/liblog/include/android/log.h @@ -56,6 +56,7 @@ #include #include +#include #include #if !defined(__BIONIC__) && !defined(__INTRODUCED_IN) @@ -188,11 +189,11 @@ int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fm */ struct __android_logger_data { size_t struct_size; /* Must be set to sizeof(__android_logger_data) and is used for versioning. */ - int buffer_id; /* log_id_t or -1 to represent 'default'. */ - int priority; /* android_LogPriority values. */ + int32_t buffer_id; /* log_id_t or -1 to represent 'default'. */ + int32_t priority; /* android_LogPriority values. */ const char* tag; const char* file; /* Optional file name, may be set to nullptr. */ - unsigned int line; /* Optional line number, ignore if file is nullptr. */ + uint32_t line; /* Optional line number, ignore if file is nullptr. */ }; /** @@ -276,13 +277,13 @@ int __android_log_is_loggable_len(int prio, const char* tag, size_t len, int def * * This returns the previous set minimum priority, or ANDROID_LOG_DEFAULT if none was set. */ -int __android_log_set_minimum_priority(int priority) __INTRODUCED_IN(30); +int32_t __android_log_set_minimum_priority(int32_t priority) __INTRODUCED_IN(30); /** * Gets the minimum priority that will be logged for this process. If none has been set by a * previous __android_log_set_minimum_priority() call, this returns ANDROID_LOG_DEFAULT. */ -int __android_log_get_minimum_priority(void) __INTRODUCED_IN(30); +int32_t __android_log_get_minimum_priority(void) __INTRODUCED_IN(30); /** * Sets the default tag if no tag is provided when writing a log message. Defaults to diff --git a/liblog/logger_name.cpp b/liblog/logger_name.cpp index 7d676f4b0..e72290ed1 100644 --- a/liblog/logger_name.cpp +++ b/liblog/logger_name.cpp @@ -41,7 +41,10 @@ const char* android_log_id_to_name(log_id_t log_id) { } static_assert(std::is_same::type, uint32_t>::value, - "log_id_t must be an unsigned int"); + "log_id_t must be an uint32_t"); + +static_assert(std::is_same::type, uint32_t>::value, + "log_id_t must be an uint32_t"); log_id_t android_name_to_log_id(const char* logName) { const char* b; diff --git a/liblog/logger_write.cpp b/liblog/logger_write.cpp index 454a13bde..b420fa024 100644 --- a/liblog/logger_write.cpp +++ b/liblog/logger_write.cpp @@ -149,12 +149,12 @@ void __android_log_set_default_tag(const char* tag) { GetDefaultTag().assign(tag, 0, LOGGER_ENTRY_MAX_PAYLOAD); } -static std::atomic_int minimum_log_priority = ANDROID_LOG_DEFAULT; -int __android_log_set_minimum_priority(int priority) { +static std::atomic_int32_t minimum_log_priority = ANDROID_LOG_DEFAULT; +int32_t __android_log_set_minimum_priority(int32_t priority) { return minimum_log_priority.exchange(priority, std::memory_order_relaxed); } -int __android_log_get_minimum_priority() { +int32_t __android_log_get_minimum_priority() { return minimum_log_priority; } @@ -267,7 +267,7 @@ void __android_log_stderr_logger(const struct __android_logger_data* logger_data static const char log_characters[] = "XXVDIWEF"; static_assert(arraysize(log_characters) - 1 == ANDROID_LOG_SILENT, "Mismatch in size of log_characters and values in android_LogPriority"); - int priority = + int32_t priority = logger_data->priority > ANDROID_LOG_SILENT ? ANDROID_LOG_FATAL : logger_data->priority; char priority_char = log_characters[priority]; uint64_t tid = GetThreadId(); From bc2e58d6c2c5092044d422e03dcff69d316cb741 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 12 Mar 2020 11:14:19 -0700 Subject: [PATCH 155/388] liblog: move LOG_ID_DEFAULT into the log_id enum As requested during the API review. Bug: 150898477 Test: liblog and libbase unit tests Merged-In: Id67203bbfbc3e116b6b6efd40428afe48203dcfc Change-Id: Id67203bbfbc3e116b6b6efd40428afe48203dcfc (cherry picked from commit 6085cd5a645f95dca9fd80ca8df9dc0c26cf5969) --- liblog/include/android/log.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/liblog/include/android/log.h b/liblog/include/android/log.h index b3324a305..4ce8038df 100644 --- a/liblog/include/android/log.h +++ b/liblog/include/android/log.h @@ -155,14 +155,11 @@ typedef enum log_id { /** The kernel log buffer. */ LOG_ID_KERNEL = 7, - LOG_ID_MAX -} log_id_t; + LOG_ID_MAX, -/** - * Let the logging function choose the best log target. - * This is not part of the enum since adding either -1 or 0xFFFFFFFF forces the enum to be signed or - * unsigned, which breaks unfortunately common arithmetic against LOG_ID_MIN and LOG_ID_MAX. */ -#define LOG_ID_DEFAULT -1 + /** Let the logging function choose the best log target. */ + LOG_ID_DEFAULT = 0x7FFFFFFF +} log_id_t; /** * Writes the constant string `text` to the log buffer `id`, From 1dc67f30151d5356dc834de12a3d6b1bb0d6a219 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 12 Mar 2020 09:37:05 -0700 Subject: [PATCH 156/388] liblog: fix header guards ordering __ANDROID_API__ isn't defined on host, so this check will fail due to -Wundef. The || is short circuited through, so we can check for host first and only have the right side of the || evaluated for device builds. Bug: 150898477 Bug: 151255209 Test: build Merged-In: I2e0bc055ac0c7ba8262875801cdaed9cc30d2cef Change-Id: I2e0bc055ac0c7ba8262875801cdaed9cc30d2cef (cherry picked from commit 227ac5645450bca279735a2a0dbba77c24f5fbb4) --- liblog/include/android/log.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liblog/include/android/log.h b/liblog/include/android/log.h index 1c4ec6422..5050eeb86 100644 --- a/liblog/include/android/log.h +++ b/liblog/include/android/log.h @@ -206,7 +206,7 @@ typedef void (*__android_logger_function)(const struct __android_logger_data* lo */ typedef void (*__android_aborter_function)(const char* abort_message); -#if __ANDROID_API__ >= 30 || !defined(__ANDROID__) +#if !defined(__ANDROID__) || __ANDROID_API__ >= 30 /** * Writes the log message specified with logger_data and msg to the log. logger_data includes * additional file name and line number information that a logger may use. logger_data is versioned From c1e763a95b3c7b5eab5b1dbbb7638e8debbc1c9c Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Wed, 11 Mar 2020 19:21:20 -0700 Subject: [PATCH 157/388] freezer: allow dynamic changes to freezer.state create new profiles to allowing thawing and freezing back the freezer cgroup Bug: 151225245 Test: Manually verified that using the SetTaskProfiles method on the profiles thaws and freezes back the freezer cgroup. Change-Id: I7f3e193ebe79b49c1f6ac52b6138ff4ec26fc570 --- libprocessgroup/profiles/task_profiles.json | 31 +++++++++++++++++++++ rootdir/init.rc | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/libprocessgroup/profiles/task_profiles.json b/libprocessgroup/profiles/task_profiles.json index 3f085357e..0cee6bbfd 100644 --- a/libprocessgroup/profiles/task_profiles.json +++ b/libprocessgroup/profiles/task_profiles.json @@ -49,6 +49,11 @@ "Name": "UClampMax", "Controller": "cpu", "File": "cpu.uclamp.max" + }, + { + "Name": "FreezerState", + "Controller": "freezer", + "File": "frozen/freezer.state" } ], @@ -518,6 +523,32 @@ } } ] + }, + { + "Name": "FreezerThawed", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "FreezerState", + "Value": "THAWED" + } + } + ] + }, + { + "Name": "FreezerFrozen", + "Actions": [ + { + "Name": "SetAttribute", + "Params": + { + "Name": "FreezerState", + "Value": "FROZEN" + } + } + ] } ], diff --git a/rootdir/init.rc b/rootdir/init.rc index 201fb128d..324fa19e0 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -324,7 +324,7 @@ on init chown system system /dev/freezer/frozen/freezer.state chown system system /dev/freezer/frozen/cgroup.procs - chmod 0444 /dev/freezer/frozen/freezer.state + chmod 0664 /dev/freezer/frozen/freezer.state # make the PSI monitor accessible to others chown system system /proc/pressure/memory From 0188274148f1462bfdc1c95457a44e2458fffa5a Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Tue, 10 Mar 2020 09:08:02 -0700 Subject: [PATCH 158/388] Revert "init: handle property service callbacks asynchronously" This is apparently causing problems with reboot. This reverts commit d2dab830d3ec260ccd982d147d4eb0ef74071261. Bug: 150863651 Test: build Merged-In: Ib8a4835cdc8358a54c7acdebc5c95038963a0419 Change-Id: Ib8a4835cdc8358a54c7acdebc5c95038963a0419 --- init/Android.bp | 2 - init/action_manager.cpp | 22 +-- init/action_manager.h | 7 +- init/builtins.cpp | 15 -- init/init.cpp | 279 ++++++++++++++---------------------- init/init.h | 3 - init/init_test.cpp | 1 - init/lmkd_service.cpp | 3 +- init/mount_namespace.cpp | 11 -- init/property_service.cpp | 202 +++++++------------------- init/property_service.h | 2 - init/property_service.proto | 1 - init/reboot.cpp | 8 +- init/service.h | 14 +- init/service_list.h | 30 ++-- init/service_lock.cpp | 25 ---- init/service_lock.h | 40 ------ init/service_parser.cpp | 2 - init/sigchld_handler.cpp | 2 - 19 files changed, 191 insertions(+), 478 deletions(-) delete mode 100644 init/service_lock.cpp delete mode 100644 init/service_lock.h diff --git a/init/Android.bp b/init/Android.bp index 52628f372..3bb08db6c 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -28,7 +28,6 @@ init_common_sources = [ "rlimit_parser.cpp", "service.cpp", "service_list.cpp", - "service_lock.cpp", "service_parser.cpp", "service_utils.cpp", "subcontext.cpp", @@ -82,7 +81,6 @@ cc_defaults { "-Wextra", "-Wno-unused-parameter", "-Werror", - "-Wthread-safety", "-DALLOW_FIRST_STAGE_CONSOLE=0", "-DALLOW_LOCAL_PROP_OVERRIDE=0", "-DALLOW_PERMISSIVE_SELINUX=0", diff --git a/init/action_manager.cpp b/init/action_manager.cpp index b45f5cd18..ebca762ca 100644 --- a/init/action_manager.cpp +++ b/init/action_manager.cpp @@ -41,12 +41,10 @@ void ActionManager::AddAction(std::unique_ptr action) { } void ActionManager::QueueEventTrigger(const std::string& trigger) { - auto lock = std::lock_guard{event_queue_lock_}; event_queue_.emplace(trigger); } void ActionManager::QueuePropertyChange(const std::string& name, const std::string& value) { - auto lock = std::lock_guard{event_queue_lock_}; event_queue_.emplace(std::make_pair(name, value)); } @@ -55,7 +53,6 @@ void ActionManager::QueueAllPropertyActions() { } void ActionManager::QueueBuiltinAction(BuiltinFunction func, const std::string& name) { - auto lock = std::lock_guard{event_queue_lock_}; auto action = std::make_unique(true, nullptr, "", 0, name, std::map{}); action->AddCommand(std::move(func), {name}, 0); @@ -65,18 +62,15 @@ void ActionManager::QueueBuiltinAction(BuiltinFunction func, const std::string& } void ActionManager::ExecuteOneCommand() { - { - auto lock = std::lock_guard{event_queue_lock_}; - // Loop through the event queue until we have an action to execute - while (current_executing_actions_.empty() && !event_queue_.empty()) { - for (const auto& action : actions_) { - if (std::visit([&action](const auto& event) { return action->CheckEvent(event); }, - event_queue_.front())) { - current_executing_actions_.emplace(action.get()); - } + // Loop through the event queue until we have an action to execute + while (current_executing_actions_.empty() && !event_queue_.empty()) { + for (const auto& action : actions_) { + if (std::visit([&action](const auto& event) { return action->CheckEvent(event); }, + event_queue_.front())) { + current_executing_actions_.emplace(action.get()); } - event_queue_.pop(); } + event_queue_.pop(); } if (current_executing_actions_.empty()) { @@ -109,7 +103,6 @@ void ActionManager::ExecuteOneCommand() { } bool ActionManager::HasMoreCommands() const { - auto lock = std::lock_guard{event_queue_lock_}; return !current_executing_actions_.empty() || !event_queue_.empty(); } @@ -120,7 +113,6 @@ void ActionManager::DumpState() const { } void ActionManager::ClearQueue() { - auto lock = std::lock_guard{event_queue_lock_}; // We are shutting down so don't claim the oneshot builtin actions back current_executing_actions_ = {}; event_queue_ = {}; diff --git a/init/action_manager.h b/init/action_manager.h index b6f93d9b5..a2b95acad 100644 --- a/init/action_manager.h +++ b/init/action_manager.h @@ -16,12 +16,9 @@ #pragma once -#include #include #include -#include - #include "action.h" #include "builtins.h" @@ -51,9 +48,7 @@ class ActionManager { void operator=(ActionManager const&) = delete; std::vector> actions_; - std::queue> event_queue_ - GUARDED_BY(event_queue_lock_); - mutable std::mutex event_queue_lock_; + std::queue> event_queue_; std::queue current_executing_actions_; std::size_t current_command_; }; diff --git a/init/builtins.cpp b/init/builtins.cpp index dd5af72b1..200bfff7d 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -151,7 +151,6 @@ static Result reboot_into_recovery(const std::vector& options template static void ForEachServiceInClass(const std::string& classname, F function) { - auto lock = std::lock_guard{service_lock}; for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(classname)) std::invoke(function, service); } @@ -163,7 +162,6 @@ static Result do_class_start(const BuiltinArguments& args) { return {}; // Starting a class does not start services which are explicitly disabled. // They must be started individually. - auto lock = std::lock_guard{service_lock}; for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(args[1])) { if (auto result = service->StartIfNotDisabled(); !result.ok()) { @@ -186,7 +184,6 @@ static Result do_class_start_post_data(const BuiltinArguments& args) { // stopped either. return {}; } - auto lock = std::lock_guard{service_lock}; for (const auto& service : ServiceList::GetInstance()) { if (service->classnames().count(args[1])) { if (auto result = service->StartIfPostData(); !result.ok()) { @@ -237,7 +234,6 @@ static Result do_domainname(const BuiltinArguments& args) { } static Result do_enable(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindService(args[1]); if (!svc) return Error() << "Could not find service"; @@ -249,7 +245,6 @@ static Result do_enable(const BuiltinArguments& args) { } static Result do_exec(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; auto service = Service::MakeTemporaryOneshotService(args.args); if (!service.ok()) { return Error() << "Could not create exec service: " << service.error(); @@ -263,7 +258,6 @@ static Result do_exec(const BuiltinArguments& args) { } static Result do_exec_background(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; auto service = Service::MakeTemporaryOneshotService(args.args); if (!service.ok()) { return Error() << "Could not create exec background service: " << service.error(); @@ -277,7 +271,6 @@ static Result do_exec_background(const BuiltinArguments& args) { } static Result do_exec_start(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; Service* service = ServiceList::GetInstance().FindService(args[1]); if (!service) { return Error() << "Service not found"; @@ -347,7 +340,6 @@ static Result do_insmod(const BuiltinArguments& args) { } static Result do_interface_restart(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindInterface(args[1]); if (!svc) return Error() << "interface " << args[1] << " not found"; svc->Restart(); @@ -355,7 +347,6 @@ static Result do_interface_restart(const BuiltinArguments& args) { } static Result do_interface_start(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindInterface(args[1]); if (!svc) return Error() << "interface " << args[1] << " not found"; if (auto result = svc->Start(); !result.ok()) { @@ -365,7 +356,6 @@ static Result do_interface_start(const BuiltinArguments& args) { } static Result do_interface_stop(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindInterface(args[1]); if (!svc) return Error() << "interface " << args[1] << " not found"; svc->Stop(); @@ -750,7 +740,6 @@ static Result do_setrlimit(const BuiltinArguments& args) { } static Result do_start(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindService(args[1]); if (!svc) return Error() << "service " << args[1] << " not found"; if (auto result = svc->Start(); !result.ok()) { @@ -760,7 +749,6 @@ static Result do_start(const BuiltinArguments& args) { } static Result do_stop(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindService(args[1]); if (!svc) return Error() << "service " << args[1] << " not found"; svc->Stop(); @@ -768,7 +756,6 @@ static Result do_stop(const BuiltinArguments& args) { } static Result do_restart(const BuiltinArguments& args) { - auto lock = std::lock_guard{service_lock}; Service* svc = ServiceList::GetInstance().FindService(args[1]); if (!svc) return Error() << "service " << args[1] << " not found"; svc->Restart(); @@ -1124,7 +1111,6 @@ static Result ExecWithFunctionOnFailure(const std::vector& ar function(StringPrintf("Exec service failed, status %d", siginfo.si_status)); } }); - auto lock = std::lock_guard{service_lock}; if (auto result = (*service)->ExecStart(); !result.ok()) { function("ExecStart failed: " + result.error().message()); } @@ -1264,7 +1250,6 @@ static Result parse_apex_configs() { } success &= parser.ParseConfigFile(c); } - auto lock = std::lock_guard{service_lock}; ServiceList::GetInstance().MarkServicesUpdate(); if (success) { return {}; diff --git a/init/init.cpp b/init/init.cpp index b0f929c7b..a7518fc2f 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -33,9 +33,7 @@ #include #include #include -#include #include -#include #include #include @@ -97,148 +95,15 @@ static int property_triggers_enabled = 0; static int signal_fd = -1; static int property_fd = -1; +static std::unique_ptr waiting_for_prop(nullptr); +static std::string wait_prop_name; +static std::string wait_prop_value; +static std::string shutdown_command; +static bool do_shutdown = false; + static std::unique_ptr subcontext; -// Init epolls various FDs to wait for various inputs. It previously waited on property changes -// with a blocking socket that contained the information related to the change, however, it was easy -// to fill that socket and deadlock the system. Now we use locks to handle the property changes -// directly in the property thread, however we still must wake the epoll to inform init that there -// is a change to process, so we use this FD. It is non-blocking, since we do not care how many -// times WakeEpoll() is called, only that the epoll will wake. -static int wake_epoll_fd = -1; -static void InstallInitNotifier(Epoll* epoll) { - int sockets[2]; - if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, sockets) != 0) { - PLOG(FATAL) << "Failed to socketpair() between property_service and init"; - } - int epoll_fd = sockets[0]; - wake_epoll_fd = sockets[1]; - - auto drain_socket = [epoll_fd] { - char buf[512]; - while (read(epoll_fd, buf, sizeof(buf)) > 0) { - } - }; - - if (auto result = epoll->RegisterHandler(epoll_fd, drain_socket); !result) { - LOG(FATAL) << result.error(); - } -} - -static void WakeEpoll() { - constexpr char value[] = "1"; - write(wake_epoll_fd, value, sizeof(value)); -} - -static class PropWaiterState { - public: - bool StartWaiting(const char* name, const char* value) { - auto lock = std::lock_guard{lock_}; - if (waiting_for_prop_) { - return false; - } - if (GetProperty(name, "") != value) { - // Current property value is not equal to expected value - wait_prop_name_ = name; - wait_prop_value_ = value; - waiting_for_prop_.reset(new Timer()); - } else { - LOG(INFO) << "start_waiting_for_property(\"" << name << "\", \"" << value - << "\"): already set"; - } - return true; - } - - void ResetWaitForProp() { - auto lock = std::lock_guard{lock_}; - ResetWaitForPropLocked(); - } - - void CheckAndResetWait(const std::string& name, const std::string& value) { - auto lock = std::lock_guard{lock_}; - // We always record how long init waited for ueventd to tell us cold boot finished. - // If we aren't waiting on this property, it means that ueventd finished before we even - // started to wait. - if (name == kColdBootDoneProp) { - auto time_waited = waiting_for_prop_ ? waiting_for_prop_->duration().count() : 0; - std::thread([time_waited] { - SetProperty("ro.boottime.init.cold_boot_wait", std::to_string(time_waited)); - }).detach(); - } - - if (waiting_for_prop_) { - if (wait_prop_name_ == name && wait_prop_value_ == value) { - LOG(INFO) << "Wait for property '" << wait_prop_name_ << "=" << wait_prop_value_ - << "' took " << *waiting_for_prop_; - ResetWaitForPropLocked(); - WakeEpoll(); - } - } - } - - // This is not thread safe because it releases the lock when it returns, so the waiting state - // may change. However, we only use this function to prevent running commands in the main - // thread loop when we are waiting, so we do not care about false positives; only false - // negatives. StartWaiting() and this function are always called from the same thread, so false - // negatives are not possible and therefore we're okay. - bool MightBeWaiting() { - auto lock = std::lock_guard{lock_}; - return static_cast(waiting_for_prop_); - } - - private: - void ResetWaitForPropLocked() { - wait_prop_name_.clear(); - wait_prop_value_.clear(); - waiting_for_prop_.reset(); - } - - std::mutex lock_; - std::unique_ptr waiting_for_prop_{nullptr}; - std::string wait_prop_name_; - std::string wait_prop_value_; - -} prop_waiter_state; - -bool start_waiting_for_property(const char* name, const char* value) { - return prop_waiter_state.StartWaiting(name, value); -} - -void ResetWaitForProp() { - prop_waiter_state.ResetWaitForProp(); -} - -static class ShutdownState { - public: - void TriggerShutdown(const std::string& command) { - // We can't call HandlePowerctlMessage() directly in this function, - // because it modifies the contents of the action queue, which can cause the action queue - // to get into a bad state if this function is called from a command being executed by the - // action queue. Instead we set this flag and ensure that shutdown happens before the next - // command is run in the main init loop. - auto lock = std::lock_guard{shutdown_command_lock_}; - shutdown_command_ = command; - do_shutdown_ = true; - WakeEpoll(); - } - - std::optional CheckShutdown() { - auto lock = std::lock_guard{shutdown_command_lock_}; - if (do_shutdown_ && !IsShuttingDown()) { - do_shutdown_ = false; - return shutdown_command_; - } - return {}; - } - - private: - std::mutex shutdown_command_lock_; - std::string shutdown_command_; - bool do_shutdown_ = false; -} shutdown_state; - void DumpState() { - auto lock = std::lock_guard{service_lock}; ServiceList::GetInstance().DumpState(); ActionManager::GetInstance().DumpState(); } @@ -291,7 +156,39 @@ static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_ } } -void PropertyChanged(const std::string& name, const std::string& value) { +bool start_waiting_for_property(const char* name, const char* value) { + if (waiting_for_prop) { + return false; + } + if (GetProperty(name, "") != value) { + // Current property value is not equal to expected value + wait_prop_name = name; + wait_prop_value = value; + waiting_for_prop.reset(new Timer()); + } else { + LOG(INFO) << "start_waiting_for_property(\"" << name << "\", \"" << value + << "\"): already set"; + } + return true; +} + +void ResetWaitForProp() { + wait_prop_name.clear(); + wait_prop_value.clear(); + waiting_for_prop.reset(); +} + +static void TriggerShutdown(const std::string& command) { + // We can't call HandlePowerctlMessage() directly in this function, + // because it modifies the contents of the action queue, which can cause the action queue + // to get into a bad state if this function is called from a command being executed by the + // action queue. Instead we set this flag and ensure that shutdown happens before the next + // command is run in the main init loop. + shutdown_command = command; + do_shutdown = true; +} + +void property_changed(const std::string& name, const std::string& value) { // If the property is sys.powerctl, we bypass the event queue and immediately handle it. // This is to ensure that init will always and immediately shutdown/reboot, regardless of // if there are other pending events to process or if init is waiting on an exec service or @@ -299,20 +196,30 @@ void PropertyChanged(const std::string& name, const std::string& value) { // In non-thermal-shutdown case, 'shutdown' trigger will be fired to let device specific // commands to be executed. if (name == "sys.powerctl") { - trigger_shutdown(value); + TriggerShutdown(value); } - if (property_triggers_enabled) { - ActionManager::GetInstance().QueuePropertyChange(name, value); - WakeEpoll(); + if (property_triggers_enabled) ActionManager::GetInstance().QueuePropertyChange(name, value); + + // We always record how long init waited for ueventd to tell us cold boot finished. + // If we aren't waiting on this property, it means that ueventd finished before we even started + // to wait. + if (name == kColdBootDoneProp) { + auto time_waited = waiting_for_prop ? waiting_for_prop->duration().count() : 0; + SetProperty("ro.boottime.init.cold_boot_wait", std::to_string(time_waited)); } - prop_waiter_state.CheckAndResetWait(name, value); + if (waiting_for_prop) { + if (wait_prop_name == name && wait_prop_value == value) { + LOG(INFO) << "Wait for property '" << wait_prop_name << "=" << wait_prop_value + << "' took " << *waiting_for_prop; + ResetWaitForProp(); + } + } } static std::optional HandleProcessActions() { std::optional next_process_action_time; - auto lock = std::lock_guard{service_lock}; for (const auto& s : ServiceList::GetInstance()) { if ((s->flags() & SVC_RUNNING) && s->timeout_period()) { auto timeout_time = s->time_started() + *s->timeout_period(); @@ -341,7 +248,7 @@ static std::optional HandleProcessActions() { return next_process_action_time; } -static Result DoControlStart(Service* service) REQUIRES(service_lock) { +static Result DoControlStart(Service* service) { return service->Start(); } @@ -350,7 +257,7 @@ static Result DoControlStop(Service* service) { return {}; } -static Result DoControlRestart(Service* service) REQUIRES(service_lock) { +static Result DoControlRestart(Service* service) { service->Restart(); return {}; } @@ -384,7 +291,7 @@ static const std::map& get_control_message_ return control_message_functions; } -bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t from_pid) { +bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t pid) { const auto& map = get_control_message_map(); const auto it = map.find(msg); @@ -393,7 +300,7 @@ bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t return false; } - std::string cmdline_path = StringPrintf("proc/%d/cmdline", from_pid); + std::string cmdline_path = StringPrintf("proc/%d/cmdline", pid); std::string process_cmdline; if (ReadFileToString(cmdline_path, &process_cmdline)) { std::replace(process_cmdline.begin(), process_cmdline.end(), '\0', ' '); @@ -404,8 +311,6 @@ bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t const ControlMessageFunction& function = it->second; - auto lock = std::lock_guard{service_lock}; - Service* svc = nullptr; switch (function.target) { @@ -423,24 +328,23 @@ bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t if (svc == nullptr) { LOG(ERROR) << "Control message: Could not find '" << name << "' for ctl." << msg - << " from pid: " << from_pid << " (" << process_cmdline << ")"; + << " from pid: " << pid << " (" << process_cmdline << ")"; return false; } if (auto result = function.action(svc); !result.ok()) { LOG(ERROR) << "Control message: Could not ctl." << msg << " for '" << name - << "' from pid: " << from_pid << " (" << process_cmdline - << "): " << result.error(); + << "' from pid: " << pid << " (" << process_cmdline << "): " << result.error(); return false; } LOG(INFO) << "Control message: Processed ctl." << msg << " for '" << name - << "' from pid: " << from_pid << " (" << process_cmdline << ")"; + << "' from pid: " << pid << " (" << process_cmdline << ")"; return true; } static Result wait_for_coldboot_done_action(const BuiltinArguments& args) { - if (!prop_waiter_state.StartWaiting(kColdBootDoneProp, "true")) { + if (!start_waiting_for_property(kColdBootDoneProp, "true")) { LOG(FATAL) << "Could not wait for '" << kColdBootDoneProp << "'"; } @@ -588,7 +492,6 @@ void HandleKeychord(const std::vector& keycodes) { } auto found = false; - auto lock = std::lock_guard{service_lock}; for (const auto& service : ServiceList::GetInstance()) { auto svc = service.get(); if (svc->keycodes() == keycodes) { @@ -675,6 +578,44 @@ void SendStartSendingMessagesMessage() { } } +static void HandlePropertyFd() { + auto message = ReadMessage(property_fd); + if (!message.ok()) { + LOG(ERROR) << "Could not read message from property service: " << message.error(); + return; + } + + auto property_message = PropertyMessage{}; + if (!property_message.ParseFromString(*message)) { + LOG(ERROR) << "Could not parse message from property service"; + return; + } + + switch (property_message.msg_case()) { + case PropertyMessage::kControlMessage: { + auto& control_message = property_message.control_message(); + bool success = HandleControlMessage(control_message.msg(), control_message.name(), + control_message.pid()); + + uint32_t response = success ? PROP_SUCCESS : PROP_ERROR_HANDLE_CONTROL_MESSAGE; + if (control_message.has_fd()) { + int fd = control_message.fd(); + TEMP_FAILURE_RETRY(send(fd, &response, sizeof(response), 0)); + close(fd); + } + break; + } + case PropertyMessage::kChangedMessage: { + auto& changed_message = property_message.changed_message(); + property_changed(changed_message.name(), changed_message.value()); + break; + } + default: + LOG(ERROR) << "Unknown message type from property service: " + << property_message.msg_case(); + } +} + int SecondStageMain(int argc, char** argv) { if (REBOOT_BOOTLOADER_ON_PANIC) { InstallRebootSignalHandlers(); @@ -682,7 +623,7 @@ int SecondStageMain(int argc, char** argv) { boot_clock::time_point start_time = boot_clock::now(); - trigger_shutdown = [](const std::string& command) { shutdown_state.TriggerShutdown(command); }; + trigger_shutdown = TriggerShutdown; SetStdioToDevNull(argv); InitKernelLogging(argv); @@ -742,8 +683,11 @@ int SecondStageMain(int argc, char** argv) { } InstallSignalFdHandler(&epoll); - InstallInitNotifier(&epoll); + StartPropertyService(&property_fd); + if (auto result = epoll.RegisterHandler(property_fd, HandlePropertyFd); !result.ok()) { + LOG(FATAL) << "Could not register epoll handler for property fd: " << result.error(); + } // Make the time that init stages started available for bootstat to log. RecordStageBoottimes(start_time); @@ -796,7 +740,6 @@ int SecondStageMain(int argc, char** argv) { Keychords keychords; am.QueueBuiltinAction( [&epoll, &keychords](const BuiltinArguments& args) -> Result { - auto lock = std::lock_guard{service_lock}; for (const auto& svc : ServiceList::GetInstance()) { keychords.Register(svc->keycodes()); } @@ -827,12 +770,12 @@ int SecondStageMain(int argc, char** argv) { // By default, sleep until something happens. auto epoll_timeout = std::optional{}; - auto shutdown_command = shutdown_state.CheckShutdown(); - if (shutdown_command) { - HandlePowerctlMessage(*shutdown_command); + if (do_shutdown && !IsShuttingDown()) { + do_shutdown = false; + HandlePowerctlMessage(shutdown_command); } - if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { + if (!(waiting_for_prop || Service::is_exec_service_running())) { am.ExecuteOneCommand(); } if (!IsShuttingDown()) { @@ -846,7 +789,7 @@ int SecondStageMain(int argc, char** argv) { } } - if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { + if (!(waiting_for_prop || Service::is_exec_service_running())) { // If there's more work to do, wake up again immediately. if (am.HasMoreCommands()) epoll_timeout = 0ms; } diff --git a/init/init.h b/init/init.h index bcf24e73f..4bbca6f3c 100644 --- a/init/init.h +++ b/init/init.h @@ -41,9 +41,6 @@ void SendLoadPersistentPropertiesMessage(); void SendStopSendingMessagesMessage(); void SendStartSendingMessagesMessage(); -void PropertyChanged(const std::string& name, const std::string& value); -bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t from_pid); - int SecondStageMain(int argc, char** argv); } // namespace init diff --git a/init/init_test.cpp b/init/init_test.cpp index 3053bd848..caf3e0343 100644 --- a/init/init_test.cpp +++ b/init/init_test.cpp @@ -167,7 +167,6 @@ service A something ServiceList service_list; TestInitText(init_script, BuiltinFunctionMap(), {}, &service_list); - auto lock = std::lock_guard{service_lock}; ASSERT_EQ(1, std::distance(service_list.begin(), service_list.end())); auto service = service_list.begin()->get(); diff --git a/init/lmkd_service.cpp b/init/lmkd_service.cpp index a531d0aea..dd1ab4d61 100644 --- a/init/lmkd_service.cpp +++ b/init/lmkd_service.cpp @@ -79,8 +79,7 @@ static bool UnregisterProcess(pid_t pid) { } static void RegisterServices(pid_t exclude_pid) { - auto lock = std::lock_guard{service_lock}; - for (const auto& service : ServiceList::GetInstance()) { + for (const auto& service : ServiceList::GetInstance().services()) { auto svc = service.get(); if (svc->oom_score_adjust() != DEFAULT_OOM_SCORE_ADJUST) { // skip if process is excluded or not yet forked (pid==0) diff --git a/init/mount_namespace.cpp b/init/mount_namespace.cpp index aa368492d..0749fe3b8 100644 --- a/init/mount_namespace.cpp +++ b/init/mount_namespace.cpp @@ -29,7 +29,6 @@ #include #include -#include "property_service.h" #include "util.h" namespace android { @@ -291,14 +290,6 @@ bool SwitchToDefaultMountNamespace() { return true; } if (default_ns_id != GetMountNamespaceId()) { - // The property service thread and its descendent threads must be in the correct mount - // namespace to call Service::Start(), however setns() only operates on a single thread and - // fails when secondary threads attempt to join the same mount namespace. Therefore, we - // must join the property service thread and its descendents before the setns() call. Those - // threads are then started again after the setns() call, and they'll be in the proper - // namespace. - PausePropertyService(); - if (setns(default_ns_fd.get(), CLONE_NEWNS) == -1) { PLOG(ERROR) << "Failed to switch back to the default mount namespace."; return false; @@ -308,8 +299,6 @@ bool SwitchToDefaultMountNamespace() { LOG(ERROR) << result.error(); return false; } - - ResumePropertyService(); } LOG(INFO) << "Switched to default mount namespace"; diff --git a/init/property_service.cpp b/init/property_service.cpp index 319a241c7..730bf6de4 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -92,10 +92,8 @@ namespace init { static bool persistent_properties_loaded = false; static int property_set_fd = -1; -static int from_init_socket = -1; static int init_socket = -1; static bool accept_messages = false; -static std::thread property_service_thread; static PropertyInfoAreaFile property_info_area; @@ -149,6 +147,17 @@ static bool CheckMacPerms(const std::string& name, const char* target_context, return has_access; } +static void SendPropertyChanged(const std::string& name, const std::string& value) { + auto property_msg = PropertyMessage{}; + auto* changed_message = property_msg.mutable_changed_message(); + changed_message->set_name(name); + changed_message->set_value(value); + + if (auto result = SendMessage(init_socket, property_msg); !result.ok()) { + LOG(ERROR) << "Failed to send property changed message: " << result.error(); + } +} + static uint32_t PropertySet(const std::string& name, const std::string& value, std::string* error) { size_t valuelen = value.size(); @@ -187,137 +196,47 @@ static uint32_t PropertySet(const std::string& name, const std::string& value, s // If init hasn't started its main loop, then it won't be handling property changed messages // anyway, so there's no need to try to send them. if (accept_messages) { - PropertyChanged(name, value); + SendPropertyChanged(name, value); } return PROP_SUCCESS; } -template -class SingleThreadExecutor { +class AsyncRestorecon { public: - virtual ~SingleThreadExecutor() {} - - template - void Run(F&& item) { + void TriggerRestorecon(const std::string& path) { auto guard = std::lock_guard{mutex_}; - items_.emplace(std::forward(item)); + paths_.emplace(path); - if (thread_state_ == ThreadState::kRunning || thread_state_ == ThreadState::kStopped) { - return; - } - - if (thread_state_ == ThreadState::kPendingJoin) { - thread_.join(); - } - - StartThread(); - } - - void StopAndJoin() { - auto lock = std::unique_lock{mutex_}; - if (thread_state_ == ThreadState::kPendingJoin) { - thread_.join(); - } else if (thread_state_ == ThreadState::kRunning) { - thread_state_ = ThreadState::kStopped; - lock.unlock(); - thread_.join(); - lock.lock(); - } - - thread_state_ = ThreadState::kStopped; - } - - void Restart() { - auto guard = std::lock_guard{mutex_}; - if (items_.empty()) { - thread_state_ = ThreadState::kNotStarted; - } else { - StartThread(); - } - } - - void MaybeJoin() { - auto guard = std::lock_guard{mutex_}; - if (thread_state_ == ThreadState::kPendingJoin) { - thread_.join(); - thread_state_ = ThreadState::kNotStarted; + if (!thread_started_) { + thread_started_ = true; + std::thread{&AsyncRestorecon::ThreadFunction, this}.detach(); } } private: - virtual void Execute(T&& item) = 0; - - void StartThread() { - thread_state_ = ThreadState::kRunning; - auto thread = std::thread{&SingleThreadExecutor::ThreadFunction, this}; - std::swap(thread_, thread); - } - void ThreadFunction() { auto lock = std::unique_lock{mutex_}; - while (!items_.empty()) { - auto item = items_.front(); - items_.pop(); + while (!paths_.empty()) { + auto path = paths_.front(); + paths_.pop(); lock.unlock(); - Execute(std::move(item)); + if (selinux_android_restorecon(path.c_str(), SELINUX_ANDROID_RESTORECON_RECURSE) != 0) { + LOG(ERROR) << "Asynchronous restorecon of '" << path << "' failed'"; + } + android::base::SetProperty(kRestoreconProperty, path); lock.lock(); } - if (thread_state_ != ThreadState::kStopped) { - thread_state_ = ThreadState::kPendingJoin; - } + thread_started_ = false; } std::mutex mutex_; - std::queue items_; - enum class ThreadState { - kNotStarted, // Initial state when starting the program or when restarting with no items to - // process. - kRunning, // The thread is running and is in a state that it will process new items if - // are run. - kPendingJoin, // The thread has run to completion and is pending join(). A new thread must - // be launched for new items to be processed. - kStopped, // This executor has stopped and will not process more items until Restart() is - // called. Currently pending items will be processed and the thread will be - // joined. - }; - ThreadState thread_state_ = ThreadState::kNotStarted; - std::thread thread_; + std::queue paths_; + bool thread_started_ = false; }; -class RestoreconThread : public SingleThreadExecutor { - virtual void Execute(std::string&& path) override { - if (selinux_android_restorecon(path.c_str(), SELINUX_ANDROID_RESTORECON_RECURSE) != 0) { - LOG(ERROR) << "Asynchronous restorecon of '" << path << "' failed'"; - } - android::base::SetProperty(kRestoreconProperty, path); - } -}; - -struct ControlMessageInfo { - std::string message; - std::string name; - pid_t pid; - int fd; -}; - -class ControlMessageThread : public SingleThreadExecutor { - virtual void Execute(ControlMessageInfo&& info) override { - bool success = HandleControlMessage(info.message, info.name, info.pid); - - uint32_t response = success ? PROP_SUCCESS : PROP_ERROR_HANDLE_CONTROL_MESSAGE; - if (info.fd != -1) { - TEMP_FAILURE_RETRY(send(info.fd, &response, sizeof(response), 0)); - close(info.fd); - } - } -}; - -static RestoreconThread restorecon_thread; -static ControlMessageThread control_message_thread; - class SocketConnection { public: SocketConnection(int socket, const ucred& cred) : socket_(socket), cred_(cred) {} @@ -459,17 +378,29 @@ static uint32_t SendControlMessage(const std::string& msg, const std::string& na return PROP_ERROR_HANDLE_CONTROL_MESSAGE; } - // We must release the fd before spawning the thread, otherwise there will be a race with the - // thread. If the thread calls close() before this function calls Release(), then fdsan will see - // the wrong tag and abort(). + auto property_msg = PropertyMessage{}; + auto* control_message = property_msg.mutable_control_message(); + control_message->set_msg(msg); + control_message->set_name(name); + control_message->set_pid(pid); + + // We must release the fd before sending it to init, otherwise there will be a race with init. + // If init calls close() before Release(), then fdsan will see the wrong tag and abort(). int fd = -1; if (socket != nullptr && SelinuxGetVendorAndroidVersion() > __ANDROID_API_Q__) { fd = socket->Release(); + control_message->set_fd(fd); } - // Handling a control message likely calls SetProperty, which we must synchronously handle, - // therefore we must fork a thread to handle it. - control_message_thread.Run({msg, name, pid, fd}); + if (auto result = SendMessage(init_socket, property_msg); !result.ok()) { + // We've already released the fd above, so if we fail to send the message to init, we need + // to manually free it here. + if (fd != -1) { + close(fd); + } + *error = "Failed to send control message: " + result.error().message(); + return PROP_ERROR_HANDLE_CONTROL_MESSAGE; + } return PROP_SUCCESS; } @@ -571,7 +502,8 @@ uint32_t HandlePropertySet(const std::string& name, const std::string& value, // We use a thread to do this restorecon operation to prevent holding up init, as it may take // a long time to complete. if (name == kRestoreconProperty && cr.pid != 1 && !value.empty()) { - restorecon_thread.Run(value); + static AsyncRestorecon async_restorecon; + async_restorecon.TriggerRestorecon(value); return PROP_SUCCESS; } @@ -1152,8 +1084,6 @@ void PropertyInit() { PropertyLoadBootDefaults(); } -static bool pause_property_service = false; - static void HandleInitSocket() { auto message = ReadMessage(init_socket); if (!message.ok()) { @@ -1188,10 +1118,6 @@ static void HandleInitSocket() { accept_messages = true; break; } - case InitMessage::kPausePropertyService: { - pause_property_service = true; - break; - } default: LOG(ERROR) << "Unknown message type from init: " << init_message.msg_case(); } @@ -1212,7 +1138,7 @@ static void PropertyServiceThread() { LOG(FATAL) << result.error(); } - while (!pause_property_service) { + while (true) { auto pending_functions = epoll.Wait(std::nullopt); if (!pending_functions.ok()) { LOG(ERROR) << pending_functions.error(); @@ -1221,34 +1147,9 @@ static void PropertyServiceThread() { (*function)(); } } - control_message_thread.MaybeJoin(); - restorecon_thread.MaybeJoin(); } } -void SendStopPropertyServiceMessage() { - auto init_message = InitMessage{}; - init_message.set_pause_property_service(true); - if (auto result = SendMessage(from_init_socket, init_message); !result.ok()) { - LOG(ERROR) << "Failed to send stop property service message: " << result.error(); - } -} - -void PausePropertyService() { - control_message_thread.StopAndJoin(); - restorecon_thread.StopAndJoin(); - SendStopPropertyServiceMessage(); - property_service_thread.join(); -} - -void ResumePropertyService() { - pause_property_service = false; - auto new_thread = std::thread{PropertyServiceThread}; - property_service_thread.swap(new_thread); - restorecon_thread.Restart(); - control_message_thread.Restart(); -} - void StartPropertyService(int* epoll_socket) { InitPropertySet("ro.property_service.version", "2"); @@ -1256,7 +1157,7 @@ void StartPropertyService(int* epoll_socket) { if (socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0, sockets) != 0) { PLOG(FATAL) << "Failed to socketpair() between property_service and init"; } - *epoll_socket = from_init_socket = sockets[0]; + *epoll_socket = sockets[0]; init_socket = sockets[1]; accept_messages = true; @@ -1270,8 +1171,7 @@ void StartPropertyService(int* epoll_socket) { listen(property_set_fd, 8); - auto new_thread = std::thread{PropertyServiceThread}; - property_service_thread.swap(new_thread); + std::thread{PropertyServiceThread}.detach(); } } // namespace init diff --git a/init/property_service.h b/init/property_service.h index e92132632..506d116e1 100644 --- a/init/property_service.h +++ b/init/property_service.h @@ -31,8 +31,6 @@ bool CanReadProperty(const std::string& source_context, const std::string& name) void PropertyInit(); void StartPropertyService(int* epoll_socket); -void ResumePropertyService(); -void PausePropertyService(); } // namespace init } // namespace android diff --git a/init/property_service.proto b/init/property_service.proto index 36245b228..08268d9bb 100644 --- a/init/property_service.proto +++ b/init/property_service.proto @@ -41,6 +41,5 @@ message InitMessage { bool load_persistent_properties = 1; bool stop_sending_messages = 2; bool start_sending_messages = 3; - bool pause_property_service = 4; }; } diff --git a/init/reboot.cpp b/init/reboot.cpp index cad192de9..8d8bd8ee6 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -85,7 +85,7 @@ static bool shutting_down = false; static const std::set kDebuggingServices{"tombstoned", "logd", "adbd", "console"}; -static std::vector GetDebuggingServices(bool only_post_data) REQUIRES(service_lock) { +static std::vector GetDebuggingServices(bool only_post_data) { std::vector ret; ret.reserve(kDebuggingServices.size()); for (const auto& s : ServiceList::GetInstance()) { @@ -181,7 +181,7 @@ class MountEntry { }; // Turn off backlight while we are performing power down cleanup activities. -static void TurnOffBacklight() REQUIRES(service_lock) { +static void TurnOffBacklight() { Service* service = ServiceList::GetInstance().FindService("blank_screen"); if (service == nullptr) { LOG(WARNING) << "cannot find blank_screen in TurnOffBacklight"; @@ -589,7 +589,6 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str // Start reboot monitor thread sem_post(&reboot_semaphore); - auto lock = std::lock_guard{service_lock}; // watchdogd is a vendor specific component but should be alive to complete shutdown safely. const std::set to_starts{"watchdogd"}; std::vector stop_first; @@ -709,7 +708,6 @@ static void EnterShutdown() { // Skip wait for prop if it is in progress ResetWaitForProp(); // Clear EXEC flag if there is one pending - auto lock = std::lock_guard{service_lock}; for (const auto& s : ServiceList::GetInstance()) { s->UnSetExec(); } @@ -753,7 +751,6 @@ static Result DoUserspaceReboot() { return Error() << "Failed to set sys.init.userspace_reboot.in_progress property"; } EnterShutdown(); - auto lock = std::lock_guard{service_lock}; if (!SetProperty("sys.powerctl", "")) { return Error() << "Failed to reset sys.powerctl property"; } @@ -914,7 +911,6 @@ void HandlePowerctlMessage(const std::string& command) { run_fsck = true; } else if (cmd_params[1] == "thermal") { // Turn off sources of heat immediately. - auto lock = std::lock_guard{service_lock}; TurnOffBacklight(); // run_fsck is false to avoid delay cmd = ANDROID_RB_THERMOFF; diff --git a/init/service.h b/init/service.h index d2a446207..cf3f0c290 100644 --- a/init/service.h +++ b/init/service.h @@ -27,14 +27,12 @@ #include #include -#include #include #include "action.h" #include "capabilities.h" #include "keyword_map.h" #include "parser.h" -#include "service_lock.h" #include "service_utils.h" #include "subcontext.h" @@ -79,17 +77,17 @@ class Service { bool IsRunning() { return (flags_ & SVC_RUNNING) != 0; } bool IsEnabled() { return (flags_ & SVC_DISABLED) == 0; } - Result ExecStart() REQUIRES(service_lock); - Result Start() REQUIRES(service_lock); - Result StartIfNotDisabled() REQUIRES(service_lock); - Result StartIfPostData() REQUIRES(service_lock); - Result Enable() REQUIRES(service_lock); + Result ExecStart(); + Result Start(); + Result StartIfNotDisabled(); + Result StartIfPostData(); + Result Enable(); void Reset(); void ResetIfPostData(); void Stop(); void Terminate(); void Timeout(); - void Restart() REQUIRES(service_lock); + void Restart(); void Reap(const siginfo_t& siginfo); void DumpState() const; void SetShutdownCritical() { flags_ |= SVC_SHUTDOWN_CRITICAL; } diff --git a/init/service_list.h b/init/service_list.h index 280a2280f..3b9018bc0 100644 --- a/init/service_list.h +++ b/init/service_list.h @@ -17,13 +17,9 @@ #pragma once #include -#include #include -#include - #include "service.h" -#include "service_lock.h" namespace android { namespace init { @@ -36,16 +32,16 @@ class ServiceList { ServiceList(); size_t CheckAllCommands(); - void AddService(std::unique_ptr service) REQUIRES(service_lock); - void RemoveService(const Service& svc) REQUIRES(service_lock); + void AddService(std::unique_ptr service); + void RemoveService(const Service& svc); template - void RemoveServiceIf(UnaryPredicate predicate) REQUIRES(service_lock) { + void RemoveServiceIf(UnaryPredicate predicate) { services_.erase(std::remove_if(services_.begin(), services_.end(), predicate), services_.end()); } template - Service* FindService(T value, F function = &Service::name) const REQUIRES(service_lock) { + Service* FindService(T value, F function = &Service::name) const { auto svc = std::find_if(services_.begin(), services_.end(), [&function, &value](const std::unique_ptr& s) { return std::invoke(function, s) == value; @@ -56,7 +52,7 @@ class ServiceList { return nullptr; } - Service* FindInterface(const std::string& interface_name) REQUIRES(service_lock) { + Service* FindInterface(const std::string& interface_name) { for (const auto& svc : services_) { if (svc->interfaces().count(interface_name) > 0) { return svc.get(); @@ -66,20 +62,18 @@ class ServiceList { return nullptr; } - void DumpState() const REQUIRES(service_lock); + void DumpState() const; - auto begin() const REQUIRES(service_lock) { return services_.begin(); } - auto end() const REQUIRES(service_lock) { return services_.end(); } - const std::vector>& services() const REQUIRES(service_lock) { - return services_; - } - const std::vector services_in_shutdown_order() const REQUIRES(service_lock); + auto begin() const { return services_.begin(); } + auto end() const { return services_.end(); } + const std::vector>& services() const { return services_; } + const std::vector services_in_shutdown_order() const; void MarkPostData(); bool IsPostData(); - void MarkServicesUpdate() REQUIRES(service_lock); + void MarkServicesUpdate(); bool IsServicesUpdated() const { return services_update_finished_; } - void DelayService(const Service& service) REQUIRES(service_lock); + void DelayService(const Service& service); void ResetState() { post_data_ = false; diff --git a/init/service_lock.cpp b/init/service_lock.cpp deleted file mode 100644 index 404d4396e..000000000 --- a/init/service_lock.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2020 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 "service_lock.h" - -namespace android { -namespace init { - -RecursiveMutex service_lock; - -} // namespace init -} // namespace android diff --git a/init/service_lock.h b/init/service_lock.h deleted file mode 100644 index 6b94271be..000000000 --- a/init/service_lock.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2020 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 - -#include - -namespace android { -namespace init { - -// This class exists to add thread annotations, since they're absent from std::recursive_mutex. - -class CAPABILITY("mutex") RecursiveMutex { - public: - void lock() ACQUIRE() { mutex_.lock(); } - void unlock() RELEASE() { mutex_.unlock(); } - - private: - std::recursive_mutex mutex_; -}; - -extern RecursiveMutex service_lock; - -} // namespace init -} // namespace android diff --git a/init/service_parser.cpp b/init/service_parser.cpp index 51f4c9786..560f693f9 100644 --- a/init/service_parser.cpp +++ b/init/service_parser.cpp @@ -168,7 +168,6 @@ Result ServiceParser::ParseInterface(std::vector&& args) { const std::string fullname = interface_name + "/" + instance_name; - auto lock = std::lock_guard{service_lock}; for (const auto& svc : *service_list_) { if (svc->interfaces().count(fullname) > 0) { return Error() << "Interface '" << fullname << "' redefined in " << service_->name() @@ -599,7 +598,6 @@ Result ServiceParser::EndSection() { } } - auto lock = std::lock_guard{service_lock}; Service* old_service = service_list_->FindService(service_->name()); if (old_service) { if (!service_->is_override()) { diff --git a/init/sigchld_handler.cpp b/init/sigchld_handler.cpp index 064d64d54..9b2c7d939 100644 --- a/init/sigchld_handler.cpp +++ b/init/sigchld_handler.cpp @@ -64,8 +64,6 @@ static pid_t ReapOneProcess() { std::string wait_string; Service* service = nullptr; - auto lock = std::lock_guard{service_lock}; - if (SubcontextChildReap(pid)) { name = "Subcontext"; } else { From 0c19d6c99f6c312bcab4df1dcf78d8635829f313 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 12 Mar 2020 14:29:25 -0700 Subject: [PATCH 159/388] init: handle property messages asynchronously #2 A previous change moved property_service into its own thread, since there was otherwise a deadlock whenever a process called by init would try to set a property. This new thread, however, would send a message via a blocking socket to init for each property that it received, since init may need to take action depending on which property it is. Unfortunately, this means that the deadlock is still possible, the only difference is the socket's buffer must be filled before init deadlocks. This change, therefore, adds the following: 1) A lock for instructing init to reboot 2) A lock for waiting on properties 3) A lock for queueing new properties A previous version of this change was reverted and added locks around all service operations and allowed the property thread to spawn services directly. This was complex due to the fact that this code was not designed to be multi-threaded. It was reverted due to apparent issues during reboot. This change keeps a queue of processes pending control messages, which it will then handle in the future. It is less flexible but safer. Bug: 146877356 Bug: 148236233 Bug: 150863651 Bug: 151251827 Test: multiple reboot tests, safely restarting hwservicemanager Merged-In: Ice773436e85d3bf636bb0a892f3f6002bdf996b6 Change-Id: Ice773436e85d3bf636bb0a892f3f6002bdf996b6 (cherry picked from commit 802864c7826ea79f8cc29c52801e08bcfc15db76) --- init/Android.bp | 1 + init/action_manager.cpp | 22 ++- init/action_manager.h | 7 +- init/init.cpp | 322 ++++++++++++++++++++++++-------------- init/init.h | 5 +- init/property_service.cpp | 63 +++----- init/property_service.h | 3 + init/reboot.cpp | 12 +- 8 files changed, 261 insertions(+), 174 deletions(-) diff --git a/init/Android.bp b/init/Android.bp index 3bb08db6c..72a7bfed4 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -81,6 +81,7 @@ cc_defaults { "-Wextra", "-Wno-unused-parameter", "-Werror", + "-Wthread-safety", "-DALLOW_FIRST_STAGE_CONSOLE=0", "-DALLOW_LOCAL_PROP_OVERRIDE=0", "-DALLOW_PERMISSIVE_SELINUX=0", diff --git a/init/action_manager.cpp b/init/action_manager.cpp index ebca762ca..b45f5cd18 100644 --- a/init/action_manager.cpp +++ b/init/action_manager.cpp @@ -41,10 +41,12 @@ void ActionManager::AddAction(std::unique_ptr action) { } void ActionManager::QueueEventTrigger(const std::string& trigger) { + auto lock = std::lock_guard{event_queue_lock_}; event_queue_.emplace(trigger); } void ActionManager::QueuePropertyChange(const std::string& name, const std::string& value) { + auto lock = std::lock_guard{event_queue_lock_}; event_queue_.emplace(std::make_pair(name, value)); } @@ -53,6 +55,7 @@ void ActionManager::QueueAllPropertyActions() { } void ActionManager::QueueBuiltinAction(BuiltinFunction func, const std::string& name) { + auto lock = std::lock_guard{event_queue_lock_}; auto action = std::make_unique(true, nullptr, "", 0, name, std::map{}); action->AddCommand(std::move(func), {name}, 0); @@ -62,15 +65,18 @@ void ActionManager::QueueBuiltinAction(BuiltinFunction func, const std::string& } void ActionManager::ExecuteOneCommand() { - // Loop through the event queue until we have an action to execute - while (current_executing_actions_.empty() && !event_queue_.empty()) { - for (const auto& action : actions_) { - if (std::visit([&action](const auto& event) { return action->CheckEvent(event); }, - event_queue_.front())) { - current_executing_actions_.emplace(action.get()); + { + auto lock = std::lock_guard{event_queue_lock_}; + // Loop through the event queue until we have an action to execute + while (current_executing_actions_.empty() && !event_queue_.empty()) { + for (const auto& action : actions_) { + if (std::visit([&action](const auto& event) { return action->CheckEvent(event); }, + event_queue_.front())) { + current_executing_actions_.emplace(action.get()); + } } + event_queue_.pop(); } - event_queue_.pop(); } if (current_executing_actions_.empty()) { @@ -103,6 +109,7 @@ void ActionManager::ExecuteOneCommand() { } bool ActionManager::HasMoreCommands() const { + auto lock = std::lock_guard{event_queue_lock_}; return !current_executing_actions_.empty() || !event_queue_.empty(); } @@ -113,6 +120,7 @@ void ActionManager::DumpState() const { } void ActionManager::ClearQueue() { + auto lock = std::lock_guard{event_queue_lock_}; // We are shutting down so don't claim the oneshot builtin actions back current_executing_actions_ = {}; event_queue_ = {}; diff --git a/init/action_manager.h b/init/action_manager.h index a2b95acad..b6f93d9b5 100644 --- a/init/action_manager.h +++ b/init/action_manager.h @@ -16,9 +16,12 @@ #pragma once +#include #include #include +#include + #include "action.h" #include "builtins.h" @@ -48,7 +51,9 @@ class ActionManager { void operator=(ActionManager const&) = delete; std::vector> actions_; - std::queue> event_queue_; + std::queue> event_queue_ + GUARDED_BY(event_queue_lock_); + mutable std::mutex event_queue_lock_; std::queue current_executing_actions_; std::size_t current_command_; }; diff --git a/init/init.cpp b/init/init.cpp index a7518fc2f..b29dfa3f6 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -33,7 +33,9 @@ #include #include #include +#include #include +#include #include #include @@ -95,14 +97,155 @@ static int property_triggers_enabled = 0; static int signal_fd = -1; static int property_fd = -1; -static std::unique_ptr waiting_for_prop(nullptr); -static std::string wait_prop_name; -static std::string wait_prop_value; -static std::string shutdown_command; -static bool do_shutdown = false; - static std::unique_ptr subcontext; +struct PendingControlMessage { + std::string message; + std::string name; + pid_t pid; + int fd; +}; +static std::mutex pending_control_messages_lock; +static std::queue pending_control_messages; + +// Init epolls various FDs to wait for various inputs. It previously waited on property changes +// with a blocking socket that contained the information related to the change, however, it was easy +// to fill that socket and deadlock the system. Now we use locks to handle the property changes +// directly in the property thread, however we still must wake the epoll to inform init that there +// is a change to process, so we use this FD. It is non-blocking, since we do not care how many +// times WakeEpoll() is called, only that the epoll will wake. +static int wake_epoll_fd = -1; +static void InstallInitNotifier(Epoll* epoll) { + int sockets[2]; + if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, sockets) != 0) { + PLOG(FATAL) << "Failed to socketpair() between property_service and init"; + } + int epoll_fd = sockets[0]; + wake_epoll_fd = sockets[1]; + + auto drain_socket = [epoll_fd] { + char buf[512]; + while (read(epoll_fd, buf, sizeof(buf)) > 0) { + } + }; + + if (auto result = epoll->RegisterHandler(epoll_fd, drain_socket); !result.ok()) { + LOG(FATAL) << result.error(); + } +} + +static void WakeEpoll() { + constexpr char value[] = "1"; + write(wake_epoll_fd, value, sizeof(value)); +} + +static class PropWaiterState { + public: + bool StartWaiting(const char* name, const char* value) { + auto lock = std::lock_guard{lock_}; + if (waiting_for_prop_) { + return false; + } + if (GetProperty(name, "") != value) { + // Current property value is not equal to expected value + wait_prop_name_ = name; + wait_prop_value_ = value; + waiting_for_prop_.reset(new Timer()); + } else { + LOG(INFO) << "start_waiting_for_property(\"" << name << "\", \"" << value + << "\"): already set"; + } + return true; + } + + void ResetWaitForProp() { + auto lock = std::lock_guard{lock_}; + ResetWaitForPropLocked(); + } + + void CheckAndResetWait(const std::string& name, const std::string& value) { + auto lock = std::lock_guard{lock_}; + // We always record how long init waited for ueventd to tell us cold boot finished. + // If we aren't waiting on this property, it means that ueventd finished before we even + // started to wait. + if (name == kColdBootDoneProp) { + auto time_waited = waiting_for_prop_ ? waiting_for_prop_->duration().count() : 0; + std::thread([time_waited] { + SetProperty("ro.boottime.init.cold_boot_wait", std::to_string(time_waited)); + }).detach(); + } + + if (waiting_for_prop_) { + if (wait_prop_name_ == name && wait_prop_value_ == value) { + LOG(INFO) << "Wait for property '" << wait_prop_name_ << "=" << wait_prop_value_ + << "' took " << *waiting_for_prop_; + ResetWaitForPropLocked(); + WakeEpoll(); + } + } + } + + // This is not thread safe because it releases the lock when it returns, so the waiting state + // may change. However, we only use this function to prevent running commands in the main + // thread loop when we are waiting, so we do not care about false positives; only false + // negatives. StartWaiting() and this function are always called from the same thread, so false + // negatives are not possible and therefore we're okay. + bool MightBeWaiting() { + auto lock = std::lock_guard{lock_}; + return static_cast(waiting_for_prop_); + } + + private: + void ResetWaitForPropLocked() { + wait_prop_name_.clear(); + wait_prop_value_.clear(); + waiting_for_prop_.reset(); + } + + std::mutex lock_; + std::unique_ptr waiting_for_prop_{nullptr}; + std::string wait_prop_name_; + std::string wait_prop_value_; + +} prop_waiter_state; + +bool start_waiting_for_property(const char* name, const char* value) { + return prop_waiter_state.StartWaiting(name, value); +} + +void ResetWaitForProp() { + prop_waiter_state.ResetWaitForProp(); +} + +static class ShutdownState { + public: + void TriggerShutdown(const std::string& command) { + // We can't call HandlePowerctlMessage() directly in this function, + // because it modifies the contents of the action queue, which can cause the action queue + // to get into a bad state if this function is called from a command being executed by the + // action queue. Instead we set this flag and ensure that shutdown happens before the next + // command is run in the main init loop. + auto lock = std::lock_guard{shutdown_command_lock_}; + shutdown_command_ = command; + do_shutdown_ = true; + WakeEpoll(); + } + + std::optional CheckShutdown() { + auto lock = std::lock_guard{shutdown_command_lock_}; + if (do_shutdown_ && !IsShuttingDown()) { + do_shutdown_ = false; + return shutdown_command_; + } + return {}; + } + + private: + std::mutex shutdown_command_lock_; + std::string shutdown_command_; + bool do_shutdown_ = false; +} shutdown_state; + void DumpState() { ServiceList::GetInstance().DumpState(); ActionManager::GetInstance().DumpState(); @@ -156,39 +299,7 @@ static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_ } } -bool start_waiting_for_property(const char* name, const char* value) { - if (waiting_for_prop) { - return false; - } - if (GetProperty(name, "") != value) { - // Current property value is not equal to expected value - wait_prop_name = name; - wait_prop_value = value; - waiting_for_prop.reset(new Timer()); - } else { - LOG(INFO) << "start_waiting_for_property(\"" << name << "\", \"" << value - << "\"): already set"; - } - return true; -} - -void ResetWaitForProp() { - wait_prop_name.clear(); - wait_prop_value.clear(); - waiting_for_prop.reset(); -} - -static void TriggerShutdown(const std::string& command) { - // We can't call HandlePowerctlMessage() directly in this function, - // because it modifies the contents of the action queue, which can cause the action queue - // to get into a bad state if this function is called from a command being executed by the - // action queue. Instead we set this flag and ensure that shutdown happens before the next - // command is run in the main init loop. - shutdown_command = command; - do_shutdown = true; -} - -void property_changed(const std::string& name, const std::string& value) { +void PropertyChanged(const std::string& name, const std::string& value) { // If the property is sys.powerctl, we bypass the event queue and immediately handle it. // This is to ensure that init will always and immediately shutdown/reboot, regardless of // if there are other pending events to process or if init is waiting on an exec service or @@ -196,26 +307,15 @@ void property_changed(const std::string& name, const std::string& value) { // In non-thermal-shutdown case, 'shutdown' trigger will be fired to let device specific // commands to be executed. if (name == "sys.powerctl") { - TriggerShutdown(value); + trigger_shutdown(value); } - if (property_triggers_enabled) ActionManager::GetInstance().QueuePropertyChange(name, value); - - // We always record how long init waited for ueventd to tell us cold boot finished. - // If we aren't waiting on this property, it means that ueventd finished before we even started - // to wait. - if (name == kColdBootDoneProp) { - auto time_waited = waiting_for_prop ? waiting_for_prop->duration().count() : 0; - SetProperty("ro.boottime.init.cold_boot_wait", std::to_string(time_waited)); + if (property_triggers_enabled) { + ActionManager::GetInstance().QueuePropertyChange(name, value); + WakeEpoll(); } - if (waiting_for_prop) { - if (wait_prop_name == name && wait_prop_value == value) { - LOG(INFO) << "Wait for property '" << wait_prop_name << "=" << wait_prop_value - << "' took " << *waiting_for_prop; - ResetWaitForProp(); - } - } + prop_waiter_state.CheckAndResetWait(name, value); } static std::optional HandleProcessActions() { @@ -343,8 +443,46 @@ bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t return true; } +bool QueueControlMessage(const std::string& message, const std::string& name, pid_t pid, int fd) { + auto lock = std::lock_guard{pending_control_messages_lock}; + if (pending_control_messages.size() > 100) { + LOG(ERROR) << "Too many pending control messages, dropped '" << message << "' for '" << name + << "' from pid: " << pid; + return false; + } + pending_control_messages.push({message, name, pid, fd}); + WakeEpoll(); + return true; +} + +static void HandleControlMessages() { + auto lock = std::unique_lock{pending_control_messages_lock}; + // Init historically would only execute handle one property message, including control messages + // in each iteration of its main loop. We retain this behavior here to prevent starvation of + // other actions in the main loop. + if (!pending_control_messages.empty()) { + auto control_message = pending_control_messages.front(); + pending_control_messages.pop(); + lock.unlock(); + + bool success = HandleControlMessage(control_message.message, control_message.name, + control_message.pid); + + uint32_t response = success ? PROP_SUCCESS : PROP_ERROR_HANDLE_CONTROL_MESSAGE; + if (control_message.fd != -1) { + TEMP_FAILURE_RETRY(send(control_message.fd, &response, sizeof(response), 0)); + close(control_message.fd); + } + lock.lock(); + } + // If we still have items to process, make sure we wake back up to do so. + if (!pending_control_messages.empty()) { + WakeEpoll(); + } +} + static Result wait_for_coldboot_done_action(const BuiltinArguments& args) { - if (!start_waiting_for_property(kColdBootDoneProp, "true")) { + if (!prop_waiter_state.StartWaiting(kColdBootDoneProp, "true")) { LOG(FATAL) << "Could not wait for '" << kColdBootDoneProp << "'"; } @@ -562,60 +700,6 @@ void SendLoadPersistentPropertiesMessage() { } } -void SendStopSendingMessagesMessage() { - auto init_message = InitMessage{}; - init_message.set_stop_sending_messages(true); - if (auto result = SendMessage(property_fd, init_message); !result.ok()) { - LOG(ERROR) << "Failed to send 'stop sending messages' message: " << result.error(); - } -} - -void SendStartSendingMessagesMessage() { - auto init_message = InitMessage{}; - init_message.set_start_sending_messages(true); - if (auto result = SendMessage(property_fd, init_message); !result.ok()) { - LOG(ERROR) << "Failed to send 'start sending messages' message: " << result.error(); - } -} - -static void HandlePropertyFd() { - auto message = ReadMessage(property_fd); - if (!message.ok()) { - LOG(ERROR) << "Could not read message from property service: " << message.error(); - return; - } - - auto property_message = PropertyMessage{}; - if (!property_message.ParseFromString(*message)) { - LOG(ERROR) << "Could not parse message from property service"; - return; - } - - switch (property_message.msg_case()) { - case PropertyMessage::kControlMessage: { - auto& control_message = property_message.control_message(); - bool success = HandleControlMessage(control_message.msg(), control_message.name(), - control_message.pid()); - - uint32_t response = success ? PROP_SUCCESS : PROP_ERROR_HANDLE_CONTROL_MESSAGE; - if (control_message.has_fd()) { - int fd = control_message.fd(); - TEMP_FAILURE_RETRY(send(fd, &response, sizeof(response), 0)); - close(fd); - } - break; - } - case PropertyMessage::kChangedMessage: { - auto& changed_message = property_message.changed_message(); - property_changed(changed_message.name(), changed_message.value()); - break; - } - default: - LOG(ERROR) << "Unknown message type from property service: " - << property_message.msg_case(); - } -} - int SecondStageMain(int argc, char** argv) { if (REBOOT_BOOTLOADER_ON_PANIC) { InstallRebootSignalHandlers(); @@ -623,7 +707,7 @@ int SecondStageMain(int argc, char** argv) { boot_clock::time_point start_time = boot_clock::now(); - trigger_shutdown = TriggerShutdown; + trigger_shutdown = [](const std::string& command) { shutdown_state.TriggerShutdown(command); }; SetStdioToDevNull(argv); InitKernelLogging(argv); @@ -683,11 +767,8 @@ int SecondStageMain(int argc, char** argv) { } InstallSignalFdHandler(&epoll); - + InstallInitNotifier(&epoll); StartPropertyService(&property_fd); - if (auto result = epoll.RegisterHandler(property_fd, HandlePropertyFd); !result.ok()) { - LOG(FATAL) << "Could not register epoll handler for property fd: " << result.error(); - } // Make the time that init stages started available for bootstat to log. RecordStageBoottimes(start_time); @@ -770,12 +851,12 @@ int SecondStageMain(int argc, char** argv) { // By default, sleep until something happens. auto epoll_timeout = std::optional{}; - if (do_shutdown && !IsShuttingDown()) { - do_shutdown = false; - HandlePowerctlMessage(shutdown_command); + auto shutdown_command = shutdown_state.CheckShutdown(); + if (shutdown_command) { + HandlePowerctlMessage(*shutdown_command); } - if (!(waiting_for_prop || Service::is_exec_service_running())) { + if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { am.ExecuteOneCommand(); } if (!IsShuttingDown()) { @@ -789,7 +870,7 @@ int SecondStageMain(int argc, char** argv) { } } - if (!(waiting_for_prop || Service::is_exec_service_running())) { + if (!(prop_waiter_state.MightBeWaiting() || Service::is_exec_service_running())) { // If there's more work to do, wake up again immediately. if (am.HasMoreCommands()) epoll_timeout = 0ms; } @@ -806,6 +887,7 @@ int SecondStageMain(int argc, char** argv) { (*function)(); } } + HandleControlMessages(); } return 0; diff --git a/init/init.h b/init/init.h index 4bbca6f3c..27f64e297 100644 --- a/init/init.h +++ b/init/init.h @@ -38,8 +38,9 @@ void DumpState(); void ResetWaitForProp(); void SendLoadPersistentPropertiesMessage(); -void SendStopSendingMessagesMessage(); -void SendStartSendingMessagesMessage(); + +void PropertyChanged(const std::string& name, const std::string& value); +bool QueueControlMessage(const std::string& message, const std::string& name, pid_t pid, int fd); int SecondStageMain(int argc, char** argv); diff --git a/init/property_service.cpp b/init/property_service.cpp index 730bf6de4..820652249 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -92,8 +92,11 @@ namespace init { static bool persistent_properties_loaded = false; static int property_set_fd = -1; +static int from_init_socket = -1; static int init_socket = -1; static bool accept_messages = false; +static std::mutex accept_messages_lock; +static std::thread property_service_thread; static PropertyInfoAreaFile property_info_area; @@ -115,6 +118,16 @@ static int PropertyAuditCallback(void* data, security_class_t /*cls*/, char* buf return 0; } +void StartSendingMessages() { + auto lock = std::lock_guard{accept_messages_lock}; + accept_messages = true; +} + +void StopSendingMessages() { + auto lock = std::lock_guard{accept_messages_lock}; + accept_messages = true; +} + bool CanReadProperty(const std::string& source_context, const std::string& name) { const char* target_context = nullptr; property_info_area->GetPropertyInfo(name.c_str(), &target_context, nullptr); @@ -147,17 +160,6 @@ static bool CheckMacPerms(const std::string& name, const char* target_context, return has_access; } -static void SendPropertyChanged(const std::string& name, const std::string& value) { - auto property_msg = PropertyMessage{}; - auto* changed_message = property_msg.mutable_changed_message(); - changed_message->set_name(name); - changed_message->set_value(value); - - if (auto result = SendMessage(init_socket, property_msg); !result.ok()) { - LOG(ERROR) << "Failed to send property changed message: " << result.error(); - } -} - static uint32_t PropertySet(const std::string& name, const std::string& value, std::string* error) { size_t valuelen = value.size(); @@ -195,8 +197,9 @@ static uint32_t PropertySet(const std::string& name, const std::string& value, s } // If init hasn't started its main loop, then it won't be handling property changed messages // anyway, so there's no need to try to send them. + auto lock = std::lock_guard{accept_messages_lock}; if (accept_messages) { - SendPropertyChanged(name, value); + PropertyChanged(name, value); } return PROP_SUCCESS; } @@ -373,33 +376,24 @@ class SocketConnection { static uint32_t SendControlMessage(const std::string& msg, const std::string& name, pid_t pid, SocketConnection* socket, std::string* error) { + auto lock = std::lock_guard{accept_messages_lock}; if (!accept_messages) { *error = "Received control message after shutdown, ignoring"; return PROP_ERROR_HANDLE_CONTROL_MESSAGE; } - auto property_msg = PropertyMessage{}; - auto* control_message = property_msg.mutable_control_message(); - control_message->set_msg(msg); - control_message->set_name(name); - control_message->set_pid(pid); - // We must release the fd before sending it to init, otherwise there will be a race with init. // If init calls close() before Release(), then fdsan will see the wrong tag and abort(). int fd = -1; if (socket != nullptr && SelinuxGetVendorAndroidVersion() > __ANDROID_API_Q__) { fd = socket->Release(); - control_message->set_fd(fd); } - if (auto result = SendMessage(init_socket, property_msg); !result.ok()) { - // We've already released the fd above, so if we fail to send the message to init, we need - // to manually free it here. - if (fd != -1) { - close(fd); - } - *error = "Failed to send control message: " + result.error().message(); - return PROP_ERROR_HANDLE_CONTROL_MESSAGE; + bool queue_success = QueueControlMessage(msg, name, pid, fd); + if (!queue_success && fd != -1) { + uint32_t response = PROP_ERROR_HANDLE_CONTROL_MESSAGE; + TEMP_FAILURE_RETRY(send(fd, &response, sizeof(response), 0)); + close(fd); } return PROP_SUCCESS; @@ -1110,14 +1104,6 @@ static void HandleInitSocket() { persistent_properties_loaded = true; break; } - case InitMessage::kStopSendingMessages: { - accept_messages = false; - break; - } - case InitMessage::kStartSendingMessages: { - accept_messages = true; - break; - } default: LOG(ERROR) << "Unknown message type from init: " << init_message.msg_case(); } @@ -1157,9 +1143,9 @@ void StartPropertyService(int* epoll_socket) { if (socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0, sockets) != 0) { PLOG(FATAL) << "Failed to socketpair() between property_service and init"; } - *epoll_socket = sockets[0]; + *epoll_socket = from_init_socket = sockets[0]; init_socket = sockets[1]; - accept_messages = true; + StartSendingMessages(); if (auto result = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, false, 0666, 0, 0, {}); @@ -1171,7 +1157,8 @@ void StartPropertyService(int* epoll_socket) { listen(property_set_fd, 8); - std::thread{PropertyServiceThread}.detach(); + auto new_thread = std::thread{PropertyServiceThread}; + property_service_thread.swap(new_thread); } } // namespace init diff --git a/init/property_service.h b/init/property_service.h index 506d116e1..2d49a36fa 100644 --- a/init/property_service.h +++ b/init/property_service.h @@ -32,5 +32,8 @@ bool CanReadProperty(const std::string& source_context, const std::string& name) void PropertyInit(); void StartPropertyService(int* epoll_socket); +void StartSendingMessages(); +void StopSendingMessages(); + } // namespace init } // namespace android diff --git a/init/reboot.cpp b/init/reboot.cpp index 8d8bd8ee6..f006df3a3 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -59,6 +59,7 @@ #include "builtin_arguments.h" #include "init.h" #include "mount_namespace.h" +#include "property_service.h" #include "reboot_utils.h" #include "service.h" #include "service_list.h" @@ -711,17 +712,12 @@ static void EnterShutdown() { for (const auto& s : ServiceList::GetInstance()) { s->UnSetExec(); } - // We no longer process messages about properties changing coming from property service, so we - // need to tell property service to stop sending us these messages, otherwise it'll fill the - // buffers and block indefinitely, causing future property sets, including those that init makes - // during shutdown in Service::NotifyStateChange() to also block indefinitely. - SendStopSendingMessagesMessage(); } static void LeaveShutdown() { LOG(INFO) << "Leaving shutdown mode"; shutting_down = false; - SendStartSendingMessagesMessage(); + StartSendingMessages(); } static Result UnmountAllApexes() { @@ -981,6 +977,10 @@ void HandlePowerctlMessage(const std::string& command) { return; } + // We do not want to process any messages (queue'ing triggers, shutdown messages, control + // messages, etc) from properties during reboot. + StopSendingMessages(); + if (userspace_reboot) { HandleUserspaceReboot(); return; From 054e6a388e25d18150a5f160e23927df91c38c52 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 6 Mar 2020 18:14:19 -0800 Subject: [PATCH 160/388] init: Fix restorecon for /metadata. Since new files can be introduced to /metadata after the initial restorecon, we need to skip hashing. Bug: 150907679 Test: rollback, ls -lZ /metadata/ota Change-Id: I1f928f519ae2c75aeedb74b70d513743e86bcf2b Merged-In: I1f928f519ae2c75aeedb74b70d513743e86bcf2b --- init/selinux.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init/selinux.cpp b/init/selinux.cpp index acbcbd647..808cb7fc7 100644 --- a/init/selinux.cpp +++ b/init/selinux.cpp @@ -539,9 +539,9 @@ void SelinuxRestoreContext() { // adb remount, snapshot-based updates, and DSUs all create files during // first-stage init. - selinux_android_restorecon("/metadata", SELINUX_ANDROID_RESTORECON_RECURSE); - selinux_android_restorecon(SnapshotManager::GetGlobalRollbackIndicatorPath().c_str(), 0); + selinux_android_restorecon("/metadata/gsi", SELINUX_ANDROID_RESTORECON_RECURSE | + SELINUX_ANDROID_RESTORECON_SKIP_SEHASH); } int SelinuxKlogCallback(int type, const char* fmt, ...) { From d6699b6b810855064a9771c6c6dc4d4756efbb55 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Wed, 11 Mar 2020 11:07:13 -0700 Subject: [PATCH 161/388] liblog: correct new APIs per the API review 1) Rename __android_logger_data to __android_log_message and rename __android_log_write_logger_data to __android_log_write_log_message. Move the const char* message argument into __android_log_message. 2) Add @param, @return, and "Available since API level 30." to the documentation of new functions. 3) Document that the user defined aborter should but may not abort. 4) Document the line separation is the responsibility of the log function provided to __android_log_set_logger(). Bug: 150898477 Test: build, liblog and libbase unit tests Change-Id: I07c41011ef25b3e7cc4943f3f1e240a2f6aa2802 --- base/liblog_symbols.cpp | 4 +- base/liblog_symbols.h | 9 +-- base/logging.cpp | 22 +++---- liblog/include/android/log.h | 99 +++++++++++++++++++++------- liblog/liblog.map.txt | 2 +- liblog/logger_write.cpp | 70 ++++++++++---------- liblog/tests/liblog_global_state.cpp | 34 +++++----- 7 files changed, 144 insertions(+), 96 deletions(-) diff --git a/base/liblog_symbols.cpp b/base/liblog_symbols.cpp index 8d5917907..14f943d0b 100644 --- a/base/liblog_symbols.cpp +++ b/base/liblog_symbols.cpp @@ -48,7 +48,7 @@ const std::optional& GetLibLogFunctions() { } DLSYM(__android_log_set_logger) - DLSYM(__android_log_write_logger_data) + DLSYM(__android_log_write_log_message) DLSYM(__android_log_logd_logger) DLSYM(__android_log_stderr_logger) DLSYM(__android_log_set_aborter) @@ -71,7 +71,7 @@ const std::optional& GetLibLogFunctions() { static std::optional liblog_functions = []() -> std::optional { return LibLogFunctions{ .__android_log_set_logger = __android_log_set_logger, - .__android_log_write_logger_data = __android_log_write_logger_data, + .__android_log_write_log_message = __android_log_write_log_message, .__android_log_logd_logger = __android_log_logd_logger, .__android_log_stderr_logger = __android_log_stderr_logger, .__android_log_set_aborter = __android_log_set_aborter, diff --git a/base/liblog_symbols.h b/base/liblog_symbols.h index b4ab06a88..2e6b47f7d 100644 --- a/base/liblog_symbols.h +++ b/base/liblog_symbols.h @@ -25,13 +25,10 @@ namespace base { struct LibLogFunctions { void (*__android_log_set_logger)(__android_logger_function logger); - void (*__android_log_write_logger_data)(struct __android_logger_data* logger_data, - const char* msg); + void (*__android_log_write_log_message)(struct __android_log_message* log_message); - void (*__android_log_logd_logger)(const struct __android_logger_data* logger_data, - const char* msg); - void (*__android_log_stderr_logger)(const struct __android_logger_data* logger_data, - const char* message); + void (*__android_log_logd_logger)(const struct __android_log_message* log_message); + void (*__android_log_stderr_logger)(const struct __android_log_message* log_message); void (*__android_log_set_aborter)(__android_aborter_function aborter); void (*__android_log_call_aborter)(const char* abort_message); diff --git a/base/logging.cpp b/base/logging.cpp index 9a6e0fb7e..cd460eb46 100644 --- a/base/logging.cpp +++ b/base/logging.cpp @@ -349,9 +349,9 @@ void LogdLogger::operator()(LogId id, LogSeverity severity, const char* tag, static auto& liblog_functions = GetLibLogFunctions(); if (liblog_functions) { - __android_logger_data logger_data = {sizeof(__android_logger_data), lg_id, priority, tag, - static_cast(nullptr), 0}; - liblog_functions->__android_log_logd_logger(&logger_data, message); + __android_log_message log_message = {sizeof(__android_log_message), lg_id, priority, tag, + static_cast(nullptr), 0, message}; + liblog_functions->__android_log_logd_logger(&log_message); } else { __android_log_buf_print(lg_id, priority, tag, "%s", message); } @@ -426,13 +426,13 @@ void SetLogger(LogFunction&& logger) { // std::function<>, which is the not-thread-safe alternative. static std::atomic logger_function(nullptr); auto* old_logger_function = logger_function.exchange(new LogFunction(logger)); - liblog_functions->__android_log_set_logger([](const struct __android_logger_data* logger_data, - const char* message) { - auto log_id = log_id_tToLogId(logger_data->buffer_id); - auto severity = PriorityToLogSeverity(logger_data->priority); + liblog_functions->__android_log_set_logger([](const struct __android_log_message* log_message) { + auto log_id = log_id_tToLogId(log_message->buffer_id); + auto severity = PriorityToLogSeverity(log_message->priority); auto& function = *logger_function.load(std::memory_order_acquire); - function(log_id, severity, logger_data->tag, logger_data->file, logger_data->line, message); + function(log_id, severity, log_message->tag, log_message->file, log_message->line, + log_message->message); }); delete old_logger_function; } else { @@ -576,9 +576,9 @@ void LogMessage::LogLine(const char* file, unsigned int line, LogSeverity severi static auto& liblog_functions = GetLibLogFunctions(); int32_t priority = LogSeverityToPriority(severity); if (liblog_functions) { - __android_logger_data logger_data = { - sizeof(__android_logger_data), LOG_ID_DEFAULT, priority, tag, file, line}; - liblog_functions->__android_log_write_logger_data(&logger_data, message); + __android_log_message log_message = { + sizeof(__android_log_message), LOG_ID_DEFAULT, priority, tag, file, line, message}; + liblog_functions->__android_log_write_log_message(&log_message); } else { if (tag == nullptr) { std::lock_guard lock(TagLock()); diff --git a/liblog/include/android/log.h b/liblog/include/android/log.h index 43a91ab5b..512c7cd7b 100644 --- a/liblog/include/android/log.h +++ b/liblog/include/android/log.h @@ -184,20 +184,21 @@ int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fm * Logger data struct used for writing log messages to liblog via __android_log_write_logger_data() * and sending log messages to user defined loggers specified in __android_log_set_logger(). */ -struct __android_logger_data { - size_t struct_size; /* Must be set to sizeof(__android_logger_data) and is used for versioning. */ - int32_t buffer_id; /* log_id_t or -1 to represent 'default'. */ - int32_t priority; /* android_LogPriority values. */ - const char* tag; - const char* file; /* Optional file name, may be set to nullptr. */ - uint32_t line; /* Optional line number, ignore if file is nullptr. */ +struct __android_log_message { + size_t + struct_size; /** Must be set to sizeof(__android_log_message) and is used for versioning. */ + int32_t buffer_id; /** {@link log_id_t} values. */ + int32_t priority; /** {@link android_LogPriority} values. */ + const char* tag; /** The tag for the log message. */ + const char* file; /** Optional file name, may be set to nullptr. */ + uint32_t line; /** Optional line number, ignore if file is nullptr. */ + const char* message; /** The log message itself. */ }; /** * Prototype for the 'logger' function that is called for every log message. */ -typedef void (*__android_logger_function)(const struct __android_logger_data* logger_data, - const char* message); +typedef void (*__android_logger_function)(const struct __android_log_message* log_message); /** * Prototype for the 'abort' function that is called when liblog will abort due to * __android_log_assert() failures. @@ -206,52 +207,85 @@ typedef void (*__android_aborter_function)(const char* abort_message); #if !defined(__ANDROID__) || __ANDROID_API__ >= 30 /** - * Writes the log message specified with logger_data and msg to the log. logger_data includes - * additional file name and line number information that a logger may use. logger_data is versioned - * for backwards compatibility. + * Writes the log message specified by log_message. log_message includes additional file name and + * line number information that a logger may use. log_message is versioned for backwards + * compatibility. * This assumes that loggability has already been checked through __android_log_is_loggable(). * Higher level logging libraries, such as libbase, first check loggability, then format their * buffers, then pass the message to liblog via this function, and therefore we do not want to * duplicate the loggability check here. + * + * @param log_message the log message itself, see {@link __android_log_message}. + * + * Available since API level 30. */ -void __android_log_write_logger_data(struct __android_logger_data* logger_data, const char* msg) - __INTRODUCED_IN(30); +void __android_log_write_log_message(struct __android_log_message* log_message) __INTRODUCED_IN(30); /** * Sets a user defined logger function. All log messages sent to liblog will be set to the - * function pointer specified by logger for processing. + * function pointer specified by logger for processing. It is not expected that log messages are + * already terminated with a new line. This function should add new lines if required for line + * separation. + * + * @param logger the new function that will handle log messages. + * + * Available since API level 30. */ void __android_log_set_logger(__android_logger_function logger) __INTRODUCED_IN(30); /** * Writes the log message to logd. This is an __android_logger_function and can be provided to * __android_log_set_logger(). It is the default logger when running liblog on a device. + * + * @param log_message the log message to write, see {@link __android_log_message}. + * + * Available since API level 30. */ -void __android_log_logd_logger(const struct __android_logger_data* logger_data, const char* msg) - __INTRODUCED_IN(30); +void __android_log_logd_logger(const struct __android_log_message* log_message) __INTRODUCED_IN(30); /** * Writes the log message to stderr. This is an __android_logger_function and can be provided to * __android_log_set_logger(). It is the default logger when running liblog on host. + * + * @param log_message the log message to write, see {@link __android_log_message}. + * + * Available since API level 30. */ -void __android_log_stderr_logger(const struct __android_logger_data* logger_data, - const char* message) __INTRODUCED_IN(30); +void __android_log_stderr_logger(const struct __android_log_message* log_message) + __INTRODUCED_IN(30); /** - * Sets a user defined aborter function that is called for __android_log_assert() failures. + * Sets a user defined aborter function that is called for __android_log_assert() failures. This + * user defined aborter function is highly recommended to abort and be noreturn, but is not strictly + * required to. + * + * @param aborter the new aborter function, see {@link __android_aborter_function}. + * + * Available since API level 30. */ void __android_log_set_aborter(__android_aborter_function aborter) __INTRODUCED_IN(30); /** * Calls the stored aborter function. This allows for other logging libraries to use the same * aborter function by calling this function in liblog. + * + * @param abort_message an additional message supplied when aborting, for example this is used to + * call android_set_abort_message() in __android_log_default_aborter(). + * + * Available since API level 30. */ void __android_log_call_aborter(const char* abort_message) __INTRODUCED_IN(30); /** * Sets android_set_abort_message() on device then aborts(). This is the default aborter. + * + * @param abort_message an additional message supplied when aborting. This functions calls + * android_set_abort_message() with its contents. + * + * Available since API level 30. */ -void __android_log_default_aborter(const char* abort_message) __INTRODUCED_IN(30); +void __android_log_default_aborter(const char* abort_message) __attribute__((noreturn)) +__INTRODUCED_IN(30); /** * Use the per-tag properties "log.tag." along with the minimum priority from @@ -263,7 +297,13 @@ void __android_log_default_aborter(const char* abort_message) __INTRODUCED_IN(30 * minimum priority needed to log. If only one is set, then that value is used to determine the * minimum priority needed. If none are set, then default_priority is used. * - * prio is ANDROID_LOG_VERBOSE to ANDROID_LOG_FATAL. + * @param prio the priority to test, takes {@link android_LogPriority} values. + * @param tag the tag to test. + * @param len the length of the tag. + * @param default_prio the default priority to use if no properties or minimum priority are set. + * @return an integer where 1 indicates that the message is loggable and 0 indicates that it is not. + * + * Available since API level 30. */ int __android_log_is_loggable(int prio, const char* tag, int default_prio) __INTRODUCED_IN(30); int __android_log_is_loggable_len(int prio, const char* tag, size_t len, int default_prio) @@ -272,13 +312,22 @@ int __android_log_is_loggable_len(int prio, const char* tag, size_t len, int def /** * Sets the minimum priority that will be logged for this process. * - * This returns the previous set minimum priority, or ANDROID_LOG_DEFAULT if none was set. + * @param priority the new minimum priority to set, takes @{link android_LogPriority} values. + * @return the previous set minimum priority as @{link android_LogPriority} values, or + * ANDROID_LOG_DEFAULT if none was set. + * + * Available since API level 30. */ int32_t __android_log_set_minimum_priority(int32_t priority) __INTRODUCED_IN(30); /** * Gets the minimum priority that will be logged for this process. If none has been set by a * previous __android_log_set_minimum_priority() call, this returns ANDROID_LOG_DEFAULT. + * + * @return the current minimum priority as @{link android_LogPriority} values, or + * ANDROID_LOG_DEFAULT if none is set. + * + * Available since API level 30. */ int32_t __android_log_get_minimum_priority(void) __INTRODUCED_IN(30); @@ -286,6 +335,10 @@ int32_t __android_log_get_minimum_priority(void) __INTRODUCED_IN(30); * Sets the default tag if no tag is provided when writing a log message. Defaults to * getprogname(). This truncates tag to the maximum log message size, though appropriate tags * should be much smaller. + * + * @param tag the new log tag. + * + * Available since API level 30. */ void __android_log_set_default_tag(const char* tag) __INTRODUCED_IN(30); #endif diff --git a/liblog/liblog.map.txt b/liblog/liblog.map.txt index 9dcbbc938..6ca1a164d 100644 --- a/liblog/liblog.map.txt +++ b/liblog/liblog.map.txt @@ -77,7 +77,7 @@ LIBLOG_R { # introduced=30 __android_log_set_logger; __android_log_set_minimum_priority; __android_log_stderr_logger; - __android_log_write_logger_data; + __android_log_write_log_message; }; LIBLOG_PRIVATE { diff --git a/liblog/logger_write.cpp b/liblog/logger_write.cpp index b420fa024..7c78ea19c 100644 --- a/liblog/logger_write.cpp +++ b/liblog/logger_write.cpp @@ -250,8 +250,7 @@ static uint64_t GetThreadId() { #endif } -void __android_log_stderr_logger(const struct __android_logger_data* logger_data, - const char* message) { +void __android_log_stderr_logger(const struct __android_log_message* log_message) { struct tm now; time_t t = time(nullptr); @@ -268,33 +267,32 @@ void __android_log_stderr_logger(const struct __android_logger_data* logger_data static_assert(arraysize(log_characters) - 1 == ANDROID_LOG_SILENT, "Mismatch in size of log_characters and values in android_LogPriority"); int32_t priority = - logger_data->priority > ANDROID_LOG_SILENT ? ANDROID_LOG_FATAL : logger_data->priority; + log_message->priority > ANDROID_LOG_SILENT ? ANDROID_LOG_FATAL : log_message->priority; char priority_char = log_characters[priority]; uint64_t tid = GetThreadId(); - if (logger_data->file != nullptr) { + if (log_message->file != nullptr) { fprintf(stderr, "%s %c %s %5d %5" PRIu64 " %s:%u] %s\n", - logger_data->tag ? logger_data->tag : "nullptr", priority_char, timestamp, getpid(), - tid, logger_data->file, logger_data->line, message); + log_message->tag ? log_message->tag : "nullptr", priority_char, timestamp, getpid(), + tid, log_message->file, log_message->line, log_message->message); } else { fprintf(stderr, "%s %c %s %5d %5" PRIu64 " %s\n", - logger_data->tag ? logger_data->tag : "nullptr", priority_char, timestamp, getpid(), - tid, message); + log_message->tag ? log_message->tag : "nullptr", priority_char, timestamp, getpid(), + tid, log_message->message); } } -void __android_log_logd_logger(const struct __android_logger_data* logger_data, - const char* message) { - int buffer_id = logger_data->buffer_id == LOG_ID_DEFAULT ? LOG_ID_MAIN : logger_data->buffer_id; +void __android_log_logd_logger(const struct __android_log_message* log_message) { + int buffer_id = log_message->buffer_id == LOG_ID_DEFAULT ? LOG_ID_MAIN : log_message->buffer_id; struct iovec vec[3]; vec[0].iov_base = - const_cast(reinterpret_cast(&logger_data->priority)); + const_cast(reinterpret_cast(&log_message->priority)); vec[0].iov_len = 1; - vec[1].iov_base = const_cast(static_cast(logger_data->tag)); - vec[1].iov_len = strlen(logger_data->tag) + 1; - vec[2].iov_base = const_cast(static_cast(message)); - vec[2].iov_len = strlen(message) + 1; + vec[1].iov_base = const_cast(static_cast(log_message->tag)); + vec[1].iov_len = strlen(log_message->tag) + 1; + vec[2].iov_base = const_cast(static_cast(log_message->message)); + vec[2].iov_len = strlen(log_message->message) + 1; write_to_log(static_cast(buffer_id), vec, 3); } @@ -303,29 +301,29 @@ int __android_log_write(int prio, const char* tag, const char* msg) { return __android_log_buf_write(LOG_ID_MAIN, prio, tag, msg); } -void __android_log_write_logger_data(__android_logger_data* logger_data, const char* msg) { +void __android_log_write_log_message(__android_log_message* log_message) { ErrnoRestorer errno_restorer; - if (logger_data->buffer_id != LOG_ID_DEFAULT && logger_data->buffer_id != LOG_ID_MAIN && - logger_data->buffer_id != LOG_ID_SYSTEM && logger_data->buffer_id != LOG_ID_RADIO && - logger_data->buffer_id != LOG_ID_CRASH) { + if (log_message->buffer_id != LOG_ID_DEFAULT && log_message->buffer_id != LOG_ID_MAIN && + log_message->buffer_id != LOG_ID_SYSTEM && log_message->buffer_id != LOG_ID_RADIO && + log_message->buffer_id != LOG_ID_CRASH) { return; } auto tag_lock = std::shared_lock{default_tag_lock, std::defer_lock}; - if (logger_data->tag == nullptr) { + if (log_message->tag == nullptr) { tag_lock.lock(); - logger_data->tag = GetDefaultTag().c_str(); + log_message->tag = GetDefaultTag().c_str(); } #if __BIONIC__ - if (logger_data->priority == ANDROID_LOG_FATAL) { - android_set_abort_message(msg); + if (log_message->priority == ANDROID_LOG_FATAL) { + android_set_abort_message(log_message->message); } #endif auto lock = std::shared_lock{logger_function_lock}; - logger_function(logger_data, msg); + logger_function(log_message); } int __android_log_buf_write(int bufID, int prio, const char* tag, const char* msg) { @@ -335,8 +333,9 @@ int __android_log_buf_write(int bufID, int prio, const char* tag, const char* ms return 0; } - __android_logger_data logger_data = {sizeof(__android_logger_data), bufID, prio, tag, nullptr, 0}; - __android_log_write_logger_data(&logger_data, msg); + __android_log_message log_message = { + sizeof(__android_log_message), bufID, prio, tag, nullptr, 0, msg}; + __android_log_write_log_message(&log_message); return 1; } @@ -351,9 +350,9 @@ int __android_log_vprint(int prio, const char* tag, const char* fmt, va_list ap) vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); - __android_logger_data logger_data = { - sizeof(__android_logger_data), LOG_ID_MAIN, prio, tag, nullptr, 0}; - __android_log_write_logger_data(&logger_data, buf); + __android_log_message log_message = { + sizeof(__android_log_message), LOG_ID_MAIN, prio, tag, nullptr, 0, buf}; + __android_log_write_log_message(&log_message); return 1; } @@ -371,9 +370,9 @@ int __android_log_print(int prio, const char* tag, const char* fmt, ...) { vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); va_end(ap); - __android_logger_data logger_data = { - sizeof(__android_logger_data), LOG_ID_MAIN, prio, tag, nullptr, 0}; - __android_log_write_logger_data(&logger_data, buf); + __android_log_message log_message = { + sizeof(__android_log_message), LOG_ID_MAIN, prio, tag, nullptr, 0, buf}; + __android_log_write_log_message(&log_message); return 1; } @@ -391,8 +390,9 @@ int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fm vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); va_end(ap); - __android_logger_data logger_data = {sizeof(__android_logger_data), bufID, prio, tag, nullptr, 0}; - __android_log_write_logger_data(&logger_data, buf); + __android_log_message log_message = { + sizeof(__android_log_message), bufID, prio, tag, nullptr, 0, buf}; + __android_log_write_log_message(&log_message); return 1; } diff --git a/liblog/tests/liblog_global_state.cpp b/liblog/tests/liblog_global_state.cpp index 9a181ef62..3508818f2 100644 --- a/liblog/tests/liblog_global_state.cpp +++ b/liblog/tests/liblog_global_state.cpp @@ -59,16 +59,15 @@ TEST(liblog_global_state, libbase_logs_with_liblog_set_logger) { static unsigned int expected_line; static std::string expected_message = "libbase test message"; - auto liblog_logger_function = [](const struct __android_logger_data* logger_data, - const char* message) { + auto liblog_logger_function = [](const struct __android_log_message* log_message) { message_seen = true; - EXPECT_EQ(sizeof(__android_logger_data), logger_data->struct_size); - EXPECT_EQ(LOG_ID_DEFAULT, logger_data->buffer_id); - EXPECT_EQ(ANDROID_LOG_WARN, logger_data->priority); - EXPECT_STREQ(LOG_TAG, logger_data->tag); - EXPECT_EQ(expected_file, logger_data->file); - EXPECT_EQ(expected_line, logger_data->line); - EXPECT_EQ(expected_message, message); + EXPECT_EQ(sizeof(__android_log_message), log_message->struct_size); + EXPECT_EQ(LOG_ID_DEFAULT, log_message->buffer_id); + EXPECT_EQ(ANDROID_LOG_WARN, log_message->priority); + EXPECT_STREQ(LOG_TAG, log_message->tag); + EXPECT_EQ(expected_file, log_message->file); + EXPECT_EQ(expected_line, log_message->line); + EXPECT_EQ(expected_message, log_message->message); }; __android_log_set_logger(liblog_logger_function); @@ -111,16 +110,15 @@ TEST(liblog_global_state, liblog_logs_with_liblog_set_logger) { static int expected_priority = ANDROID_LOG_WARN; static std::string expected_message = "libbase test message"; - auto liblog_logger_function = [](const struct __android_logger_data* logger_data, - const char* message) { + auto liblog_logger_function = [](const struct __android_log_message* log_message) { message_seen = true; - EXPECT_EQ(sizeof(__android_logger_data), logger_data->struct_size); - EXPECT_EQ(expected_buffer_id, logger_data->buffer_id); - EXPECT_EQ(expected_priority, logger_data->priority); - EXPECT_STREQ(LOG_TAG, logger_data->tag); - EXPECT_STREQ(nullptr, logger_data->file); - EXPECT_EQ(0U, logger_data->line); - EXPECT_EQ(expected_message, message); + EXPECT_EQ(sizeof(__android_log_message), log_message->struct_size); + EXPECT_EQ(expected_buffer_id, log_message->buffer_id); + EXPECT_EQ(expected_priority, log_message->priority); + EXPECT_STREQ(LOG_TAG, log_message->tag); + EXPECT_STREQ(nullptr, log_message->file); + EXPECT_EQ(0U, log_message->line); + EXPECT_EQ(expected_message, log_message->message); }; __android_log_set_logger(liblog_logger_function); From 22207e65903ecd486714d66f3970a67a64d85a8f Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Tue, 17 Mar 2020 03:43:03 +0900 Subject: [PATCH 162/388] base: dlopen/dlsym for liblog when SDK_VER <= 29 libbase doesn't have to rely on dlopen/dlsym to use liblog's new symbols when it is built for __ANDROID_SDK_VERSION__ > 29. Bug: 150860940 Test: TARGET_BUILD_APPS="com.android.adbd com.android.resolv" m objdump -T ...shared_com.android.resolv/libbase.so | grep LIBLOG_R => should be none because resolv apex is targeting 29 objdump -T ...shared_com.android.adbd/libbase.so | grep LIBLOG_R => should list all new symbols because adbd apex is targeting R objdump -T ...shared/libbase.so | grep LIBLOG_R => should list all new symbols Change-Id: I7f7f16510d7637cd380fe35ea9ff3e804f38851d --- base/Android.bp | 4 ---- base/liblog_symbols.cpp | 4 +--- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/base/Android.bp b/base/Android.bp index 25c74f219..3702b43db 100644 --- a/base/Android.bp +++ b/base/Android.bp @@ -70,10 +70,6 @@ cc_defaults { "test_utils.cpp", ], - static: { - cflags: ["-DNO_LIBLOG_DLSYM"], - }, - cppflags: ["-Wexit-time-destructors"], shared_libs: ["liblog"], target: { diff --git a/base/liblog_symbols.cpp b/base/liblog_symbols.cpp index 8d5917907..ba4c16157 100644 --- a/base/liblog_symbols.cpp +++ b/base/liblog_symbols.cpp @@ -16,11 +16,9 @@ #include "liblog_symbols.h" -#if defined(__ANDROID__) -#if !defined(NO_LIBLOG_DLSYM) || defined(__ANDROID_APEX__) +#if defined(__ANDROID_SDK_VERSION__) && (__ANDROID_SDK_VERSION__ <= 29) #define USE_DLSYM #endif -#endif #ifdef USE_DLSYM #include From 8196687d396874a088458da1e9d8757337dd6fbc Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Tue, 17 Mar 2020 11:00:17 -0700 Subject: [PATCH 163/388] Enforce permission in native puller API. Test: m Test: No security exceptions on boot Bug: 148955001 Change-Id: If196a82bf5a54ee15557825e16f70b5f64f45412 --- libstats/pull/include/stats_pull_atom_callback.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libstats/pull/include/stats_pull_atom_callback.h b/libstats/pull/include/stats_pull_atom_callback.h index ad9b04edc..0b0df2b82 100644 --- a/libstats/pull/include/stats_pull_atom_callback.h +++ b/libstats/pull/include/stats_pull_atom_callback.h @@ -112,6 +112,8 @@ typedef AStatsManager_PullAtomCallbackReturn (*AStatsManager_PullAtomCallback)( * invoke the callback when the stats service determines that this atom needs to be * pulled. * + * Requires the REGISTER_STATS_PULL_ATOM permission. + * * \param atom_tag The tag of the atom for this pull atom callback. * \param metadata Optional metadata specifying the timeout, cool down time, and * additive fields for mapping isolated to host uids. @@ -128,6 +130,8 @@ void AStatsManager_registerPullAtomCallback(int32_t atom_tag, * Unregisters a callback for an atom when that atom is to be pulled. Note that any ongoing * pulls will still occur. * + * Requires the REGISTER_STATS_PULL_ATOM permission. + * * \param atomTag The tag of the atom of which to unregister */ void AStatsManager_unregisterPullAtomCallback(int32_t atom_tag); From c4a9d16ef1e8d4c277ff5071a6e250acd5e4f5e8 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Mon, 9 Mar 2020 11:33:44 -0700 Subject: [PATCH 164/388] [adb data server] wait for installation results before terminates Currently the server often quits before installation finishes. As a result, there is no difference in the commandline output between a successful installation and a failed one. Let adb client wait till installation fails or succeeds by parsing the output from the inc-server process. Test: $ adb install --incremental ~/Downloads/base.apk Test: Performing Incremental Install Test: Serving... Test: All files should be loaded. Notifying the device. Test: Failure [INSTALL_PARSE_FAILED_NOT_APK: Failed to parse /data/app/vmdl749343150.tmp/base.apk: Failed to load asset path /data/app/vmdl749343150.tmp/base.apk] Test: Install command complete (ms: 91 total, 0 apk prep, 91 install) BUG: b/150865433 Change-Id: Ie33505f9cc08fc6d60ad4a5d709526e7aa9a0ad1 --- adb/client/commandline.cpp | 49 ++++++++++++--- adb/client/incremental.cpp | 60 ++++++++++++++++-- adb/client/incremental.h | 3 + adb/client/incremental_server.cpp | 100 ++++++++++++++++++------------ adb/client/incremental_server.h | 2 +- 5 files changed, 160 insertions(+), 54 deletions(-) diff --git a/adb/client/commandline.cpp b/adb/client/commandline.cpp index 081bac4df..14ccfbe78 100644 --- a/adb/client/commandline.cpp +++ b/adb/client/commandline.cpp @@ -1423,6 +1423,26 @@ static bool _is_valid_ack_reply_fd(const int ack_reply_fd) { #endif } +static bool _is_valid_fd(int fd) { + // Disallow invalid FDs and stdin/out/err as well. + if (fd < 3) { + return false; + } +#ifdef _WIN32 + HANDLE handle = adb_get_os_handle(fd); + DWORD info = 0; + if (GetHandleInformation(handle, &info) == 0) { + return false; + } +#else + int flags = fcntl(fd, F_GETFD); + if (flags == -1) { + return false; + } +#endif + return true; +} + int adb_commandline(int argc, const char** argv) { bool no_daemon = false; bool is_daemon = false; @@ -1977,17 +1997,28 @@ int adb_commandline(int argc, const char** argv) { } } } else if (!strcmp(argv[0], "inc-server")) { - if (argc < 3) { - error_exit("usage: adb inc-server FD FILE1 FILE2 ..."); + if (argc < 4) { +#ifdef _WIN32 + error_exit("usage: adb inc-server CONNECTION_HANDLE OUTPUT_HANDLE FILE1 FILE2 ..."); +#else + error_exit("usage: adb inc-server CONNECTION_FD OUTPUT_FD FILE1 FILE2 ..."); +#endif } - int fd = atoi(argv[1]); - if (fd < 3) { - // Disallow invalid FDs and stdin/out/err as well. - error_exit("Invalid fd number given: %d", fd); + int connection_fd = atoi(argv[1]); + if (!_is_valid_fd(connection_fd)) { + error_exit("Invalid connection_fd number given: %d", connection_fd); } - fd = adb_register_socket(fd); - close_on_exec(fd); - return incremental::serve(fd, argc - 2, argv + 2); + + connection_fd = adb_register_socket(connection_fd); + close_on_exec(connection_fd); + + int output_fd = atoi(argv[2]); + if (!_is_valid_fd(output_fd)) { + error_exit("Invalid output_fd number given: %d", output_fd); + } + output_fd = adb_register_socket(output_fd); + close_on_exec(output_fd); + return incremental::serve(connection_fd, output_fd, argc - 3, argv + 3); } error_exit("unknown command %s", argv[0]); diff --git a/adb/client/incremental.cpp b/adb/client/incremental.cpp index 3ceb3748a..fd608cced 100644 --- a/adb/client/incremental.cpp +++ b/adb/client/incremental.cpp @@ -193,20 +193,72 @@ std::optional install(std::vector files) { auto fd_param = std::to_string(osh); #endif + // pipe for child process to write output + int print_fds[2]; + if (adb_socketpair(print_fds) != 0) { + fprintf(stderr, "Failed to create socket pair for child to print to parent\n"); + return {}; + } + auto [pipe_read_fd, pipe_write_fd] = print_fds; + auto pipe_write_fd_param = std::to_string(pipe_write_fd); + close_on_exec(pipe_read_fd); + std::vector args(std::move(files)); - args.insert(args.begin(), {"inc-server", fd_param}); - auto child = adb_launch_process(adb_path, std::move(args), {connection_fd.get()}); + args.insert(args.begin(), {"inc-server", fd_param, pipe_write_fd_param}); + auto child = + adb_launch_process(adb_path, std::move(args), {connection_fd.get(), pipe_write_fd}); if (!child) { fprintf(stderr, "adb: failed to fork: %s\n", strerror(errno)); return {}; } + adb_close(pipe_write_fd); + auto killOnExit = [](Process* p) { p->kill(); }; std::unique_ptr serverKiller(&child, killOnExit); - // TODO: Terminate server process if installation fails. - serverKiller.release(); + Result result = wait_for_installation(pipe_read_fd); + adb_close(pipe_read_fd); + + if (result == Result::Success) { + // adb client exits now but inc-server can continue + serverKiller.release(); + } return child; } +Result wait_for_installation(int read_fd) { + static constexpr int maxMessageSize = 256; + std::vector child_stdout(CHUNK_SIZE); + int bytes_read; + int buf_size = 0; + // TODO(b/150865433): optimize child's output parsing + while ((bytes_read = adb_read(read_fd, child_stdout.data() + buf_size, + child_stdout.size() - buf_size)) > 0) { + // print to parent's stdout + fprintf(stdout, "%.*s", bytes_read, child_stdout.data() + buf_size); + + buf_size += bytes_read; + const std::string_view stdout_str(child_stdout.data(), buf_size); + // wait till installation either succeeds or fails + if (stdout_str.find("Success") != std::string::npos) { + return Result::Success; + } + // on failure, wait for full message + static constexpr auto failure_msg_head = "Failure ["sv; + if (const auto begin_itr = stdout_str.find(failure_msg_head); + begin_itr != std::string::npos) { + if (buf_size >= maxMessageSize) { + return Result::Failure; + } + const auto end_itr = stdout_str.rfind("]"); + if (end_itr != std::string::npos && end_itr >= begin_itr + failure_msg_head.size()) { + return Result::Failure; + } + } + child_stdout.resize(buf_size + CHUNK_SIZE); + } + return Result::None; +} + } // namespace incremental diff --git a/adb/client/incremental.h b/adb/client/incremental.h index 4b9f6bde0..731e6fb4d 100644 --- a/adb/client/incremental.h +++ b/adb/client/incremental.h @@ -27,4 +27,7 @@ namespace incremental { std::optional install(std::vector files); +enum class Result { Success, Failure, None }; +Result wait_for_installation(int read_fd); + } // namespace incremental diff --git a/adb/client/incremental_server.cpp b/adb/client/incremental_server.cpp index 2512d0562..6c36a0f64 100644 --- a/adb/client/incremental_server.cpp +++ b/adb/client/incremental_server.cpp @@ -18,13 +18,6 @@ #include "incremental_server.h" -#include "adb.h" -#include "adb_io.h" -#include "adb_trace.h" -#include "adb_unique_fd.h" -#include "adb_utils.h" -#include "sysdeps.h" - #include #include #include @@ -41,6 +34,13 @@ #include #include +#include "adb.h" +#include "adb_io.h" +#include "adb_trace.h" +#include "adb_unique_fd.h" +#include "adb_utils.h" +#include "sysdeps.h" + namespace incremental { static constexpr int kBlockSize = 4096; @@ -49,6 +49,7 @@ static constexpr short kCompressionNone = 0; static constexpr short kCompressionLZ4 = 1; static constexpr int kCompressBound = std::max(kBlockSize, LZ4_COMPRESSBOUND(kBlockSize)); static constexpr auto kReadBufferSize = 128 * 1024; +static constexpr int kPollTimeoutMillis = 300000; // 5 minutes using BlockSize = int16_t; using FileId = int16_t; @@ -61,9 +62,10 @@ using MagicType = uint32_t; static constexpr MagicType INCR = 0x494e4352; // LE INCR -static constexpr RequestType EXIT = 0; +static constexpr RequestType SERVING_COMPLETE = 0; static constexpr RequestType BLOCK_MISSING = 1; static constexpr RequestType PREFETCH = 2; +static constexpr RequestType DESTROY = 3; static constexpr inline int64_t roundDownToBlockOffset(int64_t val) { return val & ~(kBlockSize - 1); @@ -162,8 +164,8 @@ class File { class IncrementalServer { public: - IncrementalServer(unique_fd fd, std::vector files) - : adb_fd_(std::move(fd)), files_(std::move(files)) { + IncrementalServer(unique_fd adb_fd, unique_fd output_fd, std::vector files) + : adb_fd_(std::move(adb_fd)), output_fd_(std::move(output_fd)), files_(std::move(files)) { buffer_.reserve(kReadBufferSize); } @@ -197,9 +199,10 @@ class IncrementalServer { void Send(const void* data, size_t size, bool flush); void Flush(); using TimePoint = decltype(std::chrono::high_resolution_clock::now()); - bool Exit(std::optional startTime, int missesCount, int missesSent); + bool ServingComplete(std::optional startTime, int missesCount, int missesSent); unique_fd const adb_fd_; + unique_fd const output_fd_; std::vector files_; // Incoming data buffer. @@ -210,6 +213,9 @@ class IncrementalServer { long long sentSize_ = 0; std::vector pendingBlocks_; + + // True when client notifies that all the data has been received + bool servingComplete_; }; bool IncrementalServer::SkipToRequest(void* buffer, size_t* size, bool blocking) { @@ -217,7 +223,8 @@ bool IncrementalServer::SkipToRequest(void* buffer, size_t* size, bool blocking) // Looking for INCR magic. bool magic_found = false; int bcur = 0; - for (int bsize = buffer_.size(); bcur + 4 < bsize; ++bcur) { + int bsize = buffer_.size(); + for (bcur = 0; bcur + 4 < bsize; ++bcur) { uint32_t magic = be32toh(*(uint32_t*)(buffer_.data() + bcur)); if (magic == INCR) { magic_found = true; @@ -226,8 +233,8 @@ bool IncrementalServer::SkipToRequest(void* buffer, size_t* size, bool blocking) } if (bcur > 0) { - // Stream the rest to stderr. - fprintf(stderr, "%.*s", bcur, buffer_.data()); + // output the rest. + WriteFdExactly(output_fd_, buffer_.data(), bcur); erase_buffer_head(bcur); } @@ -239,17 +246,26 @@ bool IncrementalServer::SkipToRequest(void* buffer, size_t* size, bool blocking) } adb_pollfd pfd = {adb_fd_.get(), POLLIN, 0}; - auto res = adb_poll(&pfd, 1, blocking ? -1 : 0); + auto res = adb_poll(&pfd, 1, blocking ? kPollTimeoutMillis : 0); + if (res != 1) { + WriteFdExactly(output_fd_, buffer_.data(), buffer_.size()); if (res < 0) { - fprintf(stderr, "Failed to poll: %s\n", strerror(errno)); + D("Failed to poll: %s\n", strerror(errno)); + return false; + } + if (blocking) { + fprintf(stderr, "Timed out waiting for data from device.\n"); + } + if (blocking && servingComplete_) { + // timeout waiting from client. Serving is complete, so quit. return false; } *size = 0; return true; } - auto bsize = buffer_.size(); + bsize = buffer_.size(); buffer_.resize(kReadBufferSize); int r = adb_read(adb_fd_, buffer_.data() + bsize, kReadBufferSize - bsize); if (r > 0) { @@ -257,21 +273,19 @@ bool IncrementalServer::SkipToRequest(void* buffer, size_t* size, bool blocking) continue; } - if (r == -1) { - fprintf(stderr, "Failed to read from fd %d: %d. Exit\n", adb_fd_.get(), errno); - return false; - } - - // socket is closed - return false; + D("Failed to read from fd %d: %d. Exit\n", adb_fd_.get(), errno); + break; } + // socket is closed. print remaining messages + WriteFdExactly(output_fd_, buffer_.data(), buffer_.size()); + return false; } std::optional IncrementalServer::ReadRequest(bool blocking) { uint8_t commandBuf[sizeof(RequestCommand)]; auto size = sizeof(commandBuf); if (!SkipToRequest(&commandBuf, &size, blocking)) { - return {{EXIT}}; + return {{DESTROY}}; } if (size < sizeof(RequestCommand)) { return {}; @@ -391,17 +405,17 @@ void IncrementalServer::Flush() { pendingBlocks_.clear(); } -bool IncrementalServer::Exit(std::optional startTime, int missesCount, int missesSent) { +bool IncrementalServer::ServingComplete(std::optional startTime, int missesCount, + int missesSent) { + servingComplete_ = true; using namespace std::chrono; auto endTime = high_resolution_clock::now(); - fprintf(stderr, - "Connection failed or received exit command. Exit.\n" - "Misses: %d, of those unique: %d; sent compressed: %d, uncompressed: " - "%d, mb: %.3f\n" - "Total time taken: %.3fms\n", - missesCount, missesSent, compressed_, uncompressed_, sentSize_ / 1024.0 / 1024.0, - duration_cast(endTime - (startTime ? *startTime : endTime)).count() / - 1000.0); + D("Streaming completed.\n" + "Misses: %d, of those unique: %d; sent compressed: %d, uncompressed: " + "%d, mb: %.3f\n" + "Total time taken: %.3fms\n", + missesCount, missesSent, compressed_, uncompressed_, sentSize_ / 1024.0 / 1024.0, + duration_cast(endTime - (startTime ? *startTime : endTime)).count() / 1000.0); return true; } @@ -425,7 +439,7 @@ bool IncrementalServer::Serve() { std::all_of(files_.begin(), files_.end(), [](const File& f) { return f.sentBlocksCount == NumBlocks(f.sentBlocks.size()); })) { - fprintf(stdout, "All files should be loaded. Notifying the device.\n"); + fprintf(stderr, "All files should be loaded. Notifying the device.\n"); SendDone(); doneSent = true; } @@ -446,9 +460,14 @@ bool IncrementalServer::Serve() { BlockIdx blockIdx = request->block_idx; switch (request->request_type) { - case EXIT: { + case DESTROY: { // Stop everything. - return Exit(startTime, missesCount, missesSent); + return true; + } + case SERVING_COMPLETE: { + // Not stopping the server here. + ServingComplete(startTime, missesCount, missesSent); + break; } case BLOCK_MISSING: { ++missesCount; @@ -502,8 +521,9 @@ bool IncrementalServer::Serve() { } } -bool serve(int adb_fd, int argc, const char** argv) { - auto connection_fd = unique_fd(adb_fd); +bool serve(int connection_fd, int output_fd, int argc, const char** argv) { + auto connection_ufd = unique_fd(connection_fd); + auto output_ufd = unique_fd(output_fd); if (argc <= 0) { error_exit("inc-server: must specify at least one file."); } @@ -526,7 +546,7 @@ bool serve(int adb_fd, int argc, const char** argv) { files.emplace_back(filepath, i, st.st_size, std::move(fd)); } - IncrementalServer server(std::move(connection_fd), std::move(files)); + IncrementalServer server(std::move(connection_ufd), std::move(output_ufd), std::move(files)); printf("Serving...\n"); fclose(stdin); fclose(stdout); diff --git a/adb/client/incremental_server.h b/adb/client/incremental_server.h index 53f011eb3..55b8215b8 100644 --- a/adb/client/incremental_server.h +++ b/adb/client/incremental_server.h @@ -21,6 +21,6 @@ namespace incremental { // Expecting arguments like: // {FILE1 FILE2 ...} // Where FILE* are files to serve. -bool serve(int adbFd, int argc, const char** argv); +bool serve(int connection_fd, int output_fd, int argc, const char** argv); } // namespace incremental From 8cdefd4f95c173e9d61b28e219754e4e119fbbb0 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 13 Mar 2020 13:11:43 -0700 Subject: [PATCH 165/388] [adb incremental] send priority blocks first Before this change, "Success" is returned after all data is streamed, around 7.5 seconds for Megacity. After this change, "Success" is returned in about 1.5 seconds, before streaming finishes. BUG: 151676293 Test: manual Change-Id: Ifda7de48da8e82623c99ae0194f70cb162fd72fa --- adb/Android.bp | 1 + adb/client/incremental_server.cpp | 30 ++++- adb/client/incremental_utils.cpp | 216 ++++++++++++++++++++++++++++++ adb/client/incremental_utils.h | 26 ++++ 4 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 adb/client/incremental_utils.cpp create mode 100644 adb/client/incremental_utils.h diff --git a/adb/Android.bp b/adb/Android.bp index 6fd0767fa..2f719456d 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -298,6 +298,7 @@ cc_binary_host { "client/fastdeploycallbacks.cpp", "client/incremental.cpp", "client/incremental_server.cpp", + "client/incremental_utils.cpp", "shell_service_protocol.cpp", ], diff --git a/adb/client/incremental_server.cpp b/adb/client/incremental_server.cpp index 6c36a0f64..1f47de872 100644 --- a/adb/client/incremental_server.cpp +++ b/adb/client/incremental_server.cpp @@ -39,6 +39,7 @@ #include "adb_trace.h" #include "adb_unique_fd.h" #include "adb_utils.h" +#include "incremental_utils.h" #include "sysdeps.h" namespace incremental { @@ -136,6 +137,7 @@ class File { // Plain file File(const char* filepath, FileId id, int64_t size, unique_fd fd) : File(filepath, id, size) { this->fd_ = std::move(fd); + priority_blocks_ = PriorityBlocksForFile(filepath, fd_.get(), size); } int64_t ReadBlock(BlockIdx block_idx, void* buf, bool* is_zip_compressed, std::string* error) const { @@ -147,6 +149,7 @@ class File { } const unique_fd& RawFd() const { return fd_; } + const std::vector& PriorityBlocks() const { return priority_blocks_; } std::vector sentBlocks; NumBlocks sentBlocksCount = 0; @@ -160,6 +163,7 @@ class File { sentBlocks.resize(numBytesToNumBlocks(size)); } unique_fd fd_; + std::vector priority_blocks_; }; class IncrementalServer { @@ -176,14 +180,23 @@ class IncrementalServer { const File* file; BlockIdx overallIndex = 0; BlockIdx overallEnd = 0; + BlockIdx priorityIndex = 0; - PrefetchState(const File& f) : file(&f), overallEnd((BlockIdx)f.sentBlocks.size()) {} - PrefetchState(const File& f, BlockIdx start, int count) + explicit PrefetchState(const File& f, BlockIdx start, int count) : file(&f), overallIndex(start), overallEnd(std::min(start + count, f.sentBlocks.size())) {} - bool done() const { return overallIndex >= overallEnd; } + explicit PrefetchState(const File& f) + : PrefetchState(f, 0, (BlockIdx)f.sentBlocks.size()) {} + + bool done() const { + const bool overallSent = (overallIndex >= overallEnd); + if (file->PriorityBlocks().empty()) { + return overallSent; + } + return overallSent && (priorityIndex >= (BlockIdx)file->PriorityBlocks().size()); + } }; bool SkipToRequest(void* buffer, size_t* size, bool blocking); @@ -365,6 +378,17 @@ void IncrementalServer::RunPrefetching() { while (!prefetches_.empty() && blocksToSend > 0) { auto& prefetch = prefetches_.front(); const auto& file = *prefetch.file; + const auto& priority_blocks = file.PriorityBlocks(); + if (!priority_blocks.empty()) { + for (auto& i = prefetch.priorityIndex; + blocksToSend > 0 && i < (BlockIdx)priority_blocks.size(); ++i) { + if (auto res = SendBlock(file.id, priority_blocks[i]); res == SendResult::Sent) { + --blocksToSend; + } else if (res == SendResult::Error) { + fprintf(stderr, "Failed to send priority block %" PRId32 "\n", i); + } + } + } for (auto& i = prefetch.overallIndex; blocksToSend > 0 && i < prefetch.overallEnd; ++i) { if (auto res = SendBlock(file.id, i); res == SendResult::Sent) { --blocksToSend; diff --git a/adb/client/incremental_utils.cpp b/adb/client/incremental_utils.cpp new file mode 100644 index 000000000..316480c57 --- /dev/null +++ b/adb/client/incremental_utils.cpp @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2020 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 TRACE_TAG INCREMENTAL + +#include "incremental_utils.h" + +#include +#include +#include + +#include +#include +#include + +#include "sysdeps.h" + +static constexpr int kBlockSize = 4096; + +static constexpr inline int32_t offsetToBlockIndex(int64_t offset) { + return (offset & ~(kBlockSize - 1)) >> 12; +} + +template +T valueAt(int fd, off64_t offset) { + T t; + memset(&t, 0, sizeof(T)); + if (adb_pread(fd, &t, sizeof(T), offset) != sizeof(T)) { + memset(&t, -1, sizeof(T)); + } + + return t; +} + +static void appendBlocks(int32_t start, int count, std::vector* blocks) { + if (count == 1) { + blocks->push_back(start); + } else { + auto oldSize = blocks->size(); + blocks->resize(oldSize + count); + std::iota(blocks->begin() + oldSize, blocks->end(), start); + } +} + +template +static void unduplicate(std::vector& v) { + std::unordered_set uniques(v.size()); + v.erase(std::remove_if(v.begin(), v.end(), + [&uniques](T t) { return !uniques.insert(t).second; }), + v.end()); +} + +static off64_t CentralDirOffset(int fd, int64_t fileSize) { + static constexpr int kZipEocdRecMinSize = 22; + static constexpr int32_t kZipEocdRecSig = 0x06054b50; + static constexpr int kZipEocdCentralDirSizeFieldOffset = 12; + static constexpr int kZipEocdCommentLengthFieldOffset = 20; + + int32_t sigBuf = 0; + off64_t eocdOffset = -1; + off64_t maxEocdOffset = fileSize - kZipEocdRecMinSize; + int16_t commentLenBuf = 0; + + // Search from the end of zip, backward to find beginning of EOCD + for (int16_t commentLen = 0; commentLen < fileSize; ++commentLen) { + sigBuf = valueAt(fd, maxEocdOffset - commentLen); + if (sigBuf == kZipEocdRecSig) { + commentLenBuf = valueAt( + fd, maxEocdOffset - commentLen + kZipEocdCommentLengthFieldOffset); + if (commentLenBuf == commentLen) { + eocdOffset = maxEocdOffset - commentLen; + break; + } + } + } + + if (eocdOffset < 0) { + return -1; + } + + off64_t cdLen = static_cast( + valueAt(fd, eocdOffset + kZipEocdCentralDirSizeFieldOffset)); + + return eocdOffset - cdLen; +} + +// Does not support APKs larger than 4GB +static off64_t SignerBlockOffset(int fd, int64_t fileSize) { + static constexpr int kApkSigBlockMinSize = 32; + static constexpr int kApkSigBlockFooterSize = 24; + static constexpr int64_t APK_SIG_BLOCK_MAGIC_HI = 0x3234206b636f6c42l; + static constexpr int64_t APK_SIG_BLOCK_MAGIC_LO = 0x20676953204b5041l; + + off64_t cdOffset = CentralDirOffset(fd, fileSize); + if (cdOffset < 0) { + return -1; + } + // CD offset is where original signer block ends. Search backwards for magic and footer. + if (cdOffset < kApkSigBlockMinSize || + valueAt(fd, cdOffset - 2 * sizeof(int64_t)) != APK_SIG_BLOCK_MAGIC_LO || + valueAt(fd, cdOffset - sizeof(int64_t)) != APK_SIG_BLOCK_MAGIC_HI) { + return -1; + } + int32_t signerSizeInFooter = valueAt(fd, cdOffset - kApkSigBlockFooterSize); + off64_t signerBlockOffset = cdOffset - signerSizeInFooter - sizeof(int64_t); + if (signerBlockOffset < 0) { + return -1; + } + int32_t signerSizeInHeader = valueAt(fd, signerBlockOffset); + if (signerSizeInFooter != signerSizeInHeader) { + return -1; + } + + return signerBlockOffset; +} + +static std::vector ZipPriorityBlocks(off64_t signerBlockOffset, int64_t fileSize) { + int32_t signerBlockIndex = offsetToBlockIndex(signerBlockOffset); + int32_t lastBlockIndex = offsetToBlockIndex(fileSize); + const auto numPriorityBlocks = lastBlockIndex - signerBlockIndex + 1; + + std::vector zipPriorityBlocks; + + // Some magic here: most of zip libraries perform a scan for EOCD record starting at the offset + // of a maximum comment size from the end of the file. This means the last 65-ish KBs will be + // accessed first, followed by the rest of the central directory blocks. Make sure we + // send the data in the proper order, as central directory can be quite big by itself. + static constexpr auto kMaxZipCommentSize = 64 * 1024; + static constexpr auto kNumBlocksInEocdSearch = kMaxZipCommentSize / kBlockSize + 1; + if (numPriorityBlocks > kNumBlocksInEocdSearch) { + appendBlocks(lastBlockIndex - kNumBlocksInEocdSearch + 1, kNumBlocksInEocdSearch, + &zipPriorityBlocks); + appendBlocks(signerBlockIndex, numPriorityBlocks - kNumBlocksInEocdSearch, + &zipPriorityBlocks); + } else { + appendBlocks(signerBlockIndex, numPriorityBlocks, &zipPriorityBlocks); + } + + // Somehow someone keeps accessing the start of the archive, even if there's nothing really + // interesting there... + appendBlocks(0, 1, &zipPriorityBlocks); + return zipPriorityBlocks; +} + +// TODO(b/151676293): avoid using OpenArchiveFd that reads local file headers +// which causes additional performance cost. Instead, only read from central directory. +static std::vector InstallationPriorityBlocks(int fd, int64_t fileSize) { + std::vector installationPriorityBlocks; + ZipArchiveHandle zip; + if (OpenArchiveFd(fd, "", &zip, false) != 0) { + return {}; + } + void* cookie = nullptr; + if (StartIteration(zip, &cookie) != 0) { + return {}; + } + ZipEntry entry; + std::string_view entryName; + while (Next(cookie, &entry, &entryName) == 0) { + if (entryName == "resources.arsc" || entryName == "AndroidManifest.xml" || + entryName.starts_with("lib/")) { + // Full entries are needed for installation + off64_t entryStartOffset = entry.offset; + off64_t entryEndOffset = + entryStartOffset + + (entry.method == kCompressStored ? entry.uncompressed_length + : entry.compressed_length) + + (entry.has_data_descriptor ? 16 /* sizeof(DataDescriptor) */ : 0); + int32_t startBlockIndex = offsetToBlockIndex(entryStartOffset); + int32_t endBlockIndex = offsetToBlockIndex(entryEndOffset); + int32_t numNewBlocks = endBlockIndex - startBlockIndex + 1; + appendBlocks(startBlockIndex, numNewBlocks, &installationPriorityBlocks); + } else if (entryName == "classes.dex") { + // Only the head is needed for installation + int32_t startBlockIndex = offsetToBlockIndex(entry.offset); + appendBlocks(startBlockIndex, 1, &installationPriorityBlocks); + } + } + + EndIteration(cookie); + CloseArchive(zip); + return installationPriorityBlocks; +} + +namespace incremental { +std::vector PriorityBlocksForFile(const std::string& filepath, int fd, int64_t fileSize) { + if (!android::base::EndsWithIgnoreCase(filepath, ".apk")) { + return {}; + } + off64_t signerOffset = SignerBlockOffset(fd, fileSize); + if (signerOffset < 0) { + // No signer block? not a valid APK + return {}; + } + std::vector priorityBlocks = ZipPriorityBlocks(signerOffset, fileSize); + std::vector installationPriorityBlocks = InstallationPriorityBlocks(fd, fileSize); + + priorityBlocks.insert(priorityBlocks.end(), installationPriorityBlocks.begin(), + installationPriorityBlocks.end()); + unduplicate(priorityBlocks); + return priorityBlocks; +} +} // namespace incremental \ No newline at end of file diff --git a/adb/client/incremental_utils.h b/adb/client/incremental_utils.h new file mode 100644 index 000000000..8bcf6c081 --- /dev/null +++ b/adb/client/incremental_utils.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2020 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 + +#include +#include + +namespace incremental { +std::vector PriorityBlocksForFile(const std::string& filepath, int fd, int64_t fileSize); +} // namespace incremental \ No newline at end of file From 6a2c18a88f8db4b3b00852fbf4cc9da532ed27c6 Mon Sep 17 00:00:00 2001 From: Greg Kaiser Date: Wed, 18 Mar 2020 06:18:10 -0700 Subject: [PATCH 166/388] [adb data server] Initialize variable servingComplete_ was left uninitialized and only set to 'true' in the code. We initialize it to the 'false' state to avoid uninitialized references in SkipToRequest(). Bug: 150865433 Test: TreeHugger Change-Id: Ia8a4d7135c432eb657543c5498fc9dbe8f4718b6 --- adb/client/incremental_server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adb/client/incremental_server.cpp b/adb/client/incremental_server.cpp index 1f47de872..737563cc4 100644 --- a/adb/client/incremental_server.cpp +++ b/adb/client/incremental_server.cpp @@ -228,7 +228,7 @@ class IncrementalServer { std::vector pendingBlocks_; // True when client notifies that all the data has been received - bool servingComplete_; + bool servingComplete_ = false; }; bool IncrementalServer::SkipToRequest(void* buffer, size_t* size, bool blocking) { From 2bf886afc29df3c0a774762d30f50a0e646cf872 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Mon, 16 Mar 2020 10:17:05 -0700 Subject: [PATCH 167/388] init: use a no-op signal handler instead of SIG_IGN for SIGPIPE We want to ignore SIGPIPE within init, but if we use SIG_IGN, that would be inherited by child processes through exec(), which we do not want to have happen. We instead set up a real signal handler with a no-op handler function, that will ignore SIGPIPE within init, but will not be inherited across exec(). This fixes c29c2baa6907 ("init: Add support for native service registration with lmkd"), when SIG_IGN was introduced. Note that we caught this issue before shipping a release with that change, so the major motivation here is to not cause a behavior change in init. Bug: 151581751 Test: children of init that don't explicitly block SIGPIPE exit when sent SIGPIPE Test: children of init that do explicitly block SIGPIPE do not exit when sent SIGPIPE Test: init does not exit when sent SIGPIPE Test: init exits when sent SIGABRT Merged-In: Ieda8555fd03836bcd672a422fe673a8369ad9beb Change-Id: Ieda8555fd03836bcd672a422fe673a8369ad9beb (cherry picked from commit fd470e87cc5920cde00c83e653a52c83cecbb04d) --- init/init.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/init/init.cpp b/init/init.cpp index b29dfa3f6..4289dcf72 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -713,8 +713,15 @@ int SecondStageMain(int argc, char** argv) { InitKernelLogging(argv); LOG(INFO) << "init second stage started!"; - // Will handle EPIPE at the time of write by checking the errno - signal(SIGPIPE, SIG_IGN); + // Init should not crash because of a dependence on any other process, therefore we ignore + // SIGPIPE and handle EPIPE at the call site directly. Note that setting a signal to SIG_IGN + // is inherited across exec, but custom signal handlers are not. Since we do not want to + // ignore SIGPIPE for child processes, we set a no-op function for the signal handler instead. + { + struct sigaction action = {.sa_flags = SA_RESTART}; + action.sa_handler = [](int) {}; + sigaction(SIGPIPE, &action, nullptr); + } // Set init and its forked children's oom_adj. if (auto result = From ad969fb282ea72ebe690bf97c299fa08e1cb2482 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Mon, 16 Mar 2020 18:14:13 -0700 Subject: [PATCH 168/388] Move crash_dump into the runtime APEX. A future change will introduce a version lock between linker and crash_dump. Move crash_dump into the runtime APEX alongside linker in order to ensure that they will be the same version even if the runtime APEX is updated. Bug: 135772972 Change-Id: Ic2eae31b6927eb0e8a62315ac141f50933c00bcc Merged-In: Ic2eae31b6927eb0e8a62315ac141f50933c00bcc --- debuggerd/Android.bp | 4 ++++ debuggerd/handler/debuggerd_handler.cpp | 2 +- debuggerd/libdebuggerd/tombstone.cpp | 17 ----------------- liblog/liblog.map.txt | 4 ++-- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/debuggerd/Android.bp b/debuggerd/Android.bp index f28c778fe..3246dcccd 100644 --- a/debuggerd/Android.bp +++ b/debuggerd/Android.bp @@ -321,6 +321,10 @@ cc_binary { "libprocinfo", "libunwindstack", ], + + apex_available: [ + "com.android.runtime", + ], } cc_binary { diff --git a/debuggerd/handler/debuggerd_handler.cpp b/debuggerd/handler/debuggerd_handler.cpp index 8b4b6304f..9e3a649fa 100644 --- a/debuggerd/handler/debuggerd_handler.cpp +++ b/debuggerd/handler/debuggerd_handler.cpp @@ -83,7 +83,7 @@ using unique_fd = android::base::unique_fd_impl; #define CRASH_DUMP_NAME "crash_dump32" #endif -#define CRASH_DUMP_PATH "/system/bin/" CRASH_DUMP_NAME +#define CRASH_DUMP_PATH "/apex/com.android.runtime/bin/" CRASH_DUMP_NAME // Wrappers that directly invoke the respective syscalls, in case the cached values are invalid. #pragma GCC poison getpid gettid diff --git a/debuggerd/libdebuggerd/tombstone.cpp b/debuggerd/libdebuggerd/tombstone.cpp index b3f059c1c..693113ed3 100644 --- a/debuggerd/libdebuggerd/tombstone.cpp +++ b/debuggerd/libdebuggerd/tombstone.cpp @@ -447,8 +447,6 @@ static bool dump_thread(log_t* log, unwindstack::Unwinder* unwinder, const Threa // that don't match the specified pid, and writes them to the tombstone file. // // If "tail" is non-zero, log the last "tail" number of lines. -static EventTagMap* g_eventTagMap = NULL; - static void dump_log_file(log_t* log, pid_t pid, const char* filename, unsigned int tail) { bool first = true; logger_list* logger_list; @@ -507,21 +505,6 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, unsigned ptm = localtime_r(&sec, &tmBuf); strftime(timeBuf, sizeof(timeBuf), "%m-%d %H:%M:%S", ptm); - if (log_entry.id() == LOG_ID_EVENTS) { - if (!g_eventTagMap) { - g_eventTagMap = android_openEventTagMap(nullptr); - } - AndroidLogEntry e; - char buf[512]; - if (android_log_processBinaryLogBuffer(&log_entry.entry, &e, g_eventTagMap, buf, - sizeof(buf)) == 0) { - _LOG(log, logtype::LOGS, "%s.%03d %5d %5d %c %-8.*s: %s\n", timeBuf, - log_entry.entry.nsec / 1000000, log_entry.entry.pid, log_entry.entry.tid, 'I', - (int)e.tagLen, e.tag, e.message); - } - continue; - } - char* msg = log_entry.msg(); if (msg == nullptr) { continue; diff --git a/liblog/liblog.map.txt b/liblog/liblog.map.txt index 6ca1a164d..161fcf1a9 100644 --- a/liblog/liblog.map.txt +++ b/liblog/liblog.map.txt @@ -1,6 +1,6 @@ LIBLOG { global: - android_name_to_log_id; # llndk + android_name_to_log_id; # apex llndk android_log_id_to_name; # llndk __android_log_assert; __android_log_buf_print; @@ -22,7 +22,7 @@ LIBLOG_L { android_logger_list_alloc; # apex llndk android_logger_list_alloc_time; # apex llndk android_logger_list_free; # apex llndk - android_logger_list_open; # llndk + android_logger_list_open; # apex llndk android_logger_list_read; # apex llndk android_logger_open; # apex llndk android_logger_set_log_size; # llndk From c7335769b17078dcae4097a04d3adb39ce4906ec Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Mon, 9 Mar 2020 09:33:46 -0700 Subject: [PATCH 169/388] Allow loading zip at an offset in fd To allow the ResourcesLoader API to load part of a file as an APK that contains resources, an additional override of OpenArchiveFd that contains read offset and length as parameters must be created. This functionality allows for an APK stored in a zip file to be read without having to write the APK to disk. Bug: 142716192 Test: atest FrameworksResourceLoaderTests Change-Id: I772fc8b462d71de0529717c420ced552103a6e3f Merged-In: I772fc8b462d71de0529717c420ced552103a6e3f --- .../include/ziparchive/zip_archive.h | 9 ++ libziparchive/zip_archive.cc | 82 ++++++++++++++++--- libziparchive/zip_archive_private.h | 15 +++- libziparchive/zip_archive_test.cc | 68 +++++++++++++++ 4 files changed, 158 insertions(+), 16 deletions(-) diff --git a/libziparchive/include/ziparchive/zip_archive.h b/libziparchive/include/ziparchive/zip_archive.h index 047af90f2..098a9cb5d 100644 --- a/libziparchive/include/ziparchive/zip_archive.h +++ b/libziparchive/include/ziparchive/zip_archive.h @@ -126,6 +126,9 @@ int32_t OpenArchive(const char* fileName, ZipArchiveHandle* handle); int32_t OpenArchiveFd(const int fd, const char* debugFileName, ZipArchiveHandle* handle, bool assume_ownership = true); +int32_t OpenArchiveFdRange(const int fd, const char* debugFileName, ZipArchiveHandle* handle, + off64_t length, off64_t offset, bool assume_ownership = true); + int32_t OpenArchiveFromMemory(const void* address, size_t length, const char* debugFileName, ZipArchiveHandle* handle); /* @@ -222,6 +225,12 @@ int32_t ExtractToMemory(ZipArchiveHandle archive, ZipEntry* entry, uint8_t* begi int GetFileDescriptor(const ZipArchiveHandle archive); +/** + * Returns the offset of the zip archive in the backing file descriptor, or 0 if the zip archive is + * not backed by a file descriptor. + */ +off64_t GetFileDescriptorOffset(const ZipArchiveHandle archive); + const char* ErrorCodeString(int32_t error_code); #if !defined(_WIN32) diff --git a/libziparchive/zip_archive.cc b/libziparchive/zip_archive.cc index 68837ccf6..958c34b61 100644 --- a/libziparchive/zip_archive.cc +++ b/libziparchive/zip_archive.cc @@ -162,8 +162,8 @@ uint64_t GetOwnerTag(const ZipArchive* archive) { } #endif -ZipArchive::ZipArchive(const int fd, bool assume_ownership) - : mapped_zip(fd), +ZipArchive::ZipArchive(MappedZipFile&& map, bool assume_ownership) + : mapped_zip(map), close_file(assume_ownership), directory_offset(0), central_directory(), @@ -173,7 +173,8 @@ ZipArchive::ZipArchive(const int fd, bool assume_ownership) hash_table(nullptr) { #if defined(__BIONIC__) if (assume_ownership) { - android_fdsan_exchange_owner_tag(fd, 0, GetOwnerTag(this)); + CHECK(mapped_zip.HasFd()); + android_fdsan_exchange_owner_tag(mapped_zip.GetFileDescriptor(), 0, GetOwnerTag(this)); } #endif } @@ -442,14 +443,32 @@ static int32_t OpenArchiveInternal(ZipArchive* archive, const char* debug_file_n int32_t OpenArchiveFd(int fd, const char* debug_file_name, ZipArchiveHandle* handle, bool assume_ownership) { - ZipArchive* archive = new ZipArchive(fd, assume_ownership); + ZipArchive* archive = new ZipArchive(MappedZipFile(fd), assume_ownership); *handle = archive; return OpenArchiveInternal(archive, debug_file_name); } +int32_t OpenArchiveFdRange(int fd, const char* debug_file_name, ZipArchiveHandle* handle, + off64_t length, off64_t offset, bool assume_ownership) { + ZipArchive* archive = new ZipArchive(MappedZipFile(fd, length, offset), assume_ownership); + *handle = archive; + + if (length < 0) { + ALOGW("Invalid zip length %" PRId64, length); + return kIoError; + } + + if (offset < 0) { + ALOGW("Invalid zip offset %" PRId64, offset); + return kIoError; + } + + return OpenArchiveInternal(archive, debug_file_name); +} + int32_t OpenArchive(const char* fileName, ZipArchiveHandle* handle) { const int fd = ::android::base::utf8::open(fileName, O_RDONLY | O_BINARY | O_CLOEXEC, 0); - ZipArchive* archive = new ZipArchive(fd, true); + ZipArchive* archive = new ZipArchive(MappedZipFile(fd), true); *handle = archive; if (fd < 0) { @@ -1126,6 +1145,10 @@ int GetFileDescriptor(const ZipArchiveHandle archive) { return archive->mapped_zip.GetFileDescriptor(); } +off64_t GetFileDescriptorOffset(const ZipArchiveHandle archive) { + return archive->mapped_zip.GetFileOffset(); +} + #if !defined(_WIN32) class ProcessWriter : public zip_archive::Writer { public: @@ -1165,31 +1188,65 @@ const void* MappedZipFile::GetBasePtr() const { return base_ptr_; } +off64_t MappedZipFile::GetFileOffset() const { + return fd_offset_; +} + off64_t MappedZipFile::GetFileLength() const { if (has_fd_) { - off64_t result = lseek64(fd_, 0, SEEK_END); - if (result == -1) { + if (data_length_ != -1) { + return data_length_; + } + data_length_ = lseek64(fd_, 0, SEEK_END); + if (data_length_ == -1) { ALOGE("Zip: lseek on fd %d failed: %s", fd_, strerror(errno)); } - return result; + return data_length_; } else { if (base_ptr_ == nullptr) { ALOGE("Zip: invalid file map"); return -1; } - return static_cast(data_length_); + return data_length_; } } // Attempts to read |len| bytes into |buf| at offset |off|. bool MappedZipFile::ReadAtOffset(uint8_t* buf, size_t len, off64_t off) const { if (has_fd_) { - if (!android::base::ReadFullyAtOffset(fd_, buf, len, off)) { + if (off < 0) { + ALOGE("Zip: invalid offset %" PRId64, off); + return false; + } + + off64_t read_offset; + if (__builtin_add_overflow(fd_offset_, off, &read_offset)) { + ALOGE("Zip: invalid read offset %" PRId64 " overflows, fd offset %" PRId64, off, fd_offset_); + return false; + } + + if (data_length_ != -1) { + off64_t read_end; + if (len > std::numeric_limits::max() || + __builtin_add_overflow(off, static_cast(len), &read_end)) { + ALOGE("Zip: invalid read length %" PRId64 " overflows, offset %" PRId64, + static_cast(len), off); + return false; + } + + if (read_end > data_length_) { + ALOGE("Zip: invalid read length %" PRId64 " exceeds data length %" PRId64 ", offset %" + PRId64, static_cast(len), data_length_, off); + return false; + } + } + + if (!android::base::ReadFullyAtOffset(fd_, buf, len, read_offset)) { ALOGE("Zip: failed to read at offset %" PRId64, off); return false; } } else { - if (off < 0 || off > static_cast(data_length_)) { + if (off < 0 || off > data_length_) { ALOGE("Zip: invalid offset: %" PRId64 ", data length: %" PRId64, off, data_length_); return false; } @@ -1207,7 +1264,8 @@ void CentralDirectory::Initialize(const void* map_base_ptr, off64_t cd_start_off bool ZipArchive::InitializeCentralDirectory(off64_t cd_start_offset, size_t cd_size) { if (mapped_zip.HasFd()) { directory_map = android::base::MappedFile::FromFd(mapped_zip.GetFileDescriptor(), - cd_start_offset, cd_size, PROT_READ); + mapped_zip.GetFileOffset() + cd_start_offset, + cd_size, PROT_READ); if (!directory_map) { ALOGE("Zip: failed to map central directory (offset %" PRId64 ", size %zu): %s", cd_start_offset, cd_size, strerror(errno)); diff --git a/libziparchive/zip_archive_private.h b/libziparchive/zip_archive_private.h index 1d05fc718..362503816 100644 --- a/libziparchive/zip_archive_private.h +++ b/libziparchive/zip_archive_private.h @@ -97,10 +97,14 @@ enum ErrorCodes : int32_t { class MappedZipFile { public: explicit MappedZipFile(const int fd) - : has_fd_(true), fd_(fd), base_ptr_(nullptr), data_length_(0) {} + : has_fd_(true), fd_(fd), fd_offset_(0), base_ptr_(nullptr), data_length_(-1) {} + + explicit MappedZipFile(const int fd, off64_t length, off64_t offset) + : has_fd_(true), fd_(fd), fd_offset_(offset), base_ptr_(nullptr), data_length_(length) {} explicit MappedZipFile(const void* address, size_t length) - : has_fd_(false), fd_(-1), base_ptr_(address), data_length_(static_cast(length)) {} + : has_fd_(false), fd_(-1), fd_offset_(0), base_ptr_(address), + data_length_(static_cast(length)) {} bool HasFd() const { return has_fd_; } @@ -108,6 +112,8 @@ class MappedZipFile { const void* GetBasePtr() const; + off64_t GetFileOffset() const; + off64_t GetFileLength() const; bool ReadAtOffset(uint8_t* buf, size_t len, off64_t off) const; @@ -120,9 +126,10 @@ class MappedZipFile { const bool has_fd_; const int fd_; + const off64_t fd_offset_; const void* const base_ptr_; - const off64_t data_length_; + mutable off64_t data_length_; }; class CentralDirectory { @@ -180,7 +187,7 @@ struct ZipArchive { uint32_t hash_table_size; ZipStringOffset* hash_table; - ZipArchive(const int fd, bool assume_ownership); + ZipArchive(MappedZipFile&& map, bool assume_ownership); ZipArchive(const void* address, size_t length); ~ZipArchive(); diff --git a/libziparchive/zip_archive_test.cc b/libziparchive/zip_archive_test.cc index 091630407..35fb3fe0f 100644 --- a/libziparchive/zip_archive_test.cc +++ b/libziparchive/zip_archive_test.cc @@ -108,6 +108,32 @@ TEST(ziparchive, OpenDoNotAssumeFdOwnership) { close(fd); } +TEST(ziparchive, OpenAssumeFdRangeOwnership) { + int fd = open((test_data_dir + "/" + kValidZip).c_str(), O_RDONLY | O_BINARY); + ASSERT_NE(-1, fd); + const off64_t length = lseek64(fd, 0, SEEK_END); + ASSERT_NE(-1, length); + ZipArchiveHandle handle; + ASSERT_EQ(0, OpenArchiveFdRange(fd, "OpenWithAssumeFdOwnership", &handle, + static_cast(length), 0)); + CloseArchive(handle); + ASSERT_EQ(-1, lseek(fd, 0, SEEK_SET)); + ASSERT_EQ(EBADF, errno); +} + +TEST(ziparchive, OpenDoNotAssumeFdRangeOwnership) { + int fd = open((test_data_dir + "/" + kValidZip).c_str(), O_RDONLY | O_BINARY); + ASSERT_NE(-1, fd); + const off64_t length = lseek(fd, 0, SEEK_END); + ASSERT_NE(-1, length); + ZipArchiveHandle handle; + ASSERT_EQ(0, OpenArchiveFdRange(fd, "OpenWithAssumeFdOwnership", &handle, + static_cast(length), 0, false)); + CloseArchive(handle); + ASSERT_EQ(0, lseek(fd, 0, SEEK_SET)); + close(fd); +} + TEST(ziparchive, Iteration_std_string_view) { ZipArchiveHandle handle; ASSERT_EQ(0, OpenArchiveWrapper(kValidZip, &handle)); @@ -254,6 +280,48 @@ TEST(ziparchive, TestInvalidDeclaredLength) { CloseArchive(handle); } +TEST(ziparchive, OpenArchiveFdRange) { + TemporaryFile tmp_file; + ASSERT_NE(-1, tmp_file.fd); + + const std::string leading_garbage(21, 'x'); + ASSERT_TRUE(android::base::WriteFully(tmp_file.fd, leading_garbage.c_str(), + leading_garbage.size())); + + std::string valid_content; + ASSERT_TRUE(android::base::ReadFileToString(test_data_dir + "/" + kValidZip, &valid_content)); + ASSERT_TRUE(android::base::WriteFully(tmp_file.fd, valid_content.c_str(), valid_content.size())); + + const std::string ending_garbage(42, 'x'); + ASSERT_TRUE(android::base::WriteFully(tmp_file.fd, ending_garbage.c_str(), + ending_garbage.size())); + + ZipArchiveHandle handle; + ASSERT_EQ(0, lseek(tmp_file.fd, 0, SEEK_SET)); + ASSERT_EQ(0, OpenArchiveFdRange(tmp_file.fd, "OpenArchiveFdRange", &handle, + valid_content.size(), + static_cast(leading_garbage.size()))); + + // An entry that's deflated. + ZipEntry data; + ASSERT_EQ(0, FindEntry(handle, "a.txt", &data)); + const uint32_t a_size = data.uncompressed_length; + ASSERT_EQ(a_size, kATxtContents.size()); + auto buffer = std::unique_ptr(new uint8_t[a_size]); + ASSERT_EQ(0, ExtractToMemory(handle, &data, buffer.get(), a_size)); + ASSERT_EQ(0, memcmp(buffer.get(), kATxtContents.data(), a_size)); + + // An entry that's stored. + ASSERT_EQ(0, FindEntry(handle, "b.txt", &data)); + const uint32_t b_size = data.uncompressed_length; + ASSERT_EQ(b_size, kBTxtContents.size()); + buffer = std::unique_ptr(new uint8_t[b_size]); + ASSERT_EQ(0, ExtractToMemory(handle, &data, buffer.get(), b_size)); + ASSERT_EQ(0, memcmp(buffer.get(), kBTxtContents.data(), b_size)); + + CloseArchive(handle); +} + TEST(ziparchive, ExtractToMemory) { ZipArchiveHandle handle; ASSERT_EQ(0, OpenArchiveWrapper(kValidZip, &handle)); From 7e47915755ad997a5a2a049935207f2b548a2a84 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Tue, 17 Mar 2020 09:31:01 -0700 Subject: [PATCH 170/388] storaged: ignore SIGPIPE It is possible for storaged to terminate due to SIGPIPE if its clients have terminated. This is not a fatal condition from storaged's perspective, so we ignore SIGPIPE instead. Bug: 151581751 Test: build Merged-In: I633780ed20908be02e5e1dea9504e140932afc8c Change-Id: I633780ed20908be02e5e1dea9504e140932afc8c (cherry picked from commit 3f3b1708d9539c2d057555deb132f82fb0d29176) --- storaged/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/storaged/main.cpp b/storaged/main.cpp index a7bda1492..bbed210de 100644 --- a/storaged/main.cpp +++ b/storaged/main.cpp @@ -71,6 +71,7 @@ int main(int argc, char** argv) { bool flag_dump_perf = false; int opt; + signal(SIGPIPE, SIG_IGN); android::base::InitLogging(argv, android::base::LogdLogger(android::base::SYSTEM)); for (;;) { From c3ac339daf33e4a1bd5d2d94056a58c7dfa3656e Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Wed, 18 Mar 2020 15:49:45 -0700 Subject: [PATCH 171/388] [adb] Fix incremental installation on Windows Use only the syscalls that work with the wrapped ADB fds, or extract the native handles for the case when need to call one not wrapped. Bug: 151239696 Test: adb install --incremental on Windows Change-Id: Ia6de620171ab696b8136dcb60a2b63af6f86419f --- adb/client/commandline.cpp | 8 ++-- adb/client/incremental.cpp | 10 +++-- adb/client/incremental_utils.cpp | 76 +++++++++++++++++++++++++++++--- adb/sysdeps.h | 7 +++ 4 files changed, 88 insertions(+), 13 deletions(-) diff --git a/adb/client/commandline.cpp b/adb/client/commandline.cpp index 14ccfbe78..2199fd3a9 100644 --- a/adb/client/commandline.cpp +++ b/adb/client/commandline.cpp @@ -1423,13 +1423,13 @@ static bool _is_valid_ack_reply_fd(const int ack_reply_fd) { #endif } -static bool _is_valid_fd(int fd) { +static bool _is_valid_os_fd(int fd) { // Disallow invalid FDs and stdin/out/err as well. if (fd < 3) { return false; } #ifdef _WIN32 - HANDLE handle = adb_get_os_handle(fd); + auto handle = (HANDLE)fd; DWORD info = 0; if (GetHandleInformation(handle, &info) == 0) { return false; @@ -2005,7 +2005,7 @@ int adb_commandline(int argc, const char** argv) { #endif } int connection_fd = atoi(argv[1]); - if (!_is_valid_fd(connection_fd)) { + if (!_is_valid_os_fd(connection_fd)) { error_exit("Invalid connection_fd number given: %d", connection_fd); } @@ -2013,7 +2013,7 @@ int adb_commandline(int argc, const char** argv) { close_on_exec(connection_fd); int output_fd = atoi(argv[2]); - if (!_is_valid_fd(output_fd)) { + if (!_is_valid_os_fd(output_fd)) { error_exit("Invalid output_fd number given: %d", output_fd); } output_fd = adb_register_socket(output_fd); diff --git a/adb/client/incremental.cpp b/adb/client/incremental.cpp index fd608cced..a9e65dc2c 100644 --- a/adb/client/incremental.cpp +++ b/adb/client/incremental.cpp @@ -41,8 +41,7 @@ using Size = int64_t; static inline int32_t read_int32(borrowed_fd fd) { int32_t result; - ReadFully(fd, &result, sizeof(result)); - return result; + return ReadFdExactly(fd, &result, sizeof(result)) ? result : -1; } static inline void append_int(borrowed_fd fd, std::vector* bytes) { @@ -54,11 +53,14 @@ static inline void append_int(borrowed_fd fd, std::vector* bytes) { static inline void append_bytes_with_size(borrowed_fd fd, std::vector* bytes) { int32_t le_size = read_int32(fd); + if (le_size < 0) { + return; + } int32_t size = int32_t(le32toh(le_size)); auto old_size = bytes->size(); bytes->resize(old_size + sizeof(le_size) + size); memcpy(bytes->data() + old_size, &le_size, sizeof(le_size)); - ReadFully(fd, bytes->data() + old_size + sizeof(le_size), size); + ReadFdExactly(fd, bytes->data() + old_size + sizeof(le_size), size); } static inline std::pair, int32_t> read_id_sig_headers(borrowed_fd fd) { @@ -200,7 +202,7 @@ std::optional install(std::vector files) { return {}; } auto [pipe_read_fd, pipe_write_fd] = print_fds; - auto pipe_write_fd_param = std::to_string(pipe_write_fd); + auto pipe_write_fd_param = std::to_string(intptr_t(adb_get_os_handle(pipe_write_fd))); close_on_exec(pipe_read_fd); std::vector args(std::move(files)); diff --git a/adb/client/incremental_utils.cpp b/adb/client/incremental_utils.cpp index 316480c57..caadb26f6 100644 --- a/adb/client/incremental_utils.cpp +++ b/adb/client/incremental_utils.cpp @@ -18,6 +18,7 @@ #include "incremental_utils.h" +#include #include #include #include @@ -26,6 +27,7 @@ #include #include +#include "adb_trace.h" #include "sysdeps.h" static constexpr int kBlockSize = 4096; @@ -155,18 +157,81 @@ static std::vector ZipPriorityBlocks(off64_t signerBlockOffset, int64_t return zipPriorityBlocks; } -// TODO(b/151676293): avoid using OpenArchiveFd that reads local file headers +[[maybe_unused]] static ZipArchiveHandle openZipArchiveFd(int fd) { + bool transferFdOwnership = false; +#ifdef _WIN32 + // + // Need to create a special CRT FD here as the current one is not compatible with + // normal read()/write() calls that libziparchive uses. + // To make this work we have to create a copy of the file handle, as CRT doesn't care + // and closes it together with the new descriptor. + // + // Note: don't move this into a helper function, it's better to be hard to reuse because + // the code is ugly and won't work unless it's a last resort. + // + auto handle = adb_get_os_handle(fd); + HANDLE dupedHandle; + if (!::DuplicateHandle(::GetCurrentProcess(), handle, ::GetCurrentProcess(), &dupedHandle, 0, + false, DUPLICATE_SAME_ACCESS)) { + D("%s failed at DuplicateHandle: %d", __func__, (int)::GetLastError()); + return {}; + } + fd = _open_osfhandle((intptr_t)dupedHandle, _O_RDONLY | _O_BINARY); + if (fd < 0) { + D("%s failed at _open_osfhandle: %d", __func__, errno); + ::CloseHandle(handle); + return {}; + } + transferFdOwnership = true; +#endif + ZipArchiveHandle zip; + if (OpenArchiveFd(fd, "apk_fd", &zip, transferFdOwnership) != 0) { + D("%s failed at OpenArchiveFd: %d", __func__, errno); +#ifdef _WIN32 + // "_close()" is a secret WinCRT name for the regular close() function. + _close(fd); +#endif + return {}; + } + return zip; +} + +static std::pair> openZipArchive( + int fd, int64_t fileSize) { +#ifndef __LP64__ + if (fileSize >= INT_MAX) { + return {openZipArchiveFd(fd), nullptr}; + } +#endif + auto mapping = + android::base::MappedFile::FromOsHandle(adb_get_os_handle(fd), 0, fileSize, PROT_READ); + if (!mapping) { + D("%s failed at FromOsHandle: %d", __func__, errno); + return {}; + } + ZipArchiveHandle zip; + if (OpenArchiveFromMemory(mapping->data(), mapping->size(), "apk_mapping", &zip) != 0) { + D("%s failed at OpenArchiveFromMemory: %d", __func__, errno); + return {}; + } + return {zip, std::move(mapping)}; +} + +// TODO(b/151676293): avoid using libziparchive as it reads local file headers // which causes additional performance cost. Instead, only read from central directory. static std::vector InstallationPriorityBlocks(int fd, int64_t fileSize) { - std::vector installationPriorityBlocks; - ZipArchiveHandle zip; - if (OpenArchiveFd(fd, "", &zip, false) != 0) { + auto [zip, _] = openZipArchive(fd, fileSize); + if (!zip) { return {}; } + void* cookie = nullptr; if (StartIteration(zip, &cookie) != 0) { + D("%s failed at StartIteration: %d", __func__, errno); return {}; } + + std::vector installationPriorityBlocks; ZipEntry entry; std::string_view entryName; while (Next(cookie, &entry, &entryName) == 0) { @@ -183,6 +248,7 @@ static std::vector InstallationPriorityBlocks(int fd, int64_t fileSize) int32_t endBlockIndex = offsetToBlockIndex(entryEndOffset); int32_t numNewBlocks = endBlockIndex - startBlockIndex + 1; appendBlocks(startBlockIndex, numNewBlocks, &installationPriorityBlocks); + D("\tadding to priority blocks: '%.*s'", (int)entryName.size(), entryName.data()); } else if (entryName == "classes.dex") { // Only the head is needed for installation int32_t startBlockIndex = offsetToBlockIndex(entry.offset); @@ -213,4 +279,4 @@ std::vector PriorityBlocksForFile(const std::string& filepath, int fd, unduplicate(priorityBlocks); return priorityBlocks; } -} // namespace incremental \ No newline at end of file +} // namespace incremental diff --git a/adb/sysdeps.h b/adb/sysdeps.h index 4efbc02c3..3e781b8ac 100644 --- a/adb/sysdeps.h +++ b/adb/sysdeps.h @@ -276,6 +276,7 @@ inline void seekdir(DIR*, long) { class Process { public: constexpr explicit Process(HANDLE h = nullptr) : h_(h) {} + constexpr Process(Process&& other) : h_(std::exchange(other.h_, nullptr)) {} ~Process() { close(); } constexpr explicit operator bool() const { return h_ != nullptr; } @@ -292,6 +293,8 @@ class Process { } private: + DISALLOW_COPY_AND_ASSIGN(Process); + void close() { if (*this) { ::CloseHandle(h_); @@ -666,6 +669,8 @@ static __inline__ int adb_get_os_handle(borrowed_fd fd) { class Process { public: constexpr explicit Process(pid_t pid) : pid_(pid) {} + constexpr Process(Process&& other) : pid_(std::exchange(other.pid_, -1)) {} + constexpr explicit operator bool() const { return pid_ >= 0; } void wait() { @@ -682,6 +687,8 @@ class Process { } private: + DISALLOW_COPY_AND_ASSIGN(Process); + pid_t pid_; }; From 76820308c5ff347da5d4cc68809460b73d4294b5 Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Wed, 18 Mar 2020 22:29:10 -0700 Subject: [PATCH 172/388] [adb] Optimize fdevent machinery - Use one fewer heap allocation per fdevent object - Lazy-init the fdevent context Bug: 151239696 Test: various adb commands on Win/Linux Change-Id: Ic7de207b30495e618f187e097c0276ad42c34005 --- adb/fdevent/fdevent.cpp | 32 +++++++++++++++++--------------- adb/fdevent/fdevent.h | 30 +++++++++++++++--------------- adb/fdevent/fdevent_epoll.cpp | 16 ++++++++-------- adb/fdevent/fdevent_epoll.h | 7 +------ adb/fdevent/fdevent_poll.cpp | 17 ++++++++++------- 5 files changed, 51 insertions(+), 51 deletions(-) diff --git a/adb/fdevent/fdevent.cpp b/adb/fdevent/fdevent.cpp index 562f5872d..fd550200f 100644 --- a/adb/fdevent/fdevent.cpp +++ b/adb/fdevent/fdevent.cpp @@ -63,7 +63,10 @@ fdevent* fdevent_context::Create(unique_fd fd, std::variant f int fd_num = fd.get(); - fdevent* fde = new fdevent(); + auto [it, inserted] = this->installed_fdevents_.emplace(fd_num, fdevent{}); + CHECK(inserted); + + fdevent* fde = &it->second; fde->id = fdevent_id_++; fde->state = 0; fde->fd = std::move(fd); @@ -76,10 +79,6 @@ fdevent* fdevent_context::Create(unique_fd fd, std::variant f LOG(ERROR) << "failed to set non-blocking mode for fd " << fde->fd.get(); } - auto [it, inserted] = this->installed_fdevents_.emplace(fd_num, fde); - CHECK(inserted); - UNUSED(it); - this->Register(fde); return fde; } @@ -92,12 +91,12 @@ unique_fd fdevent_context::Destroy(fdevent* fde) { this->Unregister(fde); - auto erased = this->installed_fdevents_.erase(fde->fd.get()); + unique_fd fd = std::move(fde->fd); + + auto erased = this->installed_fdevents_.erase(fd.get()); CHECK_EQ(1UL, erased); - unique_fd result = std::move(fde->fd); - delete fde; - return result; + return fd; } void fdevent_context::Add(fdevent* fde, unsigned events) { @@ -123,9 +122,9 @@ std::optional fdevent_context::CalculatePollDuration( for (const auto& [fd, fde] : this->installed_fdevents_) { UNUSED(fd); - auto timeout_opt = fde->timeout; + auto timeout_opt = fde.timeout; if (timeout_opt) { - auto deadline = fde->last_active + *timeout_opt; + auto deadline = fde.last_active + *timeout_opt; auto time_left = duration_cast(deadline - now); if (time_left < 0ms) { time_left = 0ms; @@ -194,11 +193,13 @@ static std::unique_ptr fdevent_create_context() { #endif } -static auto& g_ambient_fdevent_context = - *new std::unique_ptr(fdevent_create_context()); +static auto& g_ambient_fdevent_context() { + static auto context = fdevent_create_context().release(); + return context; +} static fdevent_context* fdevent_get_ambient() { - return g_ambient_fdevent_context.get(); + return g_ambient_fdevent_context(); } fdevent* fdevent_create(int fd, fd_func func, void* arg) { @@ -256,5 +257,6 @@ size_t fdevent_installed_count() { } void fdevent_reset() { - g_ambient_fdevent_context = fdevent_create_context(); + auto old = std::exchange(g_ambient_fdevent_context(), fdevent_create_context().release()); + delete old; } diff --git a/adb/fdevent/fdevent.h b/adb/fdevent/fdevent.h index 86814d7c5..9fc3b2c0c 100644 --- a/adb/fdevent/fdevent.h +++ b/adb/fdevent/fdevent.h @@ -52,6 +52,20 @@ struct fdevent_event { unsigned events; }; +struct fdevent final { + uint64_t id; + + unique_fd fd; + int force_eof = 0; + + uint16_t state = 0; + std::optional timeout; + std::chrono::steady_clock::time_point last_active; + + std::variant func; + void* arg = nullptr; +}; + struct fdevent_context { public: virtual ~fdevent_context() = default; @@ -113,7 +127,7 @@ struct fdevent_context { std::atomic terminate_loop_ = false; protected: - std::unordered_map installed_fdevents_; + std::unordered_map installed_fdevents_; private: uint64_t fdevent_id_ = 0; @@ -121,20 +135,6 @@ struct fdevent_context { std::deque> run_queue_ GUARDED_BY(run_queue_mutex_); }; -struct fdevent { - uint64_t id; - - unique_fd fd; - int force_eof = 0; - - uint16_t state = 0; - std::optional timeout; - std::chrono::steady_clock::time_point last_active; - - std::variant func; - void* arg = nullptr; -}; - // Backwards compatibility shims that forward to the global fdevent_context. fdevent* fdevent_create(int fd, fd_func func, void* arg); fdevent* fdevent_create(int fd, fd_func2 func, void* arg); diff --git a/adb/fdevent/fdevent_epoll.cpp b/adb/fdevent/fdevent_epoll.cpp index e3d167424..4ef41d1ee 100644 --- a/adb/fdevent/fdevent_epoll.cpp +++ b/adb/fdevent/fdevent_epoll.cpp @@ -155,15 +155,15 @@ void fdevent_context_epoll::Loop() { event_map[fde] = events; } - for (const auto& [fd, fde] : installed_fdevents_) { + for (auto& [fd, fde] : installed_fdevents_) { unsigned events = 0; - if (auto it = event_map.find(fde); it != event_map.end()) { + if (auto it = event_map.find(&fde); it != event_map.end()) { events = it->second; } if (events == 0) { - if (fde->timeout) { - auto deadline = fde->last_active + *fde->timeout; + if (fde.timeout) { + auto deadline = fde.last_active + *fde.timeout; if (deadline < post_poll) { events |= FDE_TIMEOUT; } @@ -171,13 +171,13 @@ void fdevent_context_epoll::Loop() { } if (events != 0) { - LOG(DEBUG) << dump_fde(fde) << " got events " << std::hex << std::showbase + LOG(DEBUG) << dump_fde(&fde) << " got events " << std::hex << std::showbase << events; - fde_events.push_back({fde, events}); - fde->last_active = post_poll; + fde_events.push_back({&fde, events}); + fde.last_active = post_poll; } } - this->HandleEvents(std::move(fde_events)); + this->HandleEvents(fde_events); fde_events.clear(); } diff --git a/adb/fdevent/fdevent_epoll.h b/adb/fdevent/fdevent_epoll.h index 684fa32bc..6214d2e27 100644 --- a/adb/fdevent/fdevent_epoll.h +++ b/adb/fdevent/fdevent_epoll.h @@ -47,12 +47,7 @@ struct fdevent_context_epoll final : public fdevent_context { protected: virtual void Interrupt() final; - public: - // All operations to fdevent should happen only in the main thread. - // That's why we don't need a lock for fdevent. - std::unordered_map epoll_node_map_; - std::list pending_list_; - + private: unique_fd epoll_fd_; unique_fd interrupt_fd_; fdevent* interrupt_fde_ = nullptr; diff --git a/adb/fdevent/fdevent_poll.cpp b/adb/fdevent/fdevent_poll.cpp index cc4a7a151..ac86c08e1 100644 --- a/adb/fdevent/fdevent_poll.cpp +++ b/adb/fdevent/fdevent_poll.cpp @@ -103,24 +103,27 @@ static std::string dump_pollfds(const std::vector& pollfds) { void fdevent_context_poll::Loop() { main_thread_id_ = android::base::GetThreadId(); + std::vector pollfds; + std::vector poll_events; + while (true) { if (terminate_loop_) { break; } D("--- --- waiting for events"); - std::vector pollfds; + pollfds.clear(); for (const auto& [fd, fde] : this->installed_fdevents_) { adb_pollfd pfd; pfd.fd = fd; pfd.events = 0; - if (fde->state & FDE_READ) { + if (fde.state & FDE_READ) { pfd.events |= POLLIN; } - if (fde->state & FDE_WRITE) { + if (fde.state & FDE_WRITE) { pfd.events |= POLLOUT; } - if (fde->state & FDE_ERROR) { + if (fde.state & FDE_ERROR) { pfd.events |= POLLERR; } #if defined(__linux__) @@ -147,7 +150,6 @@ void fdevent_context_poll::Loop() { } auto post_poll = std::chrono::steady_clock::now(); - std::vector poll_events; for (const auto& pollfd : pollfds) { unsigned events = 0; @@ -170,7 +172,7 @@ void fdevent_context_poll::Loop() { auto it = this->installed_fdevents_.find(pollfd.fd); CHECK(it != this->installed_fdevents_.end()); - fdevent* fde = it->second; + fdevent* fde = &it->second; if (events == 0) { if (fde->timeout) { @@ -187,7 +189,8 @@ void fdevent_context_poll::Loop() { fde->last_active = post_poll; } } - this->HandleEvents(std::move(poll_events)); + this->HandleEvents(poll_events); + poll_events.clear(); } main_thread_id_.reset(); From 67caf0ceef589f8017d916ad7a545786327f647d Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Thu, 19 Mar 2020 00:21:08 -0700 Subject: [PATCH 173/388] [adb] Print fewer progress messages for push/pull Windows console IO is terribly slow. Reducing the number of printed progress messages speeds up the transfer rate from 80 to 130 MB/s on Windows laptop Bug: 151900478 Test: adb push/pull Change-Id: I223284c8a662bd8f2b8ba280cdcc8c930d3e5205 --- adb/client/file_sync_client.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/adb/client/file_sync_client.cpp b/adb/client/file_sync_client.cpp index cc38926a4..94bd8f543 100644 --- a/adb/client/file_sync_client.cpp +++ b/adb/client/file_sync_client.cpp @@ -112,6 +112,7 @@ struct TransferLedger { uint64_t bytes_transferred; uint64_t bytes_expected; bool expect_multiple_files; + std::string last_progress_str; TransferLedger() { Reset(); @@ -127,6 +128,7 @@ struct TransferLedger { } void Reset() { + last_progress_str.clear(); start_time = std::chrono::steady_clock::now(); files_transferred = 0; files_skipped = 0; @@ -181,7 +183,10 @@ struct TransferLedger { android::base::StringPrintf("[%4s] %s", overall_percentage_str, file.c_str()); } } - lp.Print(output, LinePrinter::LineType::INFO); + if (output != last_progress_str) { + lp.Print(output, LinePrinter::LineType::INFO); + last_progress_str = std::move(output); + } } void ReportTransferRate(LinePrinter& lp, const std::string& name, TransferDirection direction) { From c262d79974657b8cb0044f3c6ca66fedd0b29962 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Thu, 5 Mar 2020 08:53:11 -0800 Subject: [PATCH 174/388] Add new directory for stats metadata Also reordered the directories in alphabetical order Test: m -j Bug: 149838525 Merged-In: I1a918d189d8bcb394ec6f818d033dbf7e4518713 Change-Id: I4b10a01ed6b3285aec6d87765f225c41ec55be96 --- rootdir/init.rc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rootdir/init.rc b/rootdir/init.rc index 324fa19e0..53d9f8f6d 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -736,9 +736,10 @@ on post-fs-data mkdir /data/incremental 0771 system system encryption=Require # Create directories for statsd - mkdir /data/misc/stats-data/ 0770 statsd system - mkdir /data/misc/stats-service/ 0770 statsd system mkdir /data/misc/stats-active-metric/ 0770 statsd system + mkdir /data/misc/stats-data/ 0770 statsd system + mkdir /data/misc/stats-metadata/ 0770 statsd system + mkdir /data/misc/stats-service/ 0770 statsd system mkdir /data/misc/train-info/ 0770 statsd system # Wait for apexd to finish activating APEXes before starting more processes. From b36934bf5ff6d08600cdd3af760a2c07d7ccd2c8 Mon Sep 17 00:00:00 2001 From: Steve Muckle Date: Wed, 18 Mar 2020 14:55:06 -0700 Subject: [PATCH 175/388] fastboot: add support for v3 boot header format Support v3 header format when changing the command line with fastboot boot or using flash:raw. Bug: 151750405 Test: fastboot boot and flash:raw with updated cmdline and v3 header Merged-In: Ibf396e2d18d8b22cad50db290f3fd4e46ff85d9b Change-Id: Ibf396e2d18d8b22cad50db290f3fd4e46ff85d9b --- fastboot/bootimg_utils.cpp | 42 +++++++++++++++++++++++++++++++++++++- fastboot/fastboot.cpp | 4 ++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/fastboot/bootimg_utils.cpp b/fastboot/bootimg_utils.cpp index 46d4bd30e..2c0989ed1 100644 --- a/fastboot/bootimg_utils.cpp +++ b/fastboot/bootimg_utils.cpp @@ -34,14 +34,54 @@ #include #include -void bootimg_set_cmdline(boot_img_hdr_v2* h, const std::string& cmdline) { +static void bootimg_set_cmdline_v3(boot_img_hdr_v3* h, const std::string& cmdline) { if (cmdline.size() >= sizeof(h->cmdline)) die("command line too large: %zu", cmdline.size()); strcpy(reinterpret_cast(h->cmdline), cmdline.c_str()); } +void bootimg_set_cmdline(boot_img_hdr_v2* h, const std::string& cmdline) { + if (h->header_version == 3) { + return bootimg_set_cmdline_v3(reinterpret_cast(h), cmdline); + } + if (cmdline.size() >= sizeof(h->cmdline)) die("command line too large: %zu", cmdline.size()); + strcpy(reinterpret_cast(h->cmdline), cmdline.c_str()); +} + +static boot_img_hdr_v3* mkbootimg_v3(const std::vector& kernel, + const std::vector& ramdisk, const boot_img_hdr_v2& src, + std::vector* out) { +#define V3_PAGE_SIZE 4096 + const size_t page_mask = V3_PAGE_SIZE - 1; + int64_t kernel_actual = (kernel.size() + page_mask) & (~page_mask); + int64_t ramdisk_actual = (ramdisk.size() + page_mask) & (~page_mask); + + int64_t bootimg_size = V3_PAGE_SIZE + kernel_actual + ramdisk_actual; + out->resize(bootimg_size); + + boot_img_hdr_v3* hdr = reinterpret_cast(out->data()); + + memcpy(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE); + hdr->kernel_size = kernel.size(); + hdr->ramdisk_size = ramdisk.size(); + hdr->os_version = src.os_version; + hdr->header_size = sizeof(boot_img_hdr_v3); + hdr->header_version = 3; + + memcpy(hdr->magic + V3_PAGE_SIZE, kernel.data(), kernel.size()); + memcpy(hdr->magic + V3_PAGE_SIZE + kernel_actual, ramdisk.data(), ramdisk.size()); + + return hdr; +} + boot_img_hdr_v2* mkbootimg(const std::vector& kernel, const std::vector& ramdisk, const std::vector& second, const std::vector& dtb, size_t base, const boot_img_hdr_v2& src, std::vector* out) { + if (src.header_version == 3) { + if (!second.empty() || !dtb.empty()) { + die("Second stage bootloader and dtb not supported in v3 boot image\n"); + } + return reinterpret_cast(mkbootimg_v3(kernel, ramdisk, src, out)); + } const size_t page_mask = src.page_size - 1; int64_t header_actual = (sizeof(boot_img_hdr_v1) + page_mask) & (~page_mask); diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index 7fdc28b3d..7f6e7230f 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -464,7 +464,7 @@ static std::vector LoadBootableImage(const std::string& kernel, const std: } // Is this actually a boot image? - if (kernel_data.size() < sizeof(boot_img_hdr_v2)) { + if (kernel_data.size() < sizeof(boot_img_hdr_v3)) { die("cannot load '%s': too short", kernel.c_str()); } if (!memcmp(kernel_data.data(), BOOT_MAGIC, BOOT_MAGIC_SIZE)) { @@ -493,7 +493,7 @@ static std::vector LoadBootableImage(const std::string& kernel, const std: std::vector dtb_data; if (!g_dtb_path.empty()) { - if (g_boot_img_hdr.header_version < 2) { + if (g_boot_img_hdr.header_version != 2) { die("Argument dtb not supported for boot image header version %d\n", g_boot_img_hdr.header_version); } From c06f147566680c308e8ccd7a734e871d558e99c1 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Fri, 13 Mar 2020 19:14:05 -0700 Subject: [PATCH 176/388] Native API feedback for puller API 1. Rename registerPullAtomCallback to setPullAtomCallback 2. Rename unregisterPullAtomCallback to clearPullAtomCallback 3. Change Ns to Millis for consistency with java 4. Swap metadata and callback params in setPullAtomCallback to match java 5. Added getters for PullAtomMetadata 6. Added libstatspull_test to test PullAtomMetadata 7. Changed the types on setAdditiveFields from int to int32_t Test: make Test: atest LibStatsPullTests Test: bit libstatspull_test:* Bug: 1507885621 Bug: 151875223 Change-Id: I5cb07bfe71b1002180403828d5e8e6a5b88ce6fe --- libstats/pull/Android.bp | 22 +++++ libstats/pull/TEST_MAPPING | 7 ++ .../pull/include/stats_pull_atom_callback.h | 53 ++++++++--- libstats/pull/libstatspull.map.txt | 12 ++- libstats/pull/stats_pull_atom_callback.cpp | 85 ++++++++++------- .../pull/tests/pull_atom_metadata_test.cpp | 92 +++++++++++++++++++ 6 files changed, 221 insertions(+), 50 deletions(-) create mode 100644 libstats/pull/TEST_MAPPING create mode 100644 libstats/pull/tests/pull_atom_metadata_test.cpp diff --git a/libstats/pull/Android.bp b/libstats/pull/Android.bp index 1a9cb92ca..0fb8f1b37 100644 --- a/libstats/pull/Android.bp +++ b/libstats/pull/Android.bp @@ -65,3 +65,25 @@ cc_library_static { "//frameworks/base/apex/statsd/tests/libstatspull", ], } + +// Note: These unit tests only test PullAtomMetadata. +// For full E2E tests of libstatspull, use LibStatsPullTests +cc_test { + name: "libstatspull_test", + srcs: [ + "tests/pull_atom_metadata_test.cpp", + ], + shared_libs: [ + "libstatspull", + "libstatssocket", + ], + test_suites: ["general-tests"], + cflags: [ + "-Wall", + "-Werror", + "-Wno-missing-field-initializers", + "-Wno-unused-variable", + "-Wno-unused-function", + "-Wno-unused-parameter", + ], +} \ No newline at end of file diff --git a/libstats/pull/TEST_MAPPING b/libstats/pull/TEST_MAPPING new file mode 100644 index 000000000..76f4f0271 --- /dev/null +++ b/libstats/pull/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit" : [ + { + "name" : "libstatspull_test" + } + ] +} \ No newline at end of file diff --git a/libstats/pull/include/stats_pull_atom_callback.h b/libstats/pull/include/stats_pull_atom_callback.h index 0b0df2b82..0bfeec605 100644 --- a/libstats/pull/include/stats_pull_atom_callback.h +++ b/libstats/pull/include/stats_pull_atom_callback.h @@ -45,17 +45,27 @@ AStatsManager_PullAtomMetadata* AStatsManager_PullAtomMetadata_obtain(); void AStatsManager_PullAtomMetadata_release(AStatsManager_PullAtomMetadata* metadata); /** - * Set the cool down time of the pull in nanoseconds. If two successive pulls are issued + * Set the cool down time of the pull in milliseconds. If two successive pulls are issued * within the cool down, a cached version of the first will be used for the second. */ -void AStatsManager_PullAtomMetadata_setCoolDownNs(AStatsManager_PullAtomMetadata* metadata, - int64_t cool_down_ns); +void AStatsManager_PullAtomMetadata_setCoolDownMillis(AStatsManager_PullAtomMetadata* metadata, + int64_t cool_down_millis); /** - * Set the maximum time the pull can take in nanoseconds. + * Get the cool down time of the pull in milliseconds. */ -void AStatsManager_PullAtomMetadata_setTimeoutNs(AStatsManager_PullAtomMetadata* metadata, - int64_t timeout_ns); +int64_t AStatsManager_PullAtomMetadata_getCoolDownMillis(AStatsManager_PullAtomMetadata* metadata); + +/** + * Set the maximum time the pull can take in milliseconds. + */ +void AStatsManager_PullAtomMetadata_setTimeoutMillis(AStatsManager_PullAtomMetadata* metadata, + int64_t timeout_millis); + +/** + * Get the maximum time the pull can take in milliseconds. + */ +int64_t AStatsManager_PullAtomMetadata_getTimeoutMillis(AStatsManager_PullAtomMetadata* metadata); /** * Set the additive fields of this pulled atom. @@ -65,7 +75,25 @@ void AStatsManager_PullAtomMetadata_setTimeoutNs(AStatsManager_PullAtomMetadata* * will be combined when the non-additive fields are the same. */ void AStatsManager_PullAtomMetadata_setAdditiveFields(AStatsManager_PullAtomMetadata* metadata, - int* additive_fields, int num_fields); + int32_t* additive_fields, int32_t num_fields); + +/** + * Get the number the additive fields of this pulled atom. This is intended to be called before + * AStatsManager_PullAtomMetadata_getAdditiveFields to determine the size of the array. + */ +int32_t AStatsManager_PullAtomMetadata_getNumAdditiveFields( + AStatsManager_PullAtomMetadata* metadata); + +/** + * Get the additive fields of this pulled atom. + * + * \param fields an output parameter containing the additive fields for this PullAtomMetadata. + * Fields is an array and it is assumed that it is at least as large as the number of + * additive fields, which can be obtained by calling + * AStatsManager_PullAtomMetadata_getNumAdditiveFields. + */ +void AStatsManager_PullAtomMetadata_getAdditiveFields(AStatsManager_PullAtomMetadata* metadata, + int32_t* fields); /** * Return codes for the result of a pull. @@ -108,7 +136,7 @@ AStatsEvent* AStatsEventList_addStatsEvent(AStatsEventList* pull_data); typedef AStatsManager_PullAtomCallbackReturn (*AStatsManager_PullAtomCallback)( int32_t atom_tag, AStatsEventList* data, void* cookie); /** - * Registers a callback for an atom when that atom is to be pulled. The stats service will + * Sets a callback for an atom when that atom is to be pulled. The stats service will * invoke the callback when the stats service determines that this atom needs to be * pulled. * @@ -122,19 +150,18 @@ typedef AStatsManager_PullAtomCallbackReturn (*AStatsManager_PullAtomCallback)( * \param cookie A pointer that will be passed back to the callback. * It has no meaning to statsd. */ -void AStatsManager_registerPullAtomCallback(int32_t atom_tag, - AStatsManager_PullAtomCallback callback, - AStatsManager_PullAtomMetadata* metadata, void* cookie); +void AStatsManager_setPullAtomCallback(int32_t atom_tag, AStatsManager_PullAtomMetadata* metadata, + AStatsManager_PullAtomCallback callback, void* cookie); /** - * Unregisters a callback for an atom when that atom is to be pulled. Note that any ongoing + * Clears a callback for an atom when that atom is to be pulled. Note that any ongoing * pulls will still occur. * * Requires the REGISTER_STATS_PULL_ATOM permission. * * \param atomTag The tag of the atom of which to unregister */ -void AStatsManager_unregisterPullAtomCallback(int32_t atom_tag); +void AStatsManager_clearPullAtomCallback(int32_t atom_tag); #ifdef __cplusplus } diff --git a/libstats/pull/libstatspull.map.txt b/libstats/pull/libstatspull.map.txt index dc3fd8b04..e0e851a15 100644 --- a/libstats/pull/libstatspull.map.txt +++ b/libstats/pull/libstatspull.map.txt @@ -2,12 +2,16 @@ LIBSTATSPULL { global: AStatsManager_PullAtomMetadata_obtain; # apex # introduced=30 AStatsManager_PullAtomMetadata_release; # apex # introduced=30 - AStatsManager_PullAtomMetadata_setCoolDownNs; # apex # introduced=30 - AStatsManager_PullAtomMetadata_setTimeoutNs; # apex # introduced=30 + AStatsManager_PullAtomMetadata_setCoolDownMillis; # apex # introduced=30 + AStatsManager_PullAtomMetadata_getCoolDownMillis; # apex # introduced=30 + AStatsManager_PullAtomMetadata_setTimeoutMillis; # apex # introduced=30 + AStatsManager_PullAtomMetadata_getTimeoutMillis; # apex # introduced=30 AStatsManager_PullAtomMetadata_setAdditiveFields; # apex # introduced=30 + AStatsManager_PullAtomMetadata_getNumAdditiveFields; # apex # introduced=30 + AStatsManager_PullAtomMetadata_getAdditiveFields; # apex # introduced=30 AStatsEventList_addStatsEvent; # apex # introduced=30 - AStatsManager_registerPullAtomCallback; # apex # introduced=30 - AStatsManager_unregisterPullAtomCallback; # apex # introduced=30 + AStatsManager_setPullAtomCallback; # apex # introduced=30 + AStatsManager_clearPullAtomCallback; # apex # introduced=30 local: *; }; diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp index 27e9d29e2..bb2351d51 100644 --- a/libstats/pull/stats_pull_atom_callback.cpp +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -46,19 +46,19 @@ AStatsEvent* AStatsEventList_addStatsEvent(AStatsEventList* pull_data) { return event; } -static const int64_t DEFAULT_COOL_DOWN_NS = 1000000000LL; // 1 second. -static const int64_t DEFAULT_TIMEOUT_NS = 10000000000LL; // 10 seconds. +static const int64_t DEFAULT_COOL_DOWN_MILLIS = 1000LL; // 1 second. +static const int64_t DEFAULT_TIMEOUT_MILLIS = 10000LL; // 10 seconds. struct AStatsManager_PullAtomMetadata { - int64_t cool_down_ns; - int64_t timeout_ns; + int64_t cool_down_millis; + int64_t timeout_millis; std::vector additive_fields; }; AStatsManager_PullAtomMetadata* AStatsManager_PullAtomMetadata_obtain() { AStatsManager_PullAtomMetadata* metadata = new AStatsManager_PullAtomMetadata(); - metadata->cool_down_ns = DEFAULT_COOL_DOWN_NS; - metadata->timeout_ns = DEFAULT_TIMEOUT_NS; + metadata->cool_down_millis = DEFAULT_COOL_DOWN_MILLIS; + metadata->timeout_millis = DEFAULT_TIMEOUT_MILLIS; metadata->additive_fields = std::vector(); return metadata; } @@ -67,30 +67,50 @@ void AStatsManager_PullAtomMetadata_release(AStatsManager_PullAtomMetadata* meta delete metadata; } -void AStatsManager_PullAtomMetadata_setCoolDownNs(AStatsManager_PullAtomMetadata* metadata, - int64_t cool_down_ns) { - metadata->cool_down_ns = cool_down_ns; +void AStatsManager_PullAtomMetadata_setCoolDownMillis(AStatsManager_PullAtomMetadata* metadata, + int64_t cool_down_millis) { + metadata->cool_down_millis = cool_down_millis; } -void AStatsManager_PullAtomMetadata_setTimeoutNs(AStatsManager_PullAtomMetadata* metadata, - int64_t timeout_ns) { - metadata->timeout_ns = timeout_ns; +int64_t AStatsManager_PullAtomMetadata_getCoolDownMillis(AStatsManager_PullAtomMetadata* metadata) { + return metadata->cool_down_millis; +} + +void AStatsManager_PullAtomMetadata_setTimeoutMillis(AStatsManager_PullAtomMetadata* metadata, + int64_t timeout_millis) { + metadata->timeout_millis = timeout_millis; +} + +int64_t AStatsManager_PullAtomMetadata_getTimeoutMillis(AStatsManager_PullAtomMetadata* metadata) { + return metadata->timeout_millis; } void AStatsManager_PullAtomMetadata_setAdditiveFields(AStatsManager_PullAtomMetadata* metadata, - int* additive_fields, int num_fields) { + int32_t* additive_fields, + int32_t num_fields) { metadata->additive_fields.assign(additive_fields, additive_fields + num_fields); } +int32_t AStatsManager_PullAtomMetadata_getNumAdditiveFields( + AStatsManager_PullAtomMetadata* metadata) { + return metadata->additive_fields.size(); +} + +void AStatsManager_PullAtomMetadata_getAdditiveFields(AStatsManager_PullAtomMetadata* metadata, + int32_t* fields) { + std::copy(metadata->additive_fields.begin(), metadata->additive_fields.end(), fields); + return; +} + class StatsPullAtomCallbackInternal : public BnPullAtomCallback { public: StatsPullAtomCallbackInternal(const AStatsManager_PullAtomCallback callback, void* cookie, - const int64_t coolDownNs, const int64_t timeoutNs, + const int64_t coolDownMillis, const int64_t timeoutMillis, const std::vector additiveFields) : mCallback(callback), mCookie(cookie), - mCoolDownNs(coolDownNs), - mTimeoutNs(timeoutNs), + mCoolDownMillis(coolDownMillis), + mTimeoutMillis(timeoutMillis), mAdditiveFields(additiveFields) {} Status onPullAtom(int32_t atomTag, @@ -119,15 +139,15 @@ class StatsPullAtomCallbackInternal : public BnPullAtomCallback { return Status::ok(); } - const int64_t& getCoolDownNs() const { return mCoolDownNs; } - const int64_t& getTimeoutNs() const { return mTimeoutNs; } + int64_t getCoolDownMillis() const { return mCoolDownMillis; } + int64_t getTimeoutMillis() const { return mTimeoutMillis; } const std::vector& getAdditiveFields() const { return mAdditiveFields; } private: const AStatsManager_PullAtomCallback mCallback; void* mCookie; - const int64_t mCoolDownNs; - const int64_t mTimeoutNs; + const int64_t mCoolDownMillis; + const int64_t mTimeoutMillis; const std::vector mAdditiveFields; }; @@ -156,8 +176,8 @@ static void binderDied(void* /*cookie*/) { pullersCopy = mPullers; } for (const auto& it : pullersCopy) { - statsService->registerNativePullAtomCallback(it.first, it.second->getCoolDownNs(), - it.second->getTimeoutNs(), + statsService->registerNativePullAtomCallback(it.first, it.second->getCoolDownMillis(), + it.second->getTimeoutMillis(), it.second->getAdditiveFields(), it.second); } } @@ -186,8 +206,8 @@ void registerStatsPullAtomCallbackBlocking(int32_t atomTag, return; } - statsService->registerNativePullAtomCallback(atomTag, cb->getCoolDownNs(), cb->getTimeoutNs(), - cb->getAdditiveFields(), cb); + statsService->registerNativePullAtomCallback( + atomTag, cb->getCoolDownMillis(), cb->getTimeoutMillis(), cb->getAdditiveFields(), cb); } void unregisterStatsPullAtomCallbackBlocking(int32_t atomTag) { @@ -200,12 +220,11 @@ void unregisterStatsPullAtomCallbackBlocking(int32_t atomTag) { statsService->unregisterNativePullAtomCallback(atomTag); } -void AStatsManager_registerPullAtomCallback(int32_t atom_tag, - AStatsManager_PullAtomCallback callback, - AStatsManager_PullAtomMetadata* metadata, - void* cookie) { - int64_t coolDownNs = metadata == nullptr ? DEFAULT_COOL_DOWN_NS : metadata->cool_down_ns; - int64_t timeoutNs = metadata == nullptr ? DEFAULT_TIMEOUT_NS : metadata->timeout_ns; +void AStatsManager_setPullAtomCallback(int32_t atom_tag, AStatsManager_PullAtomMetadata* metadata, + AStatsManager_PullAtomCallback callback, void* cookie) { + int64_t coolDownMillis = + metadata == nullptr ? DEFAULT_COOL_DOWN_MILLIS : metadata->cool_down_millis; + int64_t timeoutMillis = metadata == nullptr ? DEFAULT_TIMEOUT_MILLIS : metadata->timeout_millis; std::vector additiveFields; if (metadata != nullptr) { @@ -213,8 +232,8 @@ void AStatsManager_registerPullAtomCallback(int32_t atom_tag, } std::shared_ptr callbackBinder = - SharedRefBase::make(callback, cookie, coolDownNs, - timeoutNs, additiveFields); + SharedRefBase::make(callback, cookie, coolDownMillis, + timeoutMillis, additiveFields); { std::lock_guard lg(pullAtomMutex); @@ -226,7 +245,7 @@ void AStatsManager_registerPullAtomCallback(int32_t atom_tag, registerThread.detach(); } -void AStatsManager_unregisterPullAtomCallback(int32_t atom_tag) { +void AStatsManager_clearPullAtomCallback(int32_t atom_tag) { { std::lock_guard lg(pullAtomMutex); // Always remove the puller from our map. diff --git a/libstats/pull/tests/pull_atom_metadata_test.cpp b/libstats/pull/tests/pull_atom_metadata_test.cpp new file mode 100644 index 000000000..cf1930357 --- /dev/null +++ b/libstats/pull/tests/pull_atom_metadata_test.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2020, 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 + +namespace { + +static const int64_t DEFAULT_COOL_DOWN_MILLIS = 1000LL; // 1 second. +static const int64_t DEFAULT_TIMEOUT_MILLIS = 10000LL; // 10 seconds. + +} // anonymous namespace + +TEST(AStatsManager_PullAtomMetadataTest, TestEmpty) { + AStatsManager_PullAtomMetadata* metadata = AStatsManager_PullAtomMetadata_obtain(); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getCoolDownMillis(metadata), DEFAULT_COOL_DOWN_MILLIS); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getTimeoutMillis(metadata), DEFAULT_TIMEOUT_MILLIS); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getNumAdditiveFields(metadata), 0); + AStatsManager_PullAtomMetadata_release(metadata); +} + +TEST(AStatsManager_PullAtomMetadataTest, TestSetTimeoutMillis) { + int64_t timeoutMillis = 500; + AStatsManager_PullAtomMetadata* metadata = AStatsManager_PullAtomMetadata_obtain(); + AStatsManager_PullAtomMetadata_setTimeoutMillis(metadata, timeoutMillis); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getCoolDownMillis(metadata), DEFAULT_COOL_DOWN_MILLIS); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getTimeoutMillis(metadata), timeoutMillis); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getNumAdditiveFields(metadata), 0); + AStatsManager_PullAtomMetadata_release(metadata); +} + +TEST(AStatsManager_PullAtomMetadataTest, TestSetCoolDownMillis) { + int64_t coolDownMillis = 10000; + AStatsManager_PullAtomMetadata* metadata = AStatsManager_PullAtomMetadata_obtain(); + AStatsManager_PullAtomMetadata_setCoolDownMillis(metadata, coolDownMillis); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getCoolDownMillis(metadata), coolDownMillis); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getTimeoutMillis(metadata), DEFAULT_TIMEOUT_MILLIS); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getNumAdditiveFields(metadata), 0); + AStatsManager_PullAtomMetadata_release(metadata); +} + +TEST(AStatsManager_PullAtomMetadataTest, TestSetAdditiveFields) { + const int numFields = 3; + int inputFields[numFields] = {2, 4, 6}; + AStatsManager_PullAtomMetadata* metadata = AStatsManager_PullAtomMetadata_obtain(); + AStatsManager_PullAtomMetadata_setAdditiveFields(metadata, inputFields, numFields); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getCoolDownMillis(metadata), DEFAULT_COOL_DOWN_MILLIS); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getTimeoutMillis(metadata), DEFAULT_TIMEOUT_MILLIS); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getNumAdditiveFields(metadata), numFields); + int outputFields[numFields]; + AStatsManager_PullAtomMetadata_getAdditiveFields(metadata, outputFields); + for (int i = 0; i < numFields; i++) { + EXPECT_EQ(inputFields[i], outputFields[i]); + } + AStatsManager_PullAtomMetadata_release(metadata); +} + +TEST(AStatsManager_PullAtomMetadataTest, TestSetAllElements) { + int64_t timeoutMillis = 500; + int64_t coolDownMillis = 10000; + const int numFields = 3; + int inputFields[numFields] = {2, 4, 6}; + + AStatsManager_PullAtomMetadata* metadata = AStatsManager_PullAtomMetadata_obtain(); + AStatsManager_PullAtomMetadata_setTimeoutMillis(metadata, timeoutMillis); + AStatsManager_PullAtomMetadata_setCoolDownMillis(metadata, coolDownMillis); + AStatsManager_PullAtomMetadata_setAdditiveFields(metadata, inputFields, numFields); + + EXPECT_EQ(AStatsManager_PullAtomMetadata_getCoolDownMillis(metadata), coolDownMillis); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getTimeoutMillis(metadata), timeoutMillis); + EXPECT_EQ(AStatsManager_PullAtomMetadata_getNumAdditiveFields(metadata), numFields); + int outputFields[numFields]; + AStatsManager_PullAtomMetadata_getAdditiveFields(metadata, outputFields); + for (int i = 0; i < numFields; i++) { + EXPECT_EQ(inputFields[i], outputFields[i]); + } + AStatsManager_PullAtomMetadata_release(metadata); +} From e7817e42d1880bf1f990d73e42a7875c7d138a99 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Fri, 20 Mar 2020 10:46:52 -0700 Subject: [PATCH 177/388] Adding block kind to protocol for future streaming of a tree. Bug: b/152050621 Test: adb install --incremental megacity.apk Change-Id: I0c977080475088bf046a521a85f78595aac994f0 --- adb/client/incremental_server.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/adb/client/incremental_server.cpp b/adb/client/incremental_server.cpp index 737563cc4..4a131ce20 100644 --- a/adb/client/incremental_server.cpp +++ b/adb/client/incremental_server.cpp @@ -46,8 +46,9 @@ namespace incremental { static constexpr int kBlockSize = 4096; static constexpr int kCompressedSizeMax = kBlockSize * 0.95; -static constexpr short kCompressionNone = 0; -static constexpr short kCompressionLZ4 = 1; +static constexpr int8_t kTypeData = 0; +static constexpr int8_t kCompressionNone = 0; +static constexpr int8_t kCompressionLZ4 = 1; static constexpr int kCompressBound = std::max(kBlockSize, LZ4_COMPRESSBOUND(kBlockSize)); static constexpr auto kReadBufferSize = 128 * 1024; static constexpr int kPollTimeoutMillis = 300000; // 5 minutes @@ -56,7 +57,8 @@ using BlockSize = int16_t; using FileId = int16_t; using BlockIdx = int32_t; using NumBlocks = int32_t; -using CompressionType = int16_t; +using BlockType = int8_t; +using CompressionType = int8_t; using RequestType = int16_t; using ChunkHeader = int32_t; using MagicType = uint32_t; @@ -126,7 +128,8 @@ struct RequestCommand { // Placed before actual data bytes of each block struct ResponseHeader { FileId file_id; // 2 bytes - CompressionType compression_type; // 2 bytes + BlockType block_type; // 1 byte + CompressionType compression_type; // 1 byte BlockIdx block_idx; // 4 bytes BlockSize block_size; // 2 bytes } __attribute__((packed)); @@ -343,14 +346,16 @@ auto IncrementalServer::SendBlock(FileId fileId, BlockIdx blockIdx, bool flush) ++compressed_; blockSize = compressedSize; header = reinterpret_cast(data); - header->compression_type = toBigEndian(kCompressionLZ4); + header->compression_type = kCompressionLZ4; } else { ++uncompressed_; blockSize = bytesRead; header = reinterpret_cast(raw); - header->compression_type = toBigEndian(kCompressionNone); + header->compression_type = kCompressionNone; } + header->block_type = kTypeData; + header->file_id = toBigEndian(fileId); header->block_size = toBigEndian(blockSize); header->block_idx = toBigEndian(blockIdx); @@ -364,6 +369,7 @@ auto IncrementalServer::SendBlock(FileId fileId, BlockIdx blockIdx, bool flush) bool IncrementalServer::SendDone() { ResponseHeader header; header.file_id = -1; + header.block_type = 0; header.compression_type = 0; header.block_idx = 0; header.block_size = 0; From 47e5ae49c298c618bdc307539fe437fcac0980d2 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Fri, 20 Mar 2020 12:13:40 -0700 Subject: [PATCH 178/388] Minor followups from api feedback Bug: 150788562 Test: m Change-Id: I3473e49bc3f3682300b036ddeb032c3776d8d830 --- libstats/pull/include/stats_pull_atom_callback.h | 2 +- libstats/pull/stats_pull_atom_callback.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libstats/pull/include/stats_pull_atom_callback.h b/libstats/pull/include/stats_pull_atom_callback.h index 0bfeec605..c976c6831 100644 --- a/libstats/pull/include/stats_pull_atom_callback.h +++ b/libstats/pull/include/stats_pull_atom_callback.h @@ -78,7 +78,7 @@ void AStatsManager_PullAtomMetadata_setAdditiveFields(AStatsManager_PullAtomMeta int32_t* additive_fields, int32_t num_fields); /** - * Get the number the additive fields of this pulled atom. This is intended to be called before + * Get the number of additive fields for this pulled atom. This is intended to be called before * AStatsManager_PullAtomMetadata_getAdditiveFields to determine the size of the array. */ int32_t AStatsManager_PullAtomMetadata_getNumAdditiveFields( diff --git a/libstats/pull/stats_pull_atom_callback.cpp b/libstats/pull/stats_pull_atom_callback.cpp index bb2351d51..2d184bd2d 100644 --- a/libstats/pull/stats_pull_atom_callback.cpp +++ b/libstats/pull/stats_pull_atom_callback.cpp @@ -99,7 +99,6 @@ int32_t AStatsManager_PullAtomMetadata_getNumAdditiveFields( void AStatsManager_PullAtomMetadata_getAdditiveFields(AStatsManager_PullAtomMetadata* metadata, int32_t* fields) { std::copy(metadata->additive_fields.begin(), metadata->additive_fields.end(), fields); - return; } class StatsPullAtomCallbackInternal : public BnPullAtomCallback { From c04d4a567c83b812619633d00522b262d2c0d2e3 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 19 Mar 2020 19:26:28 -0700 Subject: [PATCH 179/388] libsnapshot: Add RecoveryCreateSnapshotDevices(device) ... that doesn't auto mount/umount /metadata. Test: builds Bug: 151983957 Change-Id: If525a82c1635ddef221e7be20763bc2f27d3c417 Merged-In: If525a82c1635ddef221e7be20763bc2f27d3c417 --- fs_mgr/libsnapshot/include/libsnapshot/snapshot.h | 6 ++++++ fs_mgr/libsnapshot/snapshot.cpp | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 957c26c10..5c276b4c0 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -230,8 +230,14 @@ class SnapshotManager final { // devices; // - CreateResult::ERROR if a fatal error occurred, mounting /system should // be aborted. + // This function mounts /metadata when called, and unmounts /metadata upon + // return. CreateResult RecoveryCreateSnapshotDevices(); + // Same as RecoveryCreateSnapshotDevices(), but does not auto mount/umount + // /metadata. + CreateResult RecoveryCreateSnapshotDevices(const std::unique_ptr& metadata_device); + // Dump debug information. bool Dump(std::ostream& os); diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 7e84c48bd..2d59f0c1c 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2584,6 +2584,20 @@ CreateResult SnapshotManager::RecoveryCreateSnapshotDevices() { LOG(ERROR) << "Couldn't mount Metadata."; return CreateResult::NOT_CREATED; } + return RecoveryCreateSnapshotDevices(mount); +} + +CreateResult SnapshotManager::RecoveryCreateSnapshotDevices( + const std::unique_ptr& metadata_device) { + if (!device_->IsRecovery()) { + LOG(ERROR) << __func__ << " is only allowed in recovery."; + return CreateResult::NOT_CREATED; + } + + if (metadata_device == nullptr || !metadata_device->HasDevice()) { + LOG(ERROR) << "Metadata not mounted."; + return CreateResult::NOT_CREATED; + } auto state_file = GetStateFilePath(); if (access(state_file.c_str(), F_OK) != 0 && errno == ENOENT) { From 05227d99e0c66d6236190a9c37f060559cb58493 Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Fri, 20 Mar 2020 22:39:23 -0700 Subject: [PATCH 180/388] [adb] file sync performance on Windows Print not more often than once a 100ms - it is smooth enough and speeds up transfer even more on Windows, where a single line output may take up to 5ms. An added benefit is getting rid of some extra heap allocation and string formatting when in the end the identical message filtering would've dropped the line anyway. This is also significantly more expensive on Windows. Bug: 151900478 Test: manual, push/pull a file and a directory Change-Id: I9038729e8a01d5f93fd301beaeb8a086f5039b77 --- adb/client/file_sync_client.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/adb/client/file_sync_client.cpp b/adb/client/file_sync_client.cpp index 94bd8f543..f29ca9288 100644 --- a/adb/client/file_sync_client.cpp +++ b/adb/client/file_sync_client.cpp @@ -53,6 +53,8 @@ #include #include +using namespace std::literals; + typedef void(sync_ls_cb)(unsigned mode, uint64_t size, uint64_t time, const char* name); struct syncsendbuf { @@ -112,8 +114,12 @@ struct TransferLedger { uint64_t bytes_transferred; uint64_t bytes_expected; bool expect_multiple_files; - std::string last_progress_str; + private: + std::string last_progress_str; + std::chrono::steady_clock::time_point last_progress_time; + + public: TransferLedger() { Reset(); } @@ -128,12 +134,13 @@ struct TransferLedger { } void Reset() { - last_progress_str.clear(); start_time = std::chrono::steady_clock::now(); files_transferred = 0; files_skipped = 0; bytes_transferred = 0; bytes_expected = 0; + last_progress_str.clear(); + last_progress_time = {}; } std::string TransferRate() { @@ -153,6 +160,12 @@ struct TransferLedger { void ReportProgress(LinePrinter& lp, const std::string& file, uint64_t file_copied_bytes, uint64_t file_total_bytes) { + static constexpr auto kProgressReportInterval = 100ms; + + auto now = std::chrono::steady_clock::now(); + if (now < last_progress_time + kProgressReportInterval) { + return; + } char overall_percentage_str[5] = "?"; if (bytes_expected != 0 && bytes_transferred <= bytes_expected) { int overall_percentage = static_cast(bytes_transferred * 100 / bytes_expected); @@ -186,6 +199,7 @@ struct TransferLedger { if (output != last_progress_str) { lp.Print(output, LinePrinter::LineType::INFO); last_progress_str = std::move(output); + last_progress_time = now; } } From e3bdbfa46c88cb9052a887036dd484f839bd6c34 Mon Sep 17 00:00:00 2001 From: Hsin-Yi Chen Date: Mon, 23 Mar 2020 11:26:38 +0800 Subject: [PATCH 181/388] Disable ABI check for libstatspull The ABI dump for libstatspull can't be built due to the link error. Test: development/vndk/tools/header-checker/utils/create_reference_dumps.py Bug: 151102177 Bug: 151694054 Change-Id: Id324890235679b9593995b6e12a60ef055b4c825 --- libstats/pull/Android.bp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libstats/pull/Android.bp b/libstats/pull/Android.bp index 0fb8f1b37..a7b5d9154 100644 --- a/libstats/pull/Android.bp +++ b/libstats/pull/Android.bp @@ -53,6 +53,10 @@ cc_library_shared { "com.android.os.statsd", "test_com.android.os.statsd", ], + // TODO(b/151102177): Enable it when the build error is fixed. + header_abi_checker: { + enabled: false, + }, } // ONLY USE IN TESTS. @@ -86,4 +90,4 @@ cc_test { "-Wno-unused-function", "-Wno-unused-parameter", ], -} \ No newline at end of file +} From c297d6034d3c08312a46197b6d444d8276bbf5b0 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Wed, 4 Mar 2020 10:52:08 -0800 Subject: [PATCH 182/388] init: add ctl.oneshot_on/ctl.oneshot_off Some services are lazy HALs on some platforms and not lazy HALs on others; this is known at runtime by hwservicemanager, so this change adds these properties to allow hwservicemanager to turn one oneshot (for lazy HALs). It may also be required to make a lazy HAL not lazy anymore, and oneshot_off is provided for this. Bug: 147841742 Test: new unit test that turn on and off oneshot on a service (bootanim) and observes that it follows the expected behavior Merged-In: I79524e2c9a5008f90c8d3bc40920fde00602a439 Change-Id: I79524e2c9a5008f90c8d3bc40920fde00602a439 (cherry picked from commit bdbf5047c9ab42d689c5a8e5d99b3437e1f98d76) --- init/Android.bp | 1 + init/README.md | 36 +++++++++++------ init/init.cpp | 86 +++++++++++++++++----------------------- init/oneshot_on_test.cpp | 44 ++++++++++++++++++++ init/service.h | 7 ++++ 5 files changed, 113 insertions(+), 61 deletions(-) create mode 100644 init/oneshot_on_test.cpp diff --git a/init/Android.bp b/init/Android.bp index 72a7bfed4..d2bdf9874 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -240,6 +240,7 @@ cc_test { "firmware_handler_test.cpp", "init_test.cpp", "keychords_test.cpp", + "oneshot_on_test.cpp", "persistent_properties_test.cpp", "property_service_test.cpp", "property_type_test.cpp", diff --git a/init/README.md b/init/README.md index 4f0a7eced..13f1bac65 100644 --- a/init/README.md +++ b/init/README.md @@ -720,23 +720,35 @@ Init provides state information with the following properties. characteristics in a device agnostic manner. Init responds to properties that begin with `ctl.`. These properties take the format of -`ctl.` and the _value_ of the system property is used as a parameter, for example: -`SetProperty("ctl.start", "logd")` will run the `start` command on `logd`. Note that these +`ctl.[_]` and the _value_ of the system property is used as a parameter. The +_target_ is optional and specifies the service option that _value_ is meant to match with. There is +only one option for _target_, `interface` which indicates that _value_ will refer to an interface +that a service provides and not the service name itself. + +For example: + +`SetProperty("ctl.start", "logd")` will run the `start` command on `logd`. + +`SetProperty("ctl.interface_start", "aidl/aidl_lazy_test_1")` will run the `start` command on the +service that exposes the `aidl aidl_lazy_test_1` interface. + +Note that these properties are only settable; they will have no value when read. -`ctl.start` \ -`ctl.restart` \ -`ctl.stop` -> These are equivalent to using the `start`, `restart`, and `stop` commands on the service specified +The _commands_ are listed below. + +`start` \ +`restart` \ +`stop` \ +These are equivalent to using the `start`, `restart`, and `stop` commands on the service specified by the _value_ of the property. -`ctl.interface_start` \ -`ctl.interface_restart` \ -`ctl.interface_stop` -> These are equivalent to using the `interface_start`, `interface_restart`, and `interface_stop` -commands on the interface specified by the _value_ of the property. +`oneshot_one` and `oneshot_off` will turn on or off the _oneshot_ +flag for the service specified by the _value_ of the property. This is +particularly intended for services that are conditionally lazy HALs. When +they are lazy HALs, oneshot must be on, otherwise oneshot should be off. -`ctl.sigstop_on` and `ctl.sigstop_off` will turn on or off the _sigstop_ feature for the service +`sigstop_on` and `sigstop_off` will turn on or off the _sigstop_ feature for the service specified by the _value_ of the property. See the _Debugging init_ section below for more details about this feature. diff --git a/init/init.cpp b/init/init.cpp index 4289dcf72..5444a3269 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -81,6 +81,7 @@ using namespace std::chrono_literals; using namespace std::string_literals; using android::base::boot_clock; +using android::base::ConsumePrefix; using android::base::GetProperty; using android::base::ReadFileToString; using android::base::SetProperty; @@ -367,40 +368,27 @@ enum class ControlTarget { INTERFACE, // action gets called for every service that holds this interface }; -struct ControlMessageFunction { - ControlTarget target; - std::function(Service*)> action; -}; +using ControlMessageFunction = std::function(Service*)>; -static const std::map& get_control_message_map() { +static const std::map>& GetControlMessageMap() { // clang-format off - static const std::map control_message_functions = { - {"sigstop_on", {ControlTarget::SERVICE, - [](auto* service) { service->set_sigstop(true); return Result{}; }}}, - {"sigstop_off", {ControlTarget::SERVICE, - [](auto* service) { service->set_sigstop(false); return Result{}; }}}, - {"start", {ControlTarget::SERVICE, DoControlStart}}, - {"stop", {ControlTarget::SERVICE, DoControlStop}}, - {"restart", {ControlTarget::SERVICE, DoControlRestart}}, - {"interface_start", {ControlTarget::INTERFACE, DoControlStart}}, - {"interface_stop", {ControlTarget::INTERFACE, DoControlStop}}, - {"interface_restart", {ControlTarget::INTERFACE, DoControlRestart}}, + static const std::map> control_message_functions = { + {"sigstop_on", [](auto* service) { service->set_sigstop(true); return Result{}; }}, + {"sigstop_off", [](auto* service) { service->set_sigstop(false); return Result{}; }}, + {"oneshot_on", [](auto* service) { service->set_oneshot(true); return Result{}; }}, + {"oneshot_off", [](auto* service) { service->set_oneshot(false); return Result{}; }}, + {"start", DoControlStart}, + {"stop", DoControlStop}, + {"restart", DoControlRestart}, }; // clang-format on return control_message_functions; } -bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t pid) { - const auto& map = get_control_message_map(); - const auto it = map.find(msg); - - if (it == map.end()) { - LOG(ERROR) << "Unknown control msg '" << msg << "'"; - return false; - } - - std::string cmdline_path = StringPrintf("proc/%d/cmdline", pid); +static bool HandleControlMessage(std::string_view message, const std::string& name, + pid_t from_pid) { + std::string cmdline_path = StringPrintf("proc/%d/cmdline", from_pid); std::string process_cmdline; if (ReadFileToString(cmdline_path, &process_cmdline)) { std::replace(process_cmdline.begin(), process_cmdline.end(), '\0', ' '); @@ -409,37 +397,37 @@ bool HandleControlMessage(const std::string& msg, const std::string& name, pid_t process_cmdline = "unknown process"; } - const ControlMessageFunction& function = it->second; - - Service* svc = nullptr; - - switch (function.target) { - case ControlTarget::SERVICE: - svc = ServiceList::GetInstance().FindService(name); - break; - case ControlTarget::INTERFACE: - svc = ServiceList::GetInstance().FindInterface(name); - break; - default: - LOG(ERROR) << "Invalid function target from static map key ctl." << msg << ": " - << static_cast::type>(function.target); - return false; + Service* service = nullptr; + auto action = message; + if (ConsumePrefix(&action, "interface_")) { + service = ServiceList::GetInstance().FindInterface(name); + } else { + service = ServiceList::GetInstance().FindService(name); } - if (svc == nullptr) { - LOG(ERROR) << "Control message: Could not find '" << name << "' for ctl." << msg - << " from pid: " << pid << " (" << process_cmdline << ")"; + if (service == nullptr) { + LOG(ERROR) << "Control message: Could not find '" << name << "' for ctl." << message + << " from pid: " << from_pid << " (" << process_cmdline << ")"; return false; } - if (auto result = function.action(svc); !result.ok()) { - LOG(ERROR) << "Control message: Could not ctl." << msg << " for '" << name - << "' from pid: " << pid << " (" << process_cmdline << "): " << result.error(); + const auto& map = GetControlMessageMap(); + const auto it = map.find(action); + if (it == map.end()) { + LOG(ERROR) << "Unknown control msg '" << message << "'"; + return false; + } + const auto& function = it->second; + + if (auto result = function(service); !result.ok()) { + LOG(ERROR) << "Control message: Could not ctl." << message << " for '" << name + << "' from pid: " << from_pid << " (" << process_cmdline + << "): " << result.error(); return false; } - LOG(INFO) << "Control message: Processed ctl." << msg << " for '" << name - << "' from pid: " << pid << " (" << process_cmdline << ")"; + LOG(INFO) << "Control message: Processed ctl." << message << " for '" << name + << "' from pid: " << from_pid << " (" << process_cmdline << ")"; return true; } diff --git a/init/oneshot_on_test.cpp b/init/oneshot_on_test.cpp new file mode 100644 index 000000000..7e7cc3679 --- /dev/null +++ b/init/oneshot_on_test.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2020 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 + +using android::base::GetProperty; +using android::base::SetProperty; +using android::base::WaitForProperty; +using namespace std::literals; + +TEST(init, oneshot_on) { + // Bootanim shouldn't be running once the device has booted. + ASSERT_EQ("stopped", GetProperty("init.svc.bootanim", "")); + + SetProperty("ctl.oneshot_off", "bootanim"); + SetProperty("ctl.start", "bootanim"); + + // Bootanim exits quickly when the device is fully booted, so check that it goes back to the + // 'restarting' state that non-oneshot services enter once they've restarted. + EXPECT_TRUE(WaitForProperty("init.svc.bootanim", "restarting", 10s)); + + SetProperty("ctl.oneshot_on", "bootanim"); + SetProperty("ctl.start", "bootanim"); + + // Now that oneshot is enabled again, bootanim should transition into the 'stopped' state. + EXPECT_TRUE(WaitForProperty("init.svc.bootanim", "stopped", 10s)); +} diff --git a/init/service.h b/init/service.h index cf3f0c290..9f1d697f0 100644 --- a/init/service.h +++ b/init/service.h @@ -130,6 +130,13 @@ class Service { bool is_updatable() const { return updatable_; } bool is_post_data() const { return post_data_; } bool is_from_apex() const { return from_apex_; } + void set_oneshot(bool value) { + if (value) { + flags_ |= SVC_ONESHOT; + } else { + flags_ &= ~SVC_ONESHOT; + } + } private: void NotifyStateChange(const std::string& new_state) const; From 4ad538376aabae518bfbf5c32356f4d6fb1b2d6e Mon Sep 17 00:00:00 2001 From: Yong Li Date: Thu, 19 Mar 2020 18:43:06 +0000 Subject: [PATCH 183/388] Fix memory leak of DexFile handle after release The DexFile handle is allocated from heap in OpenFromFd/OpenFromMemory. After releasing the unique_ptr, the DexFile handle itself is no longer managed by the smart pointer. However, the DexFile handle is not freed in the constructor of DexFileFromFile/DexFileFromMemory. This change uses get() method to get the DexFile pointer while allowing it to be managed by smart pointer so that it can be freed after method end. Added new unit tests to detect leaks. Bug: 151966190 Test: Unwinding can still retrieve dex frame information during crash. Test: Ran new unit tests before change and verified they fail, ran them Test: after the change and verified they don't fail. Signed-off-by: Yong Li Change-Id: I0627e1e255eb6644aba51e940c1a79ff78d568d7 (cherry picked from commit 489c3a8b356a7a3ae235afec5e1e954f90301622) --- libunwindstack/DexFile.cpp | 4 +-- libunwindstack/DexFile.h | 10 ++++--- libunwindstack/tests/DexFileTest.cpp | 45 ++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/libunwindstack/DexFile.cpp b/libunwindstack/DexFile.cpp index dff7a8b3c..bf63abf1c 100644 --- a/libunwindstack/DexFile.cpp +++ b/libunwindstack/DexFile.cpp @@ -89,7 +89,7 @@ std::unique_ptr DexFileFromFile::Create(uint64_t dex_file_offse return nullptr; } - return std::unique_ptr(new DexFileFromFile(std::move(*art_dex_file.release()))); + return std::unique_ptr(new DexFileFromFile(art_dex_file)); } std::unique_ptr DexFileFromMemory::Create(uint64_t dex_file_offset_in_memory, @@ -108,7 +108,7 @@ std::unique_ptr DexFileFromMemory::Create(uint64_t dex_file_o if (art_dex_file != nullptr) { return std::unique_ptr( - new DexFileFromMemory(std::move(*art_dex_file.release()), std::move(backing_memory))); + new DexFileFromMemory(art_dex_file, std::move(backing_memory))); } if (!error_msg.empty()) { diff --git a/libunwindstack/DexFile.h b/libunwindstack/DexFile.h index ca658e688..4e8369f84 100644 --- a/libunwindstack/DexFile.h +++ b/libunwindstack/DexFile.h @@ -39,7 +39,8 @@ class DexFile : protected art_api::dex::DexFile { MapInfo* info); protected: - DexFile(art_api::dex::DexFile&& art_dex_file) : art_api::dex::DexFile(std::move(art_dex_file)) {} + DexFile(std::unique_ptr& art_dex_file) + : art_api::dex::DexFile(art_dex_file) {} }; class DexFileFromFile : public DexFile { @@ -48,7 +49,7 @@ class DexFileFromFile : public DexFile { const std::string& file); private: - DexFileFromFile(art_api::dex::DexFile&& art_dex_file) : DexFile(std::move(art_dex_file)) {} + DexFileFromFile(std::unique_ptr& art_dex_file) : DexFile(art_dex_file) {} }; class DexFileFromMemory : public DexFile { @@ -57,8 +58,9 @@ class DexFileFromMemory : public DexFile { Memory* memory, const std::string& name); private: - DexFileFromMemory(art_api::dex::DexFile&& art_dex_file, std::vector&& memory) - : DexFile(std::move(art_dex_file)), memory_(std::move(memory)) {} + DexFileFromMemory(std::unique_ptr& art_dex_file, + std::vector&& memory) + : DexFile(art_dex_file), memory_(std::move(memory)) {} std::vector memory_; }; diff --git a/libunwindstack/tests/DexFileTest.cpp b/libunwindstack/tests/DexFileTest.cpp index 1b54da6fb..dc935a36e 100644 --- a/libunwindstack/tests/DexFileTest.cpp +++ b/libunwindstack/tests/DexFileTest.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include #include #include @@ -72,6 +73,37 @@ TEST(DexFileTest, from_file_open_non_zero_offset) { EXPECT_TRUE(DexFileFromFile::Create(0x100, tf.path) != nullptr); } +static constexpr size_t kNumLeakLoops = 5000; +static constexpr size_t kMaxAllowedLeakBytes = 1024; + +static void CheckForLeak(size_t loop, size_t* first_allocated_bytes, size_t* last_allocated_bytes) { + size_t allocated_bytes = mallinfo().uordblks; + if (*first_allocated_bytes == 0) { + *first_allocated_bytes = allocated_bytes; + } else if (*last_allocated_bytes > *first_allocated_bytes) { + // Check that the total memory did not increase too much over the first loop. + ASSERT_LE(*last_allocated_bytes - *first_allocated_bytes, kMaxAllowedLeakBytes) + << "Failed in loop " << loop << " first_allocated_bytes " << *first_allocated_bytes + << " last_allocated_bytes " << *last_allocated_bytes; + } + *last_allocated_bytes = allocated_bytes; +} + +TEST(DexFileTest, from_file_no_leak) { + TemporaryFile tf; + ASSERT_TRUE(tf.fd != -1); + + ASSERT_EQ(sizeof(kDexData), + static_cast(TEMP_FAILURE_RETRY(write(tf.fd, kDexData, sizeof(kDexData))))); + + size_t first_allocated_bytes = 0; + size_t last_allocated_bytes = 0; + for (size_t i = 0; i < kNumLeakLoops; i++) { + EXPECT_TRUE(DexFileFromFile::Create(0, tf.path) != nullptr); + ASSERT_NO_FATAL_FAILURE(CheckForLeak(i, &first_allocated_bytes, &last_allocated_bytes)); + } +} + TEST(DexFileTest, from_memory_fail_too_small_for_header) { MemoryFake memory; @@ -96,6 +128,19 @@ TEST(DexFileTest, from_memory_open) { EXPECT_TRUE(DexFileFromMemory::Create(0x1000, &memory, "") != nullptr); } +TEST(DexFileTest, from_memory_no_leak) { + MemoryFake memory; + + memory.SetMemory(0x1000, kDexData, sizeof(kDexData)); + + size_t first_allocated_bytes = 0; + size_t last_allocated_bytes = 0; + for (size_t i = 0; i < kNumLeakLoops; i++) { + EXPECT_TRUE(DexFileFromMemory::Create(0x1000, &memory, "") != nullptr); + ASSERT_NO_FATAL_FAILURE(CheckForLeak(i, &first_allocated_bytes, &last_allocated_bytes)); + } +} + TEST(DexFileTest, create_using_file) { TemporaryFile tf; ASSERT_TRUE(tf.fd != -1); From 65396f473431c9b8a9c2101d649f4ce16a6a4eff Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Thu, 19 Mar 2020 17:13:52 -0700 Subject: [PATCH 184/388] adb: extract syncmsg structs. Make it so that we can get the sizeof a member of syncmsg without having an instance of syncmsg or doing something awful along the lines of sizeof(reinterpret_cast(nullptr)->status). Bug: http://b/150827486 Test: m adb adbd Change-Id: I4830e7f90033c7706ff52cdd8d13e9cf40c73628 (cherry picked from commit eddae9292860d053988f791ae1a1498e38d5edee) --- adb/file_sync_protocol.h | 112 ++++++++++++++++++++++----------------- 1 file changed, 62 insertions(+), 50 deletions(-) diff --git a/adb/file_sync_protocol.h b/adb/file_sync_protocol.h index 508c13851..87ede0c0c 100644 --- a/adb/file_sync_protocol.h +++ b/adb/file_sync_protocol.h @@ -41,57 +41,69 @@ struct SyncRequest { // Followed by 'path_length' bytes of path (not NUL-terminated). } __attribute__((packed)); +struct __attribute__((packed)) sync_stat_v1 { + uint32_t id; + uint32_t mode; + uint32_t size; + uint32_t mtime; +}; + +struct __attribute__((packed)) sync_stat_v2 { + uint32_t id; + uint32_t error; + uint64_t dev; + uint64_t ino; + uint32_t mode; + uint32_t nlink; + uint32_t uid; + uint32_t gid; + uint64_t size; + int64_t atime; + int64_t mtime; + int64_t ctime; +}; + +struct __attribute__((packed)) sync_dent_v1 { + uint32_t id; + uint32_t mode; + uint32_t size; + uint32_t mtime; + uint32_t namelen; +}; // followed by `namelen` bytes of the name. + +struct __attribute__((packed)) sync_dent_v2 { + uint32_t id; + uint32_t error; + uint64_t dev; + uint64_t ino; + uint32_t mode; + uint32_t nlink; + uint32_t uid; + uint32_t gid; + uint64_t size; + int64_t atime; + int64_t mtime; + int64_t ctime; + uint32_t namelen; +}; // followed by `namelen` bytes of the name. + +struct __attribute__((packed)) sync_data { + uint32_t id; + uint32_t size; +}; // followed by `size` bytes of data. + +struct __attribute__((packed)) sync_status { + uint32_t id; + uint32_t msglen; +}; // followed by `msglen` bytes of error message, if id == ID_FAIL. + union syncmsg { - struct __attribute__((packed)) { - uint32_t id; - uint32_t mode; - uint32_t size; - uint32_t mtime; - } stat_v1; - struct __attribute__((packed)) { - uint32_t id; - uint32_t error; - uint64_t dev; - uint64_t ino; - uint32_t mode; - uint32_t nlink; - uint32_t uid; - uint32_t gid; - uint64_t size; - int64_t atime; - int64_t mtime; - int64_t ctime; - } stat_v2; - struct __attribute__((packed)) { - uint32_t id; - uint32_t mode; - uint32_t size; - uint32_t mtime; - uint32_t namelen; - } dent_v1; // followed by `namelen` bytes of the name. - struct __attribute__((packed)) { - uint32_t id; - uint32_t error; - uint64_t dev; - uint64_t ino; - uint32_t mode; - uint32_t nlink; - uint32_t uid; - uint32_t gid; - uint64_t size; - int64_t atime; - int64_t mtime; - int64_t ctime; - uint32_t namelen; - } dent_v2; // followed by `namelen` bytes of the name. - struct __attribute__((packed)) { - uint32_t id; - uint32_t size; - } data; // followed by `size` bytes of data. - struct __attribute__((packed)) { - uint32_t id; - uint32_t msglen; - } status; // followed by `msglen` bytes of error message, if id == ID_FAIL. + sync_stat_v1 stat_v1; + sync_stat_v2 stat_v2; + sync_dent_v1 dent_v1; + sync_dent_v2 dent_v2; + sync_data data; + sync_status status; }; #define SYNC_DATA_MAX (64 * 1024) From a8776b49136b966612a02047967e10b82530317b Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Sat, 21 Mar 2020 16:44:09 -0700 Subject: [PATCH 185/388] adb: fix sync. adbd's file sync service doesn't handle a full socket gracefully, immediately terminating the service as soon as it fails to write a response. This would generally be fine if the socket's buffer were as large as it claims (212992 by default with a 64-bit kernel), but this buffer size is a giant lie, as each write has 576 bytes of overhead that's used up in the send buffer. When setting the send buffer size, the kernel helpfully doubles the value to attempt to account for the overhead, but when writing 8 byte responses, only 2% of the buffer actually gets used for responses, so we run out of buffer after 364 files instead of the 26624 that would be expected. Fix this by processing the responses as they become available, and calculate a maximum limit to how many sends we dispatch before we stop and wait for responses to come in. Bug: http://b/150827486 Test: manually modified adbd to respond with giant error messages, and modified adb to not read responses until we choose to block Change-Id: Ieb8c935662864211e2fd16c337ffed0992990086 (cherry picked from commit 672cdfeeff8ad64622a529ed0c4d1b6923df7539) --- adb/client/file_sync_client.cpp | 132 ++++++++++++++++++++++++-------- 1 file changed, 99 insertions(+), 33 deletions(-) diff --git a/adb/client/file_sync_client.cpp b/adb/client/file_sync_client.cpp index 94bd8f543..7c341bcf0 100644 --- a/adb/client/file_sync_client.cpp +++ b/adb/client/file_sync_client.cpp @@ -209,7 +209,8 @@ struct TransferLedger { class SyncConnection { public: - SyncConnection() { + SyncConnection() : acknowledgement_buffer_(sizeof(sync_status) + SYNC_DATA_MAX) { + acknowledgement_buffer_.resize(0); max = SYNC_DATA_MAX; // TODO: decide at runtime. std::string error; @@ -507,34 +508,6 @@ class SyncConnection { return WriteOrDie(lpath, rpath, &msg.data, sizeof(msg.data)); } - bool ReadAcknowledgments() { - bool result = true; - while (!deferred_acknowledgements_.empty()) { - auto [from, to] = std::move(deferred_acknowledgements_.front()); - deferred_acknowledgements_.pop_front(); - result &= CopyDone(from, to); - } - return result; - } - - bool CopyDone(const std::string& from, const std::string& to) { - syncmsg msg; - if (!ReadFdExactly(fd, &msg.status, sizeof(msg.status))) { - Error("failed to copy '%s' to '%s': couldn't read from device", from.c_str(), - to.c_str()); - return false; - } - if (msg.status.id == ID_OKAY) { - return true; - } - if (msg.status.id != ID_FAIL) { - Error("failed to copy '%s' to '%s': unknown reason %d", from.c_str(), to.c_str(), - msg.status.id); - return false; - } - return ReportCopyFailure(from, to, msg); - } - bool ReportCopyFailure(const std::string& from, const std::string& to, const syncmsg& msg) { std::vector buf(msg.status.msglen + 1); if (!ReadFdExactly(fd, &buf[0], msg.status.msglen)) { @@ -547,6 +520,97 @@ class SyncConnection { return false; } + void CopyDone() { deferred_acknowledgements_.pop_front(); } + + void ReportDeferredCopyFailure(const std::string& msg) { + auto& [from, to] = deferred_acknowledgements_.front(); + Error("failed to copy '%s' to '%s': remote %s", from.c_str(), to.c_str(), msg.c_str()); + deferred_acknowledgements_.pop_front(); + } + + bool ReadAcknowledgements(bool read_all = false) { + // We need to read enough such that adbd's intermediate socket's write buffer can't be + // full. The default buffer on Linux is 212992 bytes, but there's 576 bytes of bookkeeping + // overhead per write. The worst case scenario is a continuous string of failures, since + // each logical packet is divided into two writes. If our packet size if conservatively 512 + // bytes long, this leaves us with space for 128 responses. + constexpr size_t max_deferred_acks = 128; + auto& buf = acknowledgement_buffer_; + adb_pollfd pfd = {.fd = fd.get(), .events = POLLIN}; + while (!deferred_acknowledgements_.empty()) { + bool should_block = read_all || deferred_acknowledgements_.size() >= max_deferred_acks; + + ssize_t rc = adb_poll(&pfd, 1, should_block ? -1 : 0); + if (rc == 0) { + CHECK(!should_block); + return true; + } + + if (acknowledgement_buffer_.size() < sizeof(sync_status)) { + const ssize_t header_bytes_left = sizeof(sync_status) - buf.size(); + ssize_t rc = adb_read(fd, buf.end(), header_bytes_left); + if (rc <= 0) { + Error("failed to read copy response"); + return false; + } + + buf.resize(buf.size() + rc); + if (rc != header_bytes_left) { + // Early exit if we run out of data in the socket. + return true; + } + + if (!should_block) { + // We don't want to read again yet, because the socket might be empty. + continue; + } + } + + auto* hdr = reinterpret_cast(buf.data()); + if (hdr->id == ID_OKAY) { + buf.resize(0); + if (hdr->msglen != 0) { + Error("received ID_OKAY with msg_len (%" PRIu32 " != 0", hdr->msglen); + return false; + } + CopyDone(); + continue; + } else if (hdr->id != ID_FAIL) { + Error("unexpected response from daemon: id = %#" PRIx32, hdr->id); + return false; + } else if (hdr->msglen > SYNC_DATA_MAX) { + Error("too-long message length from daemon: msglen = %" PRIu32, hdr->msglen); + return false; + } + + const ssize_t msg_bytes_left = hdr->msglen + sizeof(sync_status) - buf.size(); + CHECK_GE(msg_bytes_left, 0); + if (msg_bytes_left > 0) { + ssize_t rc = adb_read(fd, buf.end(), msg_bytes_left); + if (rc <= 0) { + Error("failed to read copy failure message"); + return false; + } + + buf.resize(buf.size() + rc); + if (rc != msg_bytes_left) { + if (should_block) { + continue; + } else { + return true; + } + } + + std::string msg(buf.begin() + sizeof(sync_status), buf.end()); + ReportDeferredCopyFailure(msg); + buf.resize(0); + return false; + } + } + + return true; + } + void Printf(const char* fmt, ...) __attribute__((__format__(__printf__, 2, 3))) { std::string s; @@ -613,6 +677,7 @@ class SyncConnection { private: std::deque> deferred_acknowledgements_; + Block acknowledgement_buffer_; FeatureSet features_; bool have_stat_v2_; bool have_ls_v2_; @@ -721,7 +786,7 @@ static bool sync_send(SyncConnection& sc, const std::string& lpath, const std::s if (!sc.SendSmallFile(rpath, mode, lpath, rpath, mtime, buf, data_length)) { return false; } - return true; + return sc.ReadAcknowledgements(); #endif } @@ -744,7 +809,7 @@ static bool sync_send(SyncConnection& sc, const std::string& lpath, const std::s return false; } } - return true; + return sc.ReadAcknowledgements(); } static bool sync_recv(SyncConnection& sc, const char* rpath, const char* lpath, @@ -971,8 +1036,9 @@ static bool copy_local_dir_remote(SyncConnection& sc, std::string lpath, } sc.RecordFilesSkipped(skipped); + bool success = sc.ReadAcknowledgements(true); sc.ReportTransferRate(lpath, TransferDirection::push); - return true; + return success; } bool do_sync_push(const std::vector& srcs, const char* dst, bool sync) { @@ -1065,7 +1131,7 @@ bool do_sync_push(const std::vector& srcs, const char* dst, bool sy sc.ReportTransferRate(src_path, TransferDirection::push); } - success &= sc.ReadAcknowledgments(); + success &= sc.ReadAcknowledgements(true); sc.ReportOverallTransferRate(TransferDirection::push); return success; } From 8056dd129a2439e883d9df41cae113c0f0894643 Mon Sep 17 00:00:00 2001 From: Ruchir Rastogi Date: Tue, 24 Mar 2020 07:53:23 -0700 Subject: [PATCH 186/388] Support ERROR_ATOM_ID_INVALID_POSITION Originally, the native implementation would discard everything clients wrote to the buffer before the setAtomId call. Thus, the atom id was always placed in the "correct position." However, for consistency with the Java implementation, we now allow write calls before setAtomId to occur and log an error in that case. Test: bit libstatssocket_test:* Bug: 152119205 Change-Id: Ib109c7a939a5ae92c1d5fc70aa647ac7390fadad --- libstats/socket/include/stats_event.h | 3 +- libstats/socket/stats_event.c | 52 ++++++++++------------ libstats/socket/tests/stats_event_test.cpp | 14 ++++++ 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/libstats/socket/include/stats_event.h b/libstats/socket/include/stats_event.h index 35762989b..00dc76e3d 100644 --- a/libstats/socket/include/stats_event.h +++ b/libstats/socket/include/stats_event.h @@ -89,7 +89,8 @@ void AStatsEvent_release(AStatsEvent* event); /** * Sets the atom id for this StatsEvent. * - * This function should be called immediately after AStatsEvent_obtain. + * This function should be called immediately after AStatsEvent_obtain. It may + * be called additional times as well, but subsequent calls will have no effect. **/ void AStatsEvent_setAtomId(AStatsEvent* event, uint32_t atomId); diff --git a/libstats/socket/stats_event.c b/libstats/socket/stats_event.c index 24d2ea87e..e63bc07db 100644 --- a/libstats/socket/stats_event.c +++ b/libstats/socket/stats_event.c @@ -47,6 +47,7 @@ #define ERROR_TOO_MANY_FIELDS 0x200 #define ERROR_INVALID_VALUE_TYPE 0x400 #define ERROR_STRING_NOT_NULL_TERMINATED 0x800 +#define ERROR_ATOM_ID_INVALID_POSITION 0x2000 /* TYPE IDS */ #define INT32_TYPE 0x00 @@ -98,11 +99,6 @@ AStatsEvent* AStatsEvent_obtain() { event->buf[0] = OBJECT_TYPE; AStatsEvent_writeInt64(event, get_elapsed_realtime_ns()); // write the timestamp - // Force client to set atom id immediately (this is required for atom-level - // annotations to be written correctly). All atom field and annotation - // writes will fail until the atom id is set because event->errors != 0. - event->errors |= ERROR_NO_ATOM_ID; - return event; } @@ -112,10 +108,12 @@ void AStatsEvent_release(AStatsEvent* event) { } void AStatsEvent_setAtomId(AStatsEvent* event, uint32_t atomId) { - if ((event->errors & ERROR_NO_ATOM_ID) == 0) return; + if (event->atomId != 0) return; + if (event->numElements != 1) { + event->errors |= ERROR_ATOM_ID_INVALID_POSITION; + return; + } - // Clear the ERROR_NO_ATOM_ID bit. - event->errors &= ~ERROR_NO_ATOM_ID; event->atomId = atomId; AStatsEvent_writeInt32(event, atomId); } @@ -197,36 +195,26 @@ static void start_field(AStatsEvent* event, uint8_t typeId) { } void AStatsEvent_writeInt32(AStatsEvent* event, int32_t value) { - if (event->errors) return; - start_field(event, INT32_TYPE); append_int32(event, value); } void AStatsEvent_writeInt64(AStatsEvent* event, int64_t value) { - if (event->errors) return; - start_field(event, INT64_TYPE); append_int64(event, value); } void AStatsEvent_writeFloat(AStatsEvent* event, float value) { - if (event->errors) return; - start_field(event, FLOAT_TYPE); append_float(event, value); } void AStatsEvent_writeBool(AStatsEvent* event, bool value) { - if (event->errors) return; - start_field(event, BOOL_TYPE); append_bool(event, value); } void AStatsEvent_writeByteArray(AStatsEvent* event, const uint8_t* buf, size_t numBytes) { - if (event->errors) return; - start_field(event, BYTE_ARRAY_TYPE); append_int32(event, numBytes); append_byte_array(event, buf, numBytes); @@ -234,8 +222,6 @@ void AStatsEvent_writeByteArray(AStatsEvent* event, const uint8_t* buf, size_t n // Value is assumed to be encoded using UTF8 void AStatsEvent_writeString(AStatsEvent* event, const char* value) { - if (event->errors) return; - start_field(event, STRING_TYPE); append_string(event, value); } @@ -243,8 +229,10 @@ void AStatsEvent_writeString(AStatsEvent* event, const char* value) { // Tags are assumed to be encoded using UTF8 void AStatsEvent_writeAttributionChain(AStatsEvent* event, const uint32_t* uids, const char* const* tags, uint8_t numNodes) { - if (numNodes > MAX_BYTE_VALUE) event->errors |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; - if (event->errors) return; + if (numNodes > MAX_BYTE_VALUE) { + event->errors |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; + return; + } start_field(event, ATTRIBUTION_CHAIN_TYPE); append_byte(event, numNodes); @@ -270,9 +258,13 @@ static void increment_annotation_count(AStatsEvent* event) { } void AStatsEvent_addBoolAnnotation(AStatsEvent* event, uint8_t annotationId, bool value) { - if (event->lastFieldPos == 0) event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; - if (annotationId > MAX_BYTE_VALUE) event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; - if (event->errors) return; + if (event->numElements < 2) { + event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; + return; + } else if (annotationId > MAX_BYTE_VALUE) { + event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; + return; + } append_byte(event, annotationId); append_byte(event, BOOL_TYPE); @@ -281,9 +273,13 @@ void AStatsEvent_addBoolAnnotation(AStatsEvent* event, uint8_t annotationId, boo } void AStatsEvent_addInt32Annotation(AStatsEvent* event, uint8_t annotationId, int32_t value) { - if (event->lastFieldPos == 0) event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; - if (annotationId > MAX_BYTE_VALUE) event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; - if (event->errors) return; + if (event->numElements < 2) { + event->errors |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; + return; + } else if (annotationId > MAX_BYTE_VALUE) { + event->errors |= ERROR_ANNOTATION_ID_TOO_LARGE; + return; + } append_byte(event, annotationId); append_byte(event, INT32_TYPE); diff --git a/libstats/socket/tests/stats_event_test.cpp b/libstats/socket/tests/stats_event_test.cpp index 04eff3689..6e47e3dd3 100644 --- a/libstats/socket/tests/stats_event_test.cpp +++ b/libstats/socket/tests/stats_event_test.cpp @@ -32,6 +32,7 @@ #define ERROR_TOO_MANY_FIELDS 0x200 #define ERROR_INVALID_VALUE_TYPE 0x400 #define ERROR_STRING_NOT_NULL_TERMINATED 0x800 +#define ERROR_ATOM_ID_INVALID_POSITION 0x2000 /* TYPE IDS */ #define INT32_TYPE 0x00 @@ -358,6 +359,19 @@ TEST(StatsEventTest, TestOverflowError) { AStatsEvent_release(event); } +TEST(StatsEventTest, TestAtomIdInvalidPositionError) { + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_writeInt32(event, 0); + AStatsEvent_setAtomId(event, 100); + AStatsEvent_writeBool(event, true); + AStatsEvent_build(event); + + uint32_t errors = AStatsEvent_getErrors(event); + EXPECT_NE(errors | ERROR_ATOM_ID_INVALID_POSITION, 0); + + AStatsEvent_release(event); +} + TEST(StatsEventTest, TestOverwriteTimestamp) { uint32_t atomId = 100; int64_t expectedTimestamp = 0x123456789; From ae695c9fad9c9302508e3e586cf8a774b6cccbed Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Wed, 23 Oct 2019 21:32:43 +0100 Subject: [PATCH 187/388] Remove use of static libdexfile to avoid linking in ART internal code. - Create a static library libunwindstack_no_dex without DEX support. - Use it in libdebuggerd_handler_fallback, whose only use is in the linker, which shouldn't need that support. - Use it in init_first_stage, which doesn't need DEX support either. - Also need a libbacktrace_no_dex since it's in the dependency chain from init_first_stage to libunwindstack_no_dex. Also restrict the *_no_dex libs and libdebuggerd_handler_fallback as much as possible to avoid inadvertent use of these reduced functionality libs. Test: m init_first_stage on Cuttlefish where BOARD_BUILD_SYSTEM_ROOT_IMAGE=false Test: m system_image com.android.runtime Test: Build & boot Test: atest linker-unit-tests libunwindstack_unit_test debuggerd_test Bug: 142944931 Bug: 151466650 Change-Id: Iaacb29bfe602f3ca12a00a712e2a64c45ff0118b Merged-In: Iaacb29bfe602f3ca12a00a712e2a64c45ff0118b --- debuggerd/Android.bp | 22 +++++------- init/Android.mk | 5 ++- libbacktrace/Android.bp | 47 ++++++++++++++++++------ libunwindstack/Android.bp | 76 ++++++++++++++++++++++++--------------- 4 files changed, 95 insertions(+), 55 deletions(-) diff --git a/debuggerd/Android.bp b/debuggerd/Android.bp index f28c778fe..c7bd1a83b 100644 --- a/debuggerd/Android.bp +++ b/debuggerd/Android.bp @@ -103,9 +103,14 @@ cc_library_static { export_include_dirs: ["include"], } -// Fallback implementation. +// Fallback implementation, for use in the Bionic linker only. cc_library_static { name: "libdebuggerd_handler_fallback", + visibility: ["//bionic/linker"], + apex_available: [ + "com.android.runtime", + "//apex_available:platform", + ], defaults: ["debuggerd_defaults"], recovery_available: true, srcs: [ @@ -118,8 +123,7 @@ cc_library_static { "libasync_safe", "libbase", "libdebuggerd", - "libunwindstack", - "libdexfile_support_static", // libunwindstack dependency + "libunwindstack_no_dex", "liblzma", "libcutils", ], @@ -127,14 +131,6 @@ cc_library_static { header_libs: ["bionic_libc_platform_headers"], export_header_lib_headers: ["bionic_libc_platform_headers"], - target: { - recovery: { - exclude_static_libs: [ - "libdexfile_support_static", - ], - }, - }, - export_include_dirs: ["include"], } @@ -188,7 +184,7 @@ cc_library_static { ], static_libs: [ - "libdexfile_support_static", // libunwindstack dependency + "libdexfile_support", // libunwindstack dependency "libunwindstack", "liblzma", "libbase", @@ -201,7 +197,7 @@ cc_library_static { target: { recovery: { exclude_static_libs: [ - "libdexfile_support_static", + "libdexfile_support", ], }, }, diff --git a/init/Android.mk b/init/Android.mk index 07b0f950f..207b5e765 100644 --- a/init/Android.mk +++ b/init/Android.mk @@ -105,9 +105,8 @@ LOCAL_STATIC_LIBRARIES := \ libgsi \ libcom.android.sysprop.apex \ liblzma \ - libdexfile_support_static \ - libunwindstack \ - libbacktrace \ + libunwindstack_no_dex \ + libbacktrace_no_dex \ libmodprobe \ libext2_uuid \ libprotobuf-cpp-lite \ diff --git a/libbacktrace/Android.bp b/libbacktrace/Android.bp index 59bd97c25..aa18c4247 100644 --- a/libbacktrace/Android.bp +++ b/libbacktrace/Android.bp @@ -46,16 +46,9 @@ cc_library_headers { export_include_dirs: ["include"], } -cc_library { - name: "libbacktrace", - vendor_available: false, - recovery_available: true, - vndk: { - enabled: true, - support_system_process: true, - }, +cc_defaults { + name: "libbacktrace_defaults", defaults: ["libbacktrace_common"], - host_supported: true, cflags: [ "-Wexit-time-destructors", @@ -80,7 +73,6 @@ cc_library { shared_libs: [ "libbase", "liblog", - "libunwindstack", ], static_libs: [ @@ -93,6 +85,26 @@ cc_library { whole_static_libs: ["libasync_safe"], }, }, + }, +} + +cc_library { + name: "libbacktrace", + vendor_available: false, + recovery_available: true, + vndk: { + enabled: true, + support_system_process: true, + }, + host_supported: true, + defaults: ["libbacktrace_defaults"], + + target: { + linux: { + shared_libs: [ + "libunwindstack", + ], + }, vendor: { cflags: ["-DNO_LIBDEXFILE_SUPPORT"], }, @@ -102,6 +114,21 @@ cc_library { }, } +// Static library without DEX support to avoid dependencies on the ART APEX. +cc_library_static { + name: "libbacktrace_no_dex", + visibility: ["//system/core/debuggerd"], + defaults: ["libbacktrace_defaults"], + cflags: ["-DNO_LIBDEXFILE_SUPPORT"], + target: { + linux: { + static_libs: [ + "libunwindstack_no_dex", + ], + }, + }, +} + cc_test_library { name: "libbacktrace_test", defaults: ["libbacktrace_common"], diff --git a/libunwindstack/Android.bp b/libunwindstack/Android.bp index 3695f72f0..1f3ba596a 100644 --- a/libunwindstack/Android.bp +++ b/libunwindstack/Android.bp @@ -35,20 +35,13 @@ cc_defaults { }, } -cc_library { - name: "libunwindstack", - vendor_available: true, - recovery_available: true, - vndk: { - enabled: true, - support_system_process: true, - }, +cc_defaults { + name: "libunwindstack_defaults", defaults: ["libunwindstack_flags"], export_include_dirs: ["include"], srcs: [ "ArmExidx.cpp", - "DexFile.cpp", "DexFiles.cpp", "DwarfCfa.cpp", "DwarfEhFrameWithHdr.cpp", @@ -77,7 +70,6 @@ cc_library { ], cflags: [ - "-DDEXFILE_SUPPORT", "-Wexit-time-destructors", ], @@ -89,24 +81,6 @@ cc_library { "-g", ], }, - vendor: { - cflags: ["-UDEXFILE_SUPPORT"], - exclude_srcs: [ - "DexFile.cpp", - ], - exclude_shared_libs: [ - "libdexfile_support", - ], - }, - recovery: { - cflags: ["-UDEXFILE_SUPPORT"], - exclude_srcs: [ - "DexFile.cpp", - ], - exclude_shared_libs: [ - "libdexfile_support", - ], - }, }, arch: { @@ -130,12 +104,56 @@ cc_library { shared_libs: [ "libbase", - "libdexfile_support", "liblog", "liblzma", ], } +cc_library { + name: "libunwindstack", + vendor_available: true, + recovery_available: true, + vndk: { + enabled: true, + support_system_process: true, + }, + defaults: ["libunwindstack_defaults"], + + srcs: ["DexFile.cpp"], + cflags: ["-DDEXFILE_SUPPORT"], + shared_libs: ["libdexfile_support"], + + target: { + vendor: { + cflags: ["-UDEXFILE_SUPPORT"], + exclude_srcs: ["DexFile.cpp"], + exclude_shared_libs: ["libdexfile_support"], + }, + recovery: { + cflags: ["-UDEXFILE_SUPPORT"], + exclude_srcs: ["DexFile.cpp"], + exclude_shared_libs: ["libdexfile_support"], + }, + }, +} + +// Static library without DEX support to avoid dependencies on the ART APEX. +cc_library_static { + name: "libunwindstack_no_dex", + recovery_available: true, + defaults: ["libunwindstack_defaults"], + + visibility: [ + "//system/core/debuggerd", + "//system/core/init", + "//system/core/libbacktrace", + ], + apex_available: [ + "//apex_available:platform", + "com.android.runtime", + ], +} + //------------------------------------------------------------------------- // Unit Tests //------------------------------------------------------------------------- From 494cffb26c6bb75e6291cf416521f36d51739905 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Tue, 24 Mar 2020 18:17:53 -0700 Subject: [PATCH 188/388] init: add missing TEMP_FAILURE_RETRY Bug: 150863651 Test: boot Change-Id: I09e86e08a716c2c2933e090d57818a9aad6486f8 --- init/init.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init/init.cpp b/init/init.cpp index 4289dcf72..ed5f799f1 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -136,7 +136,7 @@ static void InstallInitNotifier(Epoll* epoll) { static void WakeEpoll() { constexpr char value[] = "1"; - write(wake_epoll_fd, value, sizeof(value)); + TEMP_FAILURE_RETRY(write(wake_epoll_fd, value, sizeof(value))); } static class PropWaiterState { From f0ab5b17f6b145c7ea25fd4f90b3ae1c0472ca14 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Wed, 25 Mar 2020 00:06:51 +0000 Subject: [PATCH 189/388] Use properties for various userspace reboot timeouts Test: adb reboot userspace Bug: 146560409 Change-Id: I435e4f93a8769ff7d30cf781e0b48fa3e96121ef Merged-In: I435e4f93a8769ff7d30cf781e0b48fa3e96121ef (cherry picked from commit 7b41a1558d003084f201c361c8a4f12058f533a9) --- fs_mgr/fs_mgr.cpp | 10 ++++++++-- init/reboot.cpp | 26 ++++++++++++++++++-------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index 46018b955..12aa1f092 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -96,6 +96,7 @@ using android::base::Basename; using android::base::GetBoolProperty; +using android::base::GetUintProperty; using android::base::Readlink; using android::base::Realpath; using android::base::SetProperty; @@ -1566,11 +1567,16 @@ int fs_mgr_umount_all(android::fs_mgr::Fstab* fstab) { return ret; } +static std::chrono::milliseconds GetMillisProperty(const std::string& name, + std::chrono::milliseconds default_value) { + auto value = GetUintProperty(name, static_cast(default_value.count())); + return std::chrono::milliseconds(std::move(value)); +} + static bool fs_mgr_unmount_all_data_mounts(const std::string& block_device) { LINFO << __FUNCTION__ << "(): about to umount everything on top of " << block_device; Timer t; - // TODO(b/135984674): should be configured via a read-only property. - std::chrono::milliseconds timeout = 5s; + auto timeout = GetMillisProperty("init.userspace_reboot.userdata_remount.timeoutmillis", 5s); while (true) { bool umount_done = true; Fstab proc_mounts; diff --git a/init/reboot.cpp b/init/reboot.cpp index f006df3a3..081f6953a 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -72,6 +72,7 @@ using namespace std::literals; using android::base::boot_clock; using android::base::GetBoolProperty; +using android::base::GetUintProperty; using android::base::SetProperty; using android::base::Split; using android::base::Timer; @@ -732,6 +733,12 @@ static Result UnmountAllApexes() { return Error() << "'/system/bin/apexd --unmount-all' failed : " << status; } +static std::chrono::milliseconds GetMillisProperty(const std::string& name, + std::chrono::milliseconds default_value) { + auto value = GetUintProperty(name, static_cast(default_value.count())); + return std::chrono::milliseconds(std::move(value)); +} + static Result DoUserspaceReboot() { LOG(INFO) << "Userspace reboot initiated"; auto guard = android::base::make_scope_guard([] { @@ -769,10 +776,13 @@ static Result DoUserspaceReboot() { sync(); LOG(INFO) << "sync() took " << sync_timer; } - // TODO(b/135984674): do we need shutdown animation for userspace reboot? - // TODO(b/135984674): control userspace timeout via read-only property? - StopServicesAndLogViolations(stop_first, 10s, true /* SIGTERM */); - if (int r = StopServicesAndLogViolations(stop_first, 20s, false /* SIGKILL */); r > 0) { + auto sigterm_timeout = GetMillisProperty("init.userspace_reboot.sigterm.timeoutmillis", 5s); + auto sigkill_timeout = GetMillisProperty("init.userspace_reboot.sigkill.timeoutmillis", 10s); + LOG(INFO) << "Timeout to terminate services : " << sigterm_timeout.count() << "ms" + << "Timeout to kill services: " << sigkill_timeout.count() << "ms"; + StopServicesAndLogViolations(stop_first, sigterm_timeout, true /* SIGTERM */); + if (int r = StopServicesAndLogViolations(stop_first, sigkill_timeout, false /* SIGKILL */); + r > 0) { // TODO(b/135984674): store information about offending services for debugging. return Error() << r << " post-data services are still running"; } @@ -782,8 +792,8 @@ static Result DoUserspaceReboot() { if (auto result = CallVdc("volume", "reset"); !result.ok()) { return result; } - if (int r = StopServicesAndLogViolations(GetDebuggingServices(true /* only_post_data */), 5s, - false /* SIGKILL */); + if (int r = StopServicesAndLogViolations(GetDebuggingServices(true /* only_post_data */), + sigkill_timeout, false /* SIGKILL */); r > 0) { // TODO(b/135984674): store information about offending services for debugging. return Error() << r << " debugging services are still running"; @@ -827,8 +837,8 @@ static void UserspaceRebootWatchdogThread() { return; } LOG(INFO) << "Starting userspace reboot watchdog"; - // TODO(b/135984674): this should be configured via a read-only sysprop. - std::chrono::milliseconds timeout = 60s; + auto timeout = GetMillisProperty("init.userspace_reboot.watchdog.timeoutmillis", 5min); + LOG(INFO) << "UserspaceRebootWatchdog timeout: " << timeout.count() << "ms"; if (!WaitForProperty("sys.boot_completed", "1", timeout)) { LOG(ERROR) << "Failed to boot in " << timeout.count() << "ms. Switching to full reboot"; // In this case device is in a boot loop. Only way to recover is to do dirty reboot. From aed3408f47c1621a6893ec79cfb7ff399d276543 Mon Sep 17 00:00:00 2001 From: Joshua Duong Date: Mon, 23 Mar 2020 11:01:25 -0700 Subject: [PATCH 190/388] Fix pairing aes_128_gcm key initialization. Bug: 150719467 Test: atest adb_pairing_auth_test Test: check 'adb pair' command on all three platforms work Change-Id: Idfc64fe7bed2d09f4da9d2f7df70f9d6ae4e8fa3 --- adb/pairing_auth/aes_128_gcm.cpp | 166 ++++-------------- .../include/adb/pairing/aes_128_gcm.h | 31 ++-- .../include/adb/pairing/counter.h | 49 ------ adb/pairing_auth/pairing_auth.cpp | 26 +-- adb/pairing_auth/tests/Android.bp | 1 - adb/pairing_auth/tests/aes_128_gcm_test.cpp | 82 +-------- adb/pairing_auth/tests/counter_test.cpp | 70 -------- 7 files changed, 69 insertions(+), 356 deletions(-) delete mode 100644 adb/pairing_auth/include/adb/pairing/counter.h delete mode 100644 adb/pairing_auth/tests/counter_test.cpp diff --git a/adb/pairing_auth/aes_128_gcm.cpp b/adb/pairing_auth/aes_128_gcm.cpp index 2978834d8..51520d814 100644 --- a/adb/pairing_auth/aes_128_gcm.cpp +++ b/adb/pairing_auth/aes_128_gcm.cpp @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -28,155 +27,64 @@ namespace adb { namespace pairing { namespace { -static const size_t kHkdfKeyLength = 256; - -struct Header { - uint32_t payload; - uint8_t iv[AES_128_GCM_IV_SIZE]; - uint8_t tag[AES_128_GCM_TAG_SIZE]; -} __attribute__((packed)); +// Size of AES-128-GCM key, in bytes +static constexpr size_t kHkdfKeyLength = 16; } // namespace -// static -const EVP_CIPHER* Aes128Gcm::cipher_ = EVP_aes_128_gcm(); - Aes128Gcm::Aes128Gcm(const uint8_t* key_material, size_t key_material_len) { CHECK(key_material); CHECK_NE(key_material_len, 0ul); - context_.reset(EVP_CIPHER_CTX_new()); - CHECK(context_.get()); - // Start with a random number for our counter - CHECK_EQ(RAND_bytes(counter_.data(), counter_.size()), 1); - - uint8_t key[kHkdfKeyLength] = {}; - uint8_t salt[64] = "this is the salt"; - uint8_t info[64] = "this is the info"; - CHECK_EQ(HKDF(key, sizeof(key), EVP_sha256(), key_material, key_material_len, salt, - sizeof(salt), info, sizeof(info)), + uint8_t key[kHkdfKeyLength]; + uint8_t info[] = "adb pairing_auth aes-128-gcm key"; + CHECK_EQ(HKDF(key, sizeof(key), EVP_sha256(), key_material, key_material_len, nullptr, 0, info, + sizeof(info) - 1), 1); - CHECK_EQ(AES_set_encrypt_key(key, sizeof(key), &aes_key_), 0); + CHECK(EVP_AEAD_CTX_init(context_.get(), EVP_aead_aes_128_gcm(), key, sizeof(key), + EVP_AEAD_DEFAULT_TAG_LENGTH, nullptr)); } -int Aes128Gcm::Encrypt(const uint8_t* in, size_t in_len, uint8_t* out, size_t out_len) { - if (out_len < EncryptedSize(in_len)) { - LOG(ERROR) << "out buffer size (sz=" << out_len - << ") not big enough (sz=" << EncryptedSize(in_len) << ")"; - return -1; - } - auto& header = *reinterpret_cast(out); - // Place the IV in the header - memcpy(header.iv, counter_.data(), counter_.size()); - int status = EVP_EncryptInit_ex(context_.get(), cipher_, nullptr, - reinterpret_cast(&aes_key_), counter_.data()); - counter_.Increase(); - if (status != 1) { - return -1; +std::optional Aes128Gcm::Encrypt(const uint8_t* in, size_t in_len, uint8_t* out, + size_t out_len) { + std::vector nonce(EVP_AEAD_nonce_length(EVP_AEAD_CTX_aead(context_.get())), 0); + memcpy(nonce.data(), &enc_sequence_, sizeof(enc_sequence_)); + size_t written_sz; + if (!EVP_AEAD_CTX_seal(context_.get(), out, &written_sz, out_len, nonce.data(), nonce.size(), + in, in_len, nullptr, 0)) { + LOG(ERROR) << "Failed to encrypt (in_len=" << in_len << ", out_len=" << out_len + << ", out_len_needed=" << EncryptedSize(in_len) << ")"; + return std::nullopt; } - int cipherLen = 0; - out += sizeof(header); - status = EVP_EncryptUpdate(context_.get(), out, &cipherLen, in, in_len); - if (status != 1 || cipherLen < 0) { - return -1; - } - - // Padding is enabled by default, so EVP_EncryptFinal_ex will pad any - // remaining partial data up to the block size. - int padding = 0; - status = EVP_EncryptFinal_ex(context_.get(), out + cipherLen, &padding); - if (status != 1 || padding < 0) { - return -1; - } - - // Place the tag in the header - status = EVP_CIPHER_CTX_ctrl(context_.get(), EVP_CTRL_GCM_GET_TAG, sizeof(header.tag), - header.tag); - if (status != 1) { - return -1; - } - // Place the payload size in the header - uint32_t totalLen = sizeof(header) + cipherLen + padding; - header.payload = htonl(static_cast(cipherLen) + static_cast(padding)); - return totalLen; + ++enc_sequence_; + return written_sz; } -int Aes128Gcm::Decrypt(const uint8_t* in, size_t in_len, uint8_t* out, size_t out_len) { - if (in_len < sizeof(Header)) { - return 0; - } - if (out_len < DecryptedSize(in, in_len)) { - return 0; - } - const auto& header = *reinterpret_cast(in); - uint32_t payload = ntohl(header.payload); - uint32_t expected_inlen = sizeof(Header) + payload; - if (in_len < expected_inlen) { - // Not enough data available - return 0; - } - // Initialized with expected IV from header - int status = EVP_DecryptInit_ex(context_.get(), cipher_, nullptr, - reinterpret_cast(&aes_key_), header.iv); - if (status != 1) { - return -1; +std::optional Aes128Gcm::Decrypt(const uint8_t* in, size_t in_len, uint8_t* out, + size_t out_len) { + std::vector nonce(EVP_AEAD_nonce_length(EVP_AEAD_CTX_aead(context_.get())), 0); + memcpy(nonce.data(), &dec_sequence_, sizeof(dec_sequence_)); + size_t written_sz; + if (!EVP_AEAD_CTX_open(context_.get(), out, &written_sz, out_len, nonce.data(), nonce.size(), + in, in_len, nullptr, 0)) { + LOG(ERROR) << "Failed to decrypt (in_len=" << in_len << ", out_len=" << out_len + << ", out_len_needed=" << DecryptedSize(in_len) << ")"; + return std::nullopt; } - int decrypted_len = 0; - status = EVP_DecryptUpdate(context_.get(), out, &decrypted_len, in + sizeof(header), payload); - if (status != 1 || decrypted_len < 0) { - return -1; - } - - // Set expected tag from header - status = EVP_CIPHER_CTX_ctrl(context_.get(), EVP_CTRL_GCM_SET_TAG, sizeof(header.tag), - const_cast(header.tag)); - if (status != 1) { - return -1; - } - - // This is the padding. It can be ignored. - int len = 0; - status = EVP_DecryptFinal_ex(context_.get(), out + decrypted_len, &len); - if (status != 1) { - LOG(ERROR) << "EVP_DecryptFinal_ex failed. Tag mismatch"; - return -1; - } - - // Return the length without the padding. - return decrypted_len; + ++dec_sequence_; + return written_sz; } size_t Aes128Gcm::EncryptedSize(size_t size) { - // We need to account for block alignment of the encrypted data. - // According to openssl.org/docs/man1.0.2/man3/EVP_EncryptUpdate.html, - // "The amount of data written depends on the block alignment of the - // encrypted data ..." - // ".. the amount of data written may be anything from zero bytes to - // (inl + cipher_block_size - 1) ..." - const size_t cipher_block_size = EVP_CIPHER_block_size(cipher_); - size_t padding = cipher_block_size - (size % cipher_block_size); - if (padding != cipher_block_size) { - size += padding; - } - return size + sizeof(Header); + // https://commondatastorage.googleapis.com/chromium-boringssl-docs/aead.h.html#EVP_AEAD_CTX_seal + return size + EVP_AEAD_max_overhead(EVP_AEAD_CTX_aead(context_.get())); } -size_t Aes128Gcm::DecryptedSize(const uint8_t* encrypted_data, size_t encrypted_size) { - if (encrypted_size < sizeof(Header)) { - // Not enough data yet - return 0; - } - auto header = reinterpret_cast(encrypted_data); - uint32_t payload = ntohl(header->payload); - size_t total_size = payload + sizeof(Header); - if (encrypted_size < total_size) { - // There's enough data for the header but not enough data for the - // payload. Indicate that there's not enough data for now. - return 0; - } - return payload; +size_t Aes128Gcm::DecryptedSize(size_t size) { + // https://commondatastorage.googleapis.com/chromium-boringssl-docs/aead.h.html#EVP_AEAD_CTX_open + return size; } } // namespace pairing diff --git a/adb/pairing_auth/include/adb/pairing/aes_128_gcm.h b/adb/pairing_auth/include/adb/pairing/aes_128_gcm.h index 490dd12a3..6be585690 100644 --- a/adb/pairing_auth/include/adb/pairing/aes_128_gcm.h +++ b/adb/pairing_auth/include/adb/pairing/aes_128_gcm.h @@ -16,17 +16,12 @@ #pragma once -#include -#include - #include -#include "adb/pairing/counter.h" +#include +#include -// This is the default size of the initialization vector (iv) for AES-128-GCM -#define AES_128_GCM_IV_SIZE 12 -// This is the full tag size for AES-128-GCM -#define AES_128_GCM_TAG_SIZE 16 +#include namespace adb { namespace pairing { @@ -42,7 +37,7 @@ class Aes128Gcm { // suitable for decryption with this class. // The method returns the number of bytes placed in |out| on success and a // negative value if an error occurs. - int Encrypt(const uint8_t* in, size_t in_len, uint8_t* out, size_t out_len); + std::optional Encrypt(const uint8_t* in, size_t in_len, uint8_t* out, size_t out_len); // Decrypt a block of data in |in| of length |in_len|, this consumes all data // in |in_len| bytes of data. The decrypted output is placed in the |out| // buffer of length |out_len|. On successful decryption the number of bytes in @@ -50,22 +45,18 @@ class Aes128Gcm { // The method returns the number of bytes consumed from the |in| buffer. If // there is not enough data available in |in| the method returns zero. If // an error occurs the method returns a negative value. - int Decrypt(const uint8_t* in, size_t in_len, uint8_t* out, size_t out_len); + std::optional Decrypt(const uint8_t* in, size_t in_len, uint8_t* out, size_t out_len); // Return a safe amount of buffer storage needed to encrypt |size| bytes. size_t EncryptedSize(size_t size); - // Return a safe amount of buffer storage needed to decrypt the encrypted - // data in |encrypted_data| which is of length |encrypted_size|. Returns 0 if - // there is not enough data available to determine the required size. - size_t DecryptedSize(const uint8_t* encrypted_data, size_t encrypted_size); - - static const EVP_CIPHER* cipher_; + // Return a safe amount of buffer storage needed to decrypt |size| bytes. + size_t DecryptedSize(size_t size); private: - bssl::UniquePtr context_; - AES_KEY aes_key_; - // We're going to use this counter for our iv so that it never repeats - Counter counter_; + bssl::ScopedEVP_AEAD_CTX context_; + // Sequence numbers to use as nonces in the encryption scheme + uint64_t dec_sequence_ = 0; + uint64_t enc_sequence_ = 0; }; } // namespace pairing diff --git a/adb/pairing_auth/include/adb/pairing/counter.h b/adb/pairing_auth/include/adb/pairing/counter.h deleted file mode 100644 index 263ceb780..000000000 --- a/adb/pairing_auth/include/adb/pairing/counter.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2020 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 -#include - -namespace adb { -namespace pairing { - -template -class Counter { - public: - void Increase() { - for (size_t i = sizeof(counter_) - 1; i < sizeof(counter_); --i) { - if (++counter_[i] != 0) { - break; - } - } - } - - uint8_t* data() { return counter_; } - const uint8_t* data() const { return counter_; } - - constexpr size_t size() const { return sizeof(counter_); } - - uint8_t& operator[](size_t index) { return counter_[index]; } - const uint8_t& operator[](size_t index) const { return counter_[index]; } - - private: - uint8_t counter_[N]; -}; - -} // namespace pairing -} // namespace adb diff --git a/adb/pairing_auth/pairing_auth.cpp b/adb/pairing_auth/pairing_auth.cpp index 96bc11067..0ac04e691 100644 --- a/adb/pairing_auth/pairing_auth.cpp +++ b/adb/pairing_auth/pairing_auth.cpp @@ -75,8 +75,8 @@ struct PairingAuthCtx { // Returns a safe buffer size for encrypting a buffer of size |len|. size_t SafeEncryptedSize(size_t len); - // Returns a safe buffer size for decrypting a buffer |buf|. - size_t SafeDecryptedSize(const Data& buf); + // Returns a safe buffer size for decrypting a buffer of size |len|. + size_t SafeDecryptedSize(size_t len); private: Data our_msg_; @@ -167,12 +167,12 @@ PairingAuthCtx::Data PairingAuthCtx::Encrypt(const PairingAuthCtx::Data& data) { // Determine the size for the encrypted data based on the raw data. Data encrypted(cipher_->EncryptedSize(data.size())); - int bytes = cipher_->Encrypt(data.data(), data.size(), encrypted.data(), encrypted.size()); - if (bytes < 0) { + auto out_size = cipher_->Encrypt(data.data(), data.size(), encrypted.data(), encrypted.size()); + if (!out_size.has_value() || *out_size == 0) { LOG(ERROR) << "Unable to encrypt data"; return Data(); } - encrypted.resize(bytes); + encrypted.resize(*out_size); return encrypted; } @@ -182,14 +182,14 @@ PairingAuthCtx::Data PairingAuthCtx::Decrypt(const PairingAuthCtx::Data& data) { CHECK(!data.empty()); // Determine the size for the decrypted data based on the raw data. - Data decrypted(cipher_->DecryptedSize(data.data(), data.size())); + Data decrypted(cipher_->DecryptedSize(data.size())); size_t decrypted_size = decrypted.size(); - int bytes = cipher_->Decrypt(data.data(), data.size(), decrypted.data(), decrypted_size); - if (bytes <= 0) { + auto out_size = cipher_->Decrypt(data.data(), data.size(), decrypted.data(), decrypted_size); + if (!out_size.has_value() || *out_size == 0) { LOG(ERROR) << "Unable to decrypt data"; return Data(); } - decrypted.resize(bytes); + decrypted.resize(*out_size); return decrypted; } @@ -199,9 +199,9 @@ size_t PairingAuthCtx::SafeEncryptedSize(size_t len) { return cipher_->EncryptedSize(len); } -size_t PairingAuthCtx::SafeDecryptedSize(const PairingAuthCtx::Data& buf) { +size_t PairingAuthCtx::SafeDecryptedSize(size_t len) { CHECK(cipher_); - return cipher_->DecryptedSize(buf.data(), buf.size()); + return cipher_->DecryptedSize(len); } PairingAuthCtx* pairing_auth_server_new(const uint8_t* pswd, size_t len) { @@ -271,8 +271,8 @@ size_t pairing_auth_safe_decrypted_size(PairingAuthCtx* ctx, const uint8_t* buf, CHECK(ctx); CHECK(buf); CHECK_GT(len, 0U); - std::vector p(buf, buf + len); - return ctx->SafeDecryptedSize(p); + // We no longer need buf for EVP_AEAD + return ctx->SafeDecryptedSize(len); } bool pairing_auth_decrypt(PairingAuthCtx* ctx, const uint8_t* inbuf, size_t inlen, uint8_t* outbuf, diff --git a/adb/pairing_auth/tests/Android.bp b/adb/pairing_auth/tests/Android.bp index 292fff527..213123d59 100644 --- a/adb/pairing_auth/tests/Android.bp +++ b/adb/pairing_auth/tests/Android.bp @@ -18,7 +18,6 @@ cc_test { name: "adb_pairing_auth_test", srcs: [ "aes_128_gcm_test.cpp", - "counter_test.cpp", "pairing_auth_test.cpp", ], diff --git a/adb/pairing_auth/tests/aes_128_gcm_test.cpp b/adb/pairing_auth/tests/aes_128_gcm_test.cpp index e1a20e80d..55689d67a 100644 --- a/adb/pairing_auth/tests/aes_128_gcm_test.cpp +++ b/adb/pairing_auth/tests/aes_128_gcm_test.cpp @@ -39,7 +39,7 @@ TEST(Aes128GcmTest, encrypt_decrypt) { const uint8_t msg[] = "alice and bob, sitting in a binary tree"; uint8_t material[256]; uint8_t encrypted[1024]; - uint8_t out_buf[1024]; + uint8_t out_buf[1024] = {}; RAND_bytes(material, sizeof(material)); Aes128Gcm alice(material, sizeof(material)); @@ -47,82 +47,16 @@ TEST(Aes128GcmTest, encrypt_decrypt) { ; ASSERT_GE(alice.EncryptedSize(sizeof(msg)), sizeof(msg)); - int encrypted_size = alice.Encrypt(msg, sizeof(msg), encrypted, sizeof(encrypted)); - ASSERT_GT(encrypted_size, 0); + auto encrypted_size = alice.Encrypt(msg, sizeof(msg), encrypted, sizeof(encrypted)); + ASSERT_TRUE(encrypted_size.has_value()); + ASSERT_GT(*encrypted_size, 0); size_t out_size = sizeof(out_buf); - ASSERT_GE(bob.DecryptedSize(encrypted, sizeof(encrypted)), sizeof(msg)); - int decrypted_size = bob.Decrypt(encrypted, sizeof(encrypted), out_buf, out_size); - ASSERT_EQ(sizeof(msg), decrypted_size); - memset(out_buf + decrypted_size, 0, sizeof(out_buf) - decrypted_size); + ASSERT_GE(bob.DecryptedSize(*encrypted_size), sizeof(msg)); + auto decrypted_size = bob.Decrypt(encrypted, *encrypted_size, out_buf, out_size); + ASSERT_TRUE(decrypted_size.has_value()); + ASSERT_EQ(sizeof(msg), *decrypted_size); ASSERT_STREQ(reinterpret_cast(msg), reinterpret_cast(out_buf)); } -TEST(Aes128GcmTest, padding) { - // Test with block-align data as well as unaligned data. - const size_t cipher_block_size = EVP_CIPHER_block_size(Aes128Gcm::cipher_); - uint8_t material[256]; - RAND_bytes(material, sizeof(material)); - Aes128Gcm alice(material, sizeof(material)); - Aes128Gcm bob(material, sizeof(material)); - ; - std::vector msg; - std::vector encrypted; - std::vector decrypted; - - // Test with aligned data - { - msg.resize(cipher_block_size); - RAND_bytes(msg.data(), msg.size()); - - // encrypt - size_t safe_encrypted_sz = alice.EncryptedSize(msg.size()); - ASSERT_GE(safe_encrypted_sz, msg.size()); - encrypted.resize(safe_encrypted_sz); - int encrypted_size = - alice.Encrypt(msg.data(), msg.size(), encrypted.data(), encrypted.size()); - ASSERT_GT(encrypted_size, 0); - ASSERT_LE(encrypted_size, safe_encrypted_sz); - encrypted.resize(encrypted_size); - - // decrypt - size_t safe_decrypted_size = bob.DecryptedSize(encrypted.data(), encrypted.size()); - ASSERT_GE(safe_decrypted_size, msg.size()); - decrypted.resize(safe_decrypted_size); - int decrypted_size = - bob.Decrypt(encrypted.data(), encrypted.size(), decrypted.data(), decrypted.size()); - ASSERT_GT(decrypted_size, 0); - ASSERT_LE(decrypted_size, safe_decrypted_size); - ASSERT_EQ(msg.size(), decrypted_size); - ASSERT_EQ(memcmp(msg.data(), decrypted.data(), decrypted.size()), 0); - } - - // Test with unaligned data - { - msg.resize(cipher_block_size + 1); - RAND_bytes(msg.data(), msg.size()); - - // encrypt - size_t safe_encrypted_sz = alice.EncryptedSize(msg.size()); - ASSERT_GE(safe_encrypted_sz, msg.size()); - encrypted.resize(safe_encrypted_sz); - int encrypted_size = - alice.Encrypt(msg.data(), msg.size(), encrypted.data(), encrypted.size()); - ASSERT_GT(encrypted_size, 0); - ASSERT_LE(encrypted_size, safe_encrypted_sz); - encrypted.resize(encrypted_size); - - // decrypt - size_t safe_decrypted_size = bob.DecryptedSize(encrypted.data(), encrypted.size()); - ASSERT_GE(safe_decrypted_size, msg.size()); - decrypted.resize(safe_decrypted_size); - int decrypted_size = - bob.Decrypt(encrypted.data(), encrypted.size(), decrypted.data(), decrypted.size()); - ASSERT_GT(decrypted_size, 0); - ASSERT_LE(decrypted_size, safe_decrypted_size); - ASSERT_EQ(msg.size(), decrypted_size); - ASSERT_EQ(memcmp(msg.data(), decrypted.data(), decrypted.size()), 0); - } -} - } // namespace pairing } // namespace adb diff --git a/adb/pairing_auth/tests/counter_test.cpp b/adb/pairing_auth/tests/counter_test.cpp deleted file mode 100644 index b3385518c..000000000 --- a/adb/pairing_auth/tests/counter_test.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2020 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 - -namespace adb { -namespace pairing { - -static constexpr size_t kTestCounterSize = 13; -static const uint8_t kZeroes[64] = {0}; - -TEST(AdbCounterTest, size_match) { - Counter counter; - ASSERT_EQ(kTestCounterSize, counter.size()); -} - -TEST(AdbCounterTest, Increase) { - Counter counter; - memset(counter.data(), 0, counter.size()); - counter.Increase(); - EXPECT_EQ(1, counter[counter.size() - 1]); - EXPECT_EQ(0, memcmp(counter.data(), kZeroes, counter.size() - 1)); -} - -TEST(AdbCounterTest, rollover_first_byte) { - Counter counter; - memset(counter.data(), 0, counter.size()); - counter[counter.size() - 1] = 0xFF; - counter.Increase(); - EXPECT_EQ(0, counter[counter.size() - 1]); - EXPECT_EQ(1, counter[counter.size() - 2]); - EXPECT_EQ(0, memcmp(counter.data(), kZeroes, counter.size() - 2)); -} - -TEST(AdbCounterTest, multiple_rollover) { - Counter counter; - memset(counter.data(), 0xFF, counter.size()); - memset(counter.data(), 0, counter.size() - 3); - counter.Increase(); - EXPECT_EQ(0, counter[counter.size() - 5]); - EXPECT_EQ(1, counter[counter.size() - 4]); - EXPECT_EQ(0, counter[counter.size() - 3]); - EXPECT_EQ(0, counter[counter.size() - 2]); - EXPECT_EQ(0, counter[counter.size() - 1]); -} - -TEST(AdbCounterTest, full_rollover) { - Counter counter; - memset(counter.data(), 0xFF, counter.size()); - counter.Increase(); - EXPECT_EQ(0, memcmp(counter.data(), kZeroes, counter.size())); -} - -} // namespace pairing -} // namespace adb From bba72d951bf8e76b14d5cc5fc3960394c2469957 Mon Sep 17 00:00:00 2001 From: Joshua Duong Date: Tue, 24 Mar 2020 09:50:59 -0700 Subject: [PATCH 191/388] Pass the os handle to the tls connection. This fixes the tls connection failure on Windows. Bug: 150719467 Test: 'adb pair', 'adb connect' on Windows host machine. Test: atest adb_tls_connection_test Change-Id: I54b8945543ad8b430510fa51dd7bea64a119454f --- adb/client/pairing/pairing_client.cpp | 7 ++++++- adb/pairing_connection/pairing_connection.cpp | 2 +- adb/transport.cpp | 8 +++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/adb/client/pairing/pairing_client.cpp b/adb/client/pairing/pairing_client.cpp index 2f878bf04..04bbcebd4 100644 --- a/adb/client/pairing/pairing_client.cpp +++ b/adb/client/pairing/pairing_client.cpp @@ -141,7 +141,12 @@ bool PairingClientImpl::StartConnection() { cert_.size(), priv_key_.data(), priv_key_.size())); CHECK(connection_); - if (!pairing_connection_start(connection_.get(), fd.release(), OnPairingResult, this)) { +#ifdef _WIN32 + int osh = cast_handle_to_int(adb_get_os_handle(fd.release())); +#else + int osh = adb_get_os_handle(fd.release()); +#endif + if (!pairing_connection_start(connection_.get(), osh, OnPairingResult, this)) { LOG(ERROR) << "PairingClient failed to start the PairingConnection"; state_ = State::Stopped; return false; diff --git a/adb/pairing_connection/pairing_connection.cpp b/adb/pairing_connection/pairing_connection.cpp index a26a6b4d2..ffe49a91e 100644 --- a/adb/pairing_connection/pairing_connection.cpp +++ b/adb/pairing_connection/pairing_connection.cpp @@ -278,13 +278,13 @@ bool PairingConnectionCtx::Start(int fd, ResultCallback cb, void* opaque) { if (fd < 0) { return false; } + fd_.reset(fd); State expected = State::Ready; if (!state_.compare_exchange_strong(expected, State::ExchangingMsgs)) { return false; } - fd_.reset(fd); cb_ = cb; opaque_ = opaque; diff --git a/adb/transport.cpp b/adb/transport.cpp index 8b3461a83..b7146b418 100644 --- a/adb/transport.cpp +++ b/adb/transport.cpp @@ -497,12 +497,18 @@ bool FdConnection::DoTlsHandshake(RSA* key, std::string* auth_key) { auto x509 = GenerateX509Certificate(evp_pkey.get()); auto x509_str = X509ToPEMString(x509.get()); auto evp_str = Key::ToPEMString(evp_pkey.get()); +#ifdef _WIN32 + int osh = cast_handle_to_int(adb_get_os_handle(fd_)); +#else + int osh = adb_get_os_handle(fd_); +#endif + #if ADB_HOST tls_ = TlsConnection::Create(TlsConnection::Role::Client, #else tls_ = TlsConnection::Create(TlsConnection::Role::Server, #endif - x509_str, evp_str, fd_); + x509_str, evp_str, osh); CHECK(tls_); #if ADB_HOST // TLS 1.3 gives the client no message if the server rejected the From 50ab0a690059a27046563a8e3ea955287b740259 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 4 Mar 2020 19:34:08 -0800 Subject: [PATCH 192/388] adb: implement compression for file sync. This improves performance when syncing by up to 2x (remote cuttlefish goes from 11.9 MB/s to 21.3 MB/s, blueline over USB 2.0 from 36 MB/s to 70 MB/s). This results in a slight drop in push speeds over USB 3.0 (125 -> 115 MB/s on blueline), presumably because we're compressing and extracting on only a single thread, but the gains over lower bandwidth transports make this worth it to submit this now and parallelize later. Bug: https://issuetracker.google.com/150827486 Test: ADB_COMPRESSION={0, 1} test_device.py (with new/old adbd) Change-Id: Ic2a0c974f1b6efecda115f87d336e3caac810035 Merged-In: Ic2a0c974f1b6efecda115f87d336e3caac810035 (cherry picked from commit 939fc19aee7f6a19ce0f4fa91557bbbe9cd974f5) --- adb/Android.bp | 4 + adb/brotli_utils.h | 144 ++++++++++++ adb/client/adb_install.cpp | 2 +- adb/client/commandline.cpp | 78 +++++-- adb/client/fastdeploy.cpp | 2 +- adb/client/file_sync_client.cpp | 314 ++++++++++++++++++++++++--- adb/client/file_sync_client.h | 8 +- adb/daemon/file_sync_service.cpp | 361 ++++++++++++++++++++++++------- adb/file_sync_protocol.h | 28 ++- adb/transport.cpp | 4 + adb/transport.h | 5 + adb/types.h | 16 ++ 12 files changed, 832 insertions(+), 134 deletions(-) create mode 100644 adb/brotli_utils.h diff --git a/adb/Android.bp b/adb/Android.bp index 2f719456d..9d47b8bf2 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -316,6 +316,7 @@ cc_binary_host { "libadb_tls_connection", "libandroidfw", "libbase", + "libbrotli", "libcutils", "libcrypto_utils", "libcrypto", @@ -451,6 +452,7 @@ cc_library { static_libs: [ "libadbconnection_server", "libadbd_core", + "libbrotli", "libdiagnose_usb", ], @@ -536,6 +538,7 @@ cc_library { }, static_libs: [ + "libbrotli", "libcutils_sockets", "libdiagnose_usb", "libmdnssd", @@ -573,6 +576,7 @@ cc_binary { "libadbd_services", "libasyncio", "libbase", + "libbrotli", "libcap", "libcrypto_utils", "libcutils_sockets", diff --git a/adb/brotli_utils.h b/adb/brotli_utils.h new file mode 100644 index 000000000..c5be73d0c --- /dev/null +++ b/adb/brotli_utils.h @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2020 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 + +#include +#include + +#include "types.h" + +enum class BrotliDecodeResult { + Error, + Done, + NeedInput, + MoreOutput, +}; + +struct BrotliDecoder { + explicit BrotliDecoder(std::span output_buffer) + : output_buffer_(output_buffer), + decoder_(BrotliDecoderCreateInstance(nullptr, nullptr, nullptr), + BrotliDecoderDestroyInstance) {} + + void Append(Block&& block) { input_buffer_.append(std::move(block)); } + + BrotliDecodeResult Decode(std::span* output) { + size_t available_in = input_buffer_.front_size(); + const uint8_t* next_in = reinterpret_cast(input_buffer_.front_data()); + + size_t available_out = output_buffer_.size(); + uint8_t* next_out = reinterpret_cast(output_buffer_.data()); + + BrotliDecoderResult r = BrotliDecoderDecompressStream( + decoder_.get(), &available_in, &next_in, &available_out, &next_out, nullptr); + + size_t bytes_consumed = input_buffer_.front_size() - available_in; + input_buffer_.drop_front(bytes_consumed); + + size_t bytes_emitted = output_buffer_.size() - available_out; + *output = std::span(output_buffer_.data(), bytes_emitted); + + switch (r) { + case BROTLI_DECODER_RESULT_SUCCESS: + return BrotliDecodeResult::Done; + case BROTLI_DECODER_RESULT_ERROR: + return BrotliDecodeResult::Error; + case BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: + // Brotli guarantees as one of its invariants that if it returns NEEDS_MORE_INPUT, + // it will consume the entire input buffer passed in, so we don't have to worry + // about bytes left over in the front block with more input remaining. + return BrotliDecodeResult::NeedInput; + case BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: + return BrotliDecodeResult::MoreOutput; + } + } + + private: + IOVector input_buffer_; + std::span output_buffer_; + std::unique_ptr decoder_; +}; + +enum class BrotliEncodeResult { + Error, + Done, + NeedInput, + MoreOutput, +}; + +template +struct BrotliEncoder { + explicit BrotliEncoder() + : output_block_(OutputBlockSize), + output_bytes_left_(OutputBlockSize), + encoder_(BrotliEncoderCreateInstance(nullptr, nullptr, nullptr), + BrotliEncoderDestroyInstance) { + BrotliEncoderSetParameter(encoder_.get(), BROTLI_PARAM_QUALITY, 1); + } + + void Append(Block input) { input_buffer_.append(std::move(input)); } + void Finish() { finished_ = true; } + + BrotliEncodeResult Encode(Block* output) { + output->clear(); + while (true) { + size_t available_in = input_buffer_.front_size(); + const uint8_t* next_in = reinterpret_cast(input_buffer_.front_data()); + + size_t available_out = output_bytes_left_; + uint8_t* next_out = reinterpret_cast(output_block_.data() + + (OutputBlockSize - output_bytes_left_)); + + BrotliEncoderOperation op = BROTLI_OPERATION_PROCESS; + if (finished_) { + op = BROTLI_OPERATION_FINISH; + } + + if (!BrotliEncoderCompressStream(encoder_.get(), op, &available_in, &next_in, + &available_out, &next_out, nullptr)) { + return BrotliEncodeResult::Error; + } + + size_t bytes_consumed = input_buffer_.front_size() - available_in; + input_buffer_.drop_front(bytes_consumed); + + output_bytes_left_ = available_out; + + if (BrotliEncoderIsFinished(encoder_.get())) { + output_block_.resize(OutputBlockSize - output_bytes_left_); + *output = std::move(output_block_); + return BrotliEncodeResult::Done; + } else if (output_bytes_left_ == 0) { + *output = std::move(output_block_); + output_block_.resize(OutputBlockSize); + output_bytes_left_ = OutputBlockSize; + return BrotliEncodeResult::MoreOutput; + } else if (input_buffer_.empty()) { + return BrotliEncodeResult::NeedInput; + } + } + } + + private: + bool finished_ = false; + IOVector input_buffer_; + Block output_block_; + size_t output_bytes_left_; + std::unique_ptr encoder_; +}; diff --git a/adb/client/adb_install.cpp b/adb/client/adb_install.cpp index 21b8f4999..fe9182eb7 100644 --- a/adb/client/adb_install.cpp +++ b/adb/client/adb_install.cpp @@ -286,7 +286,7 @@ static int install_app_legacy(int argc, const char** argv, bool use_fastdeploy) } } - if (do_sync_push(apk_file, apk_dest.c_str(), false)) { + if (do_sync_push(apk_file, apk_dest.c_str(), false, true)) { result = pm_command(argc, argv); delete_device_file(apk_dest); } diff --git a/adb/client/commandline.cpp b/adb/client/commandline.cpp index 2199fd3a9..ad4e21c4d 100644 --- a/adb/client/commandline.cpp +++ b/adb/client/commandline.cpp @@ -126,15 +126,21 @@ static void help() { " reverse --remove-all remove all reverse socket connections from device\n" "\n" "file transfer:\n" - " push [--sync] LOCAL... REMOTE\n" + " push [--sync] [-zZ] LOCAL... REMOTE\n" " copy local files/directories to device\n" " --sync: only push files that are newer on the host than the device\n" - " pull [-a] REMOTE... LOCAL\n" + " -z: enable compression\n" + " -Z: disable compression\n" + " pull [-azZ] REMOTE... LOCAL\n" " copy files/dirs from device\n" " -a: preserve file timestamp and mode\n" - " sync [all|data|odm|oem|product|system|system_ext|vendor]\n" + " -z: enable compression\n" + " -Z: disable compression\n" + " sync [-lzZ] [all|data|odm|oem|product|system|system_ext|vendor]\n" " sync a local build from $ANDROID_PRODUCT_OUT to the device (default all)\n" " -l: list files that would be copied, but don't copy them\n" + " -z: enable compression\n" + " -Z: disable compression\n" "\n" "shell:\n" " shell [-e ESCAPE] [-n] [-Tt] [-x] [COMMAND...]\n" @@ -1321,8 +1327,12 @@ static int restore(int argc, const char** argv) { } static void parse_push_pull_args(const char** arg, int narg, std::vector* srcs, - const char** dst, bool* copy_attrs, bool* sync) { + const char** dst, bool* copy_attrs, bool* sync, bool* compressed) { *copy_attrs = false; + const char* adb_compression = getenv("ADB_COMPRESSION"); + if (adb_compression && strcmp(adb_compression, "0") == 0) { + *compressed = false; + } srcs->clear(); bool ignore_flags = false; @@ -1334,6 +1344,14 @@ static void parse_push_pull_args(const char** arg, int narg, std::vector srcs; const char* dst = nullptr; - parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, ©_attrs, &sync); + parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, ©_attrs, &sync, &compressed); if (srcs.empty() || !dst) error_exit("push requires an argument"); - return do_sync_push(srcs, dst, sync) ? 0 : 1; + return do_sync_push(srcs, dst, sync, compressed) ? 0 : 1; } else if (!strcmp(argv[0], "pull")) { bool copy_attrs = false; + bool compressed = true; std::vector srcs; const char* dst = "."; - parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, ©_attrs, nullptr); + parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, ©_attrs, nullptr, &compressed); if (srcs.empty()) error_exit("pull requires an argument"); - return do_sync_pull(srcs, dst, copy_attrs) ? 0 : 1; + return do_sync_pull(srcs, dst, copy_attrs, compressed) ? 0 : 1; } else if (!strcmp(argv[0], "install")) { if (argc < 2) error_exit("install requires an argument"); return install_app(argc, argv); @@ -1885,18 +1905,38 @@ int adb_commandline(int argc, const char** argv) { } else if (!strcmp(argv[0], "sync")) { std::string src; bool list_only = false; - if (argc < 2) { - // No partition specified: sync all of them. - } else if (argc >= 2 && strcmp(argv[1], "-l") == 0) { - list_only = true; - if (argc == 3) src = argv[2]; - } else if (argc == 2) { - src = argv[1]; - } else { - error_exit("usage: adb sync [-l] [PARTITION]"); + bool compressed = true; + + const char* adb_compression = getenv("ADB_COMPRESSION"); + if (adb_compression && strcmp(adb_compression, "0") == 0) { + compressed = false; + } + + int opt; + while ((opt = getopt(argc, const_cast(argv), "lzZ")) != -1) { + switch (opt) { + case 'l': + list_only = true; + break; + case 'z': + compressed = true; + break; + case 'Z': + compressed = false; + break; + default: + error_exit("usage: adb sync [-lzZ] [PARTITION]"); + } + } + + if (optind == argc) { + src = "all"; + } else if (optind + 1 == argc) { + src = argv[optind]; + } else { + error_exit("usage: adb sync [-lzZ] [PARTITION]"); } - if (src.empty()) src = "all"; std::vector partitions{"data", "odm", "oem", "product", "system", "system_ext", "vendor"}; bool found = false; @@ -1905,7 +1945,7 @@ int adb_commandline(int argc, const char** argv) { std::string src_dir{product_file(partition)}; if (!directory_exists(src_dir)) continue; found = true; - if (!do_sync_sync(src_dir, "/" + partition, list_only)) return 1; + if (!do_sync_sync(src_dir, "/" + partition, list_only, compressed)) return 1; } } if (!found) error_exit("don't know how to sync %s partition", src.c_str()); diff --git a/adb/client/fastdeploy.cpp b/adb/client/fastdeploy.cpp index c5fc12f0a..de82e14e5 100644 --- a/adb/client/fastdeploy.cpp +++ b/adb/client/fastdeploy.cpp @@ -112,7 +112,7 @@ static void push_to_device(const void* data, size_t byte_count, const char* dst, // but can't be removed until after the push. unix_close(tf.release()); - if (!do_sync_push(srcs, dst, sync)) { + if (!do_sync_push(srcs, dst, sync, true)) { error_exit("Failed to push fastdeploy agent to device."); } } diff --git a/adb/client/file_sync_client.cpp b/adb/client/file_sync_client.cpp index ed4a1fec3..190c23539 100644 --- a/adb/client/file_sync_client.cpp +++ b/adb/client/file_sync_client.cpp @@ -42,6 +42,7 @@ #include "adb_client.h" #include "adb_io.h" #include "adb_utils.h" +#include "brotli_utils.h" #include "file_sync_protocol.h" #include "line_printer.h" #include "sysdeps/errno.h" @@ -233,6 +234,8 @@ class SyncConnection { } else { have_stat_v2_ = CanUseFeature(features_, kFeatureStat2); have_ls_v2_ = CanUseFeature(features_, kFeatureLs2); + have_sendrecv_v2_ = CanUseFeature(features_, kFeatureSendRecv2); + have_sendrecv_v2_brotli_ = CanUseFeature(features_, kFeatureSendRecv2Brotli); fd.reset(adb_connect("sync:", &error)); if (fd < 0) { Error("connect failed: %s", error.c_str()); @@ -256,6 +259,9 @@ class SyncConnection { line_printer_.KeepInfoLine(); } + bool HaveSendRecv2() const { return have_sendrecv_v2_; } + bool HaveSendRecv2Brotli() const { return have_sendrecv_v2_brotli_; } + const FeatureSet& Features() const { return features_; } bool IsValid() { return fd >= 0; } @@ -314,6 +320,62 @@ class SyncConnection { req->path_length = path.length(); char* data = reinterpret_cast(req + 1); memcpy(data, path.data(), path.length()); + return WriteFdExactly(fd, buf.data(), buf.size()); + } + + bool SendSend2(std::string_view path, mode_t mode, bool compressed) { + if (path.length() > 1024) { + Error("SendRequest failed: path too long: %zu", path.length()); + errno = ENAMETOOLONG; + return false; + } + + Block buf; + + SyncRequest req; + req.id = ID_SEND_V2; + req.path_length = path.length(); + + syncmsg msg; + msg.send_v2_setup.id = ID_SEND_V2; + msg.send_v2_setup.mode = mode; + msg.send_v2_setup.flags = compressed ? kSyncFlagBrotli : kSyncFlagNone; + + buf.resize(sizeof(SyncRequest) + path.length() + sizeof(msg.send_v2_setup)); + + void* p = buf.data(); + + p = mempcpy(p, &req, sizeof(SyncRequest)); + p = mempcpy(p, path.data(), path.length()); + p = mempcpy(p, &msg.send_v2_setup, sizeof(msg.send_v2_setup)); + + return WriteFdExactly(fd, buf.data(), buf.size()); + } + + bool SendRecv2(const std::string& path) { + if (path.length() > 1024) { + Error("SendRequest failed: path too long: %zu", path.length()); + errno = ENAMETOOLONG; + return false; + } + + Block buf; + + SyncRequest req; + req.id = ID_RECV_V2; + req.path_length = path.length(); + + syncmsg msg; + msg.recv_v2_setup.id = ID_RECV_V2; + msg.recv_v2_setup.flags = kSyncFlagBrotli; + + buf.resize(sizeof(SyncRequest) + path.length() + sizeof(msg.recv_v2_setup)); + + void* p = buf.data(); + + p = mempcpy(p, &req, sizeof(SyncRequest)); + p = mempcpy(p, path.data(), path.length()); + p = mempcpy(p, &msg.recv_v2_setup, sizeof(msg.recv_v2_setup)); return WriteFdExactly(fd, buf.data(), buf.size()); } @@ -370,8 +432,8 @@ class SyncConnection { } if (msg.stat_v1.id != ID_LSTAT_V1) { - PLOG(FATAL) << "protocol fault: stat response has wrong message id: " - << msg.stat_v1.id; + LOG(FATAL) << "protocol fault: stat response has wrong message id: " + << msg.stat_v1.id; } if (msg.stat_v1.mode == 0 && msg.stat_v1.size == 0 && msg.stat_v1.mtime == 0) { @@ -445,7 +507,7 @@ class SyncConnection { char* p = &buf[0]; SyncRequest* req_send = reinterpret_cast(p); - req_send->id = ID_SEND; + req_send->id = ID_SEND_V1; req_send->path_length = path_and_mode.length(); p += sizeof(SyncRequest); memcpy(p, path_and_mode.data(), path_and_mode.size()); @@ -471,11 +533,92 @@ class SyncConnection { return true; } + bool SendLargeFileCompressed(const std::string& path, mode_t mode, const std::string& lpath, + const std::string& rpath, unsigned mtime) { + if (!SendSend2(path, mode, true)) { + Error("failed to send ID_SEND_V2 message '%s': %s", path.c_str(), strerror(errno)); + return false; + } + + struct stat st; + if (stat(lpath.c_str(), &st) == -1) { + Error("cannot stat '%s': %s", lpath.c_str(), strerror(errno)); + return false; + } + + uint64_t total_size = st.st_size; + uint64_t bytes_copied = 0; + + unique_fd lfd(adb_open(lpath.c_str(), O_RDONLY | O_CLOEXEC)); + if (lfd < 0) { + Error("opening '%s' locally failed: %s", lpath.c_str(), strerror(errno)); + return false; + } + + syncsendbuf sbuf; + sbuf.id = ID_DATA; + + BrotliEncoder encoder; + bool sending = true; + while (sending) { + Block input(SYNC_DATA_MAX); + int r = adb_read(lfd.get(), input.data(), input.size()); + if (r < 0) { + Error("reading '%s' locally failed: %s", lpath.c_str(), strerror(errno)); + return false; + } + + if (r == 0) { + encoder.Finish(); + } else { + input.resize(r); + encoder.Append(std::move(input)); + RecordBytesTransferred(r); + bytes_copied += r; + ReportProgress(rpath, bytes_copied, total_size); + } + + while (true) { + Block output; + BrotliEncodeResult result = encoder.Encode(&output); + if (result == BrotliEncodeResult::Error) { + Error("compressing '%s' locally failed", lpath.c_str()); + return false; + } + + if (!output.empty()) { + sbuf.size = output.size(); + memcpy(sbuf.data, output.data(), output.size()); + WriteOrDie(lpath, rpath, &sbuf, sizeof(SyncRequest) + output.size()); + } + + if (result == BrotliEncodeResult::Done) { + sending = false; + break; + } else if (result == BrotliEncodeResult::NeedInput) { + break; + } else if (result == BrotliEncodeResult::MoreOutput) { + continue; + } + } + } + + syncmsg msg; + msg.data.id = ID_DONE; + msg.data.size = mtime; + RecordFileSent(lpath, rpath); + return WriteOrDie(lpath, rpath, &msg.data, sizeof(msg.data)); + } + bool SendLargeFile(const std::string& path, mode_t mode, const std::string& lpath, - const std::string& rpath, unsigned mtime) { + const std::string& rpath, unsigned mtime, bool compressed) { + if (compressed && HaveSendRecv2Brotli()) { + return SendLargeFileCompressed(path, mode, lpath, rpath, mtime); + } + std::string path_and_mode = android::base::StringPrintf("%s,%d", path.c_str(), mode); - if (!SendRequest(ID_SEND, path_and_mode)) { - Error("failed to send ID_SEND message '%s': %s", path_and_mode.c_str(), + if (!SendRequest(ID_SEND_V1, path_and_mode.c_str())) { + Error("failed to send ID_SEND_V1 message '%s': %s", path_and_mode.c_str(), strerror(errno)); return false; } @@ -489,7 +632,7 @@ class SyncConnection { uint64_t total_size = st.st_size; uint64_t bytes_copied = 0; - unique_fd lfd(adb_open(lpath.c_str(), O_RDONLY)); + unique_fd lfd(adb_open(lpath.c_str(), O_RDONLY | O_CLOEXEC)); if (lfd < 0) { Error("opening '%s' locally failed: %s", lpath.c_str(), strerror(errno)); return false; @@ -497,8 +640,9 @@ class SyncConnection { syncsendbuf sbuf; sbuf.id = ID_DATA; + while (true) { - int bytes_read = adb_read(lfd, sbuf.data, max - sizeof(SyncRequest)); + int bytes_read = adb_read(lfd, sbuf.data, max); if (bytes_read == -1) { Error("reading '%s' locally failed: %s", lpath.c_str(), strerror(errno)); return false; @@ -511,7 +655,6 @@ class SyncConnection { RecordBytesTransferred(bytes_read); bytes_copied += bytes_read; - ReportProgress(rpath, bytes_copied, total_size); } @@ -695,6 +838,8 @@ class SyncConnection { FeatureSet features_; bool have_stat_v2_; bool have_ls_v2_; + bool have_sendrecv_v2_; + bool have_sendrecv_v2_brotli_; TransferLedger global_ledger_; TransferLedger current_ledger_; @@ -776,7 +921,7 @@ static bool sync_stat_fallback(SyncConnection& sc, const std::string& path, stru } static bool sync_send(SyncConnection& sc, const std::string& lpath, const std::string& rpath, - unsigned mtime, mode_t mode, bool sync) { + unsigned mtime, mode_t mode, bool sync, bool compressed) { if (sync) { struct stat st; if (sync_lstat(sc, rpath, &st)) { @@ -819,16 +964,16 @@ static bool sync_send(SyncConnection& sc, const std::string& lpath, const std::s return false; } } else { - if (!sc.SendLargeFile(rpath, mode, lpath, rpath, mtime)) { + if (!sc.SendLargeFile(rpath, mode, lpath, rpath, mtime, compressed)) { return false; } } return sc.ReadAcknowledgements(); } -static bool sync_recv(SyncConnection& sc, const char* rpath, const char* lpath, - const char* name, uint64_t expected_size) { - if (!sc.SendRequest(ID_RECV, rpath)) return false; +static bool sync_recv_v1(SyncConnection& sc, const char* rpath, const char* lpath, const char* name, + uint64_t expected_size) { + if (!sc.SendRequest(ID_RECV_V1, rpath)) return false; adb_unlink(lpath); unique_fd lfd(adb_creat(lpath, 0644)); @@ -881,6 +1026,114 @@ static bool sync_recv(SyncConnection& sc, const char* rpath, const char* lpath, return true; } +static bool sync_recv_v2(SyncConnection& sc, const char* rpath, const char* lpath, const char* name, + uint64_t expected_size) { + if (!sc.SendRecv2(rpath)) return false; + + adb_unlink(lpath); + unique_fd lfd(adb_creat(lpath, 0644)); + if (lfd < 0) { + sc.Error("cannot create '%s': %s", lpath, strerror(errno)); + return false; + } + + uint64_t bytes_copied = 0; + + Block buffer(SYNC_DATA_MAX); + BrotliDecoder decoder(std::span(buffer.data(), buffer.size())); + bool reading = true; + while (reading) { + syncmsg msg; + if (!ReadFdExactly(sc.fd, &msg.data, sizeof(msg.data))) { + adb_unlink(lpath); + return false; + } + + if (msg.data.id == ID_DONE) { + adb_unlink(lpath); + sc.Error("unexpected ID_DONE"); + return false; + } + + if (msg.data.id != ID_DATA) { + adb_unlink(lpath); + sc.ReportCopyFailure(rpath, lpath, msg); + return false; + } + + if (msg.data.size > sc.max) { + sc.Error("msg.data.size too large: %u (max %zu)", msg.data.size, sc.max); + adb_unlink(lpath); + return false; + } + + Block block(msg.data.size); + if (!ReadFdExactly(sc.fd, block.data(), msg.data.size)) { + adb_unlink(lpath); + return false; + } + decoder.Append(std::move(block)); + + while (true) { + std::span output; + BrotliDecodeResult result = decoder.Decode(&output); + + if (result == BrotliDecodeResult::Error) { + sc.Error("decompress failed"); + adb_unlink(lpath); + return false; + } + + if (!output.empty()) { + if (!WriteFdExactly(lfd, output.data(), output.size())) { + sc.Error("cannot write '%s': %s", lpath, strerror(errno)); + adb_unlink(lpath); + return false; + } + } + + bytes_copied += output.size(); + + sc.RecordBytesTransferred(msg.data.size); + sc.ReportProgress(name != nullptr ? name : rpath, bytes_copied, expected_size); + + if (result == BrotliDecodeResult::NeedInput) { + break; + } else if (result == BrotliDecodeResult::MoreOutput) { + continue; + } else if (result == BrotliDecodeResult::Done) { + reading = false; + break; + } else { + LOG(FATAL) << "invalid BrotliDecodeResult: " << static_cast(result); + } + } + } + + syncmsg msg; + if (!ReadFdExactly(sc.fd, &msg.data, sizeof(msg.data))) { + sc.Error("failed to read ID_DONE"); + return false; + } + + if (msg.data.id != ID_DONE) { + sc.Error("unexpected message after transfer: id = %d (expected ID_DONE)", msg.data.id); + return false; + } + + sc.RecordFilesTransferred(1); + return true; +} + +static bool sync_recv(SyncConnection& sc, const char* rpath, const char* lpath, const char* name, + uint64_t expected_size, bool compressed) { + if (sc.HaveSendRecv2() && compressed) { + return sync_recv_v2(sc, rpath, lpath, name, expected_size); + } else { + return sync_recv_v1(sc, rpath, lpath, name, expected_size); + } +} + bool do_sync_ls(const char* path) { SyncConnection sc; if (!sc.IsValid()) return false; @@ -956,9 +1209,8 @@ static bool is_root_dir(std::string_view path) { return true; } -static bool copy_local_dir_remote(SyncConnection& sc, std::string lpath, - std::string rpath, bool check_timestamps, - bool list_only) { +static bool copy_local_dir_remote(SyncConnection& sc, std::string lpath, std::string rpath, + bool check_timestamps, bool list_only, bool compressed) { sc.NewTransfer(); // Make sure that both directory paths end in a slash. @@ -1040,7 +1292,7 @@ static bool copy_local_dir_remote(SyncConnection& sc, std::string lpath, if (list_only) { sc.Println("would push: %s -> %s", ci.lpath.c_str(), ci.rpath.c_str()); } else { - if (!sync_send(sc, ci.lpath, ci.rpath, ci.time, ci.mode, false)) { + if (!sync_send(sc, ci.lpath, ci.rpath, ci.time, ci.mode, false, compressed)) { return false; } } @@ -1055,7 +1307,8 @@ static bool copy_local_dir_remote(SyncConnection& sc, std::string lpath, return success; } -bool do_sync_push(const std::vector& srcs, const char* dst, bool sync) { +bool do_sync_push(const std::vector& srcs, const char* dst, bool sync, + bool compressed) { SyncConnection sc; if (!sc.IsValid()) return false; @@ -1120,7 +1373,7 @@ bool do_sync_push(const std::vector& srcs, const char* dst, bool sy dst_dir.append(android::base::Basename(src_path)); } - success &= copy_local_dir_remote(sc, src_path, dst_dir, sync, false); + success &= copy_local_dir_remote(sc, src_path, dst_dir, sync, false, compressed); continue; } else if (!should_push_file(st.st_mode)) { sc.Warning("skipping special file '%s' (mode = 0o%o)", src_path, st.st_mode); @@ -1141,7 +1394,7 @@ bool do_sync_push(const std::vector& srcs, const char* dst, bool sy sc.NewTransfer(); sc.SetExpectedTotalBytes(st.st_size); - success &= sync_send(sc, src_path, dst_path, st.st_mtime, st.st_mode, sync); + success &= sync_send(sc, src_path, dst_path, st.st_mtime, st.st_mode, sync, compressed); sc.ReportTransferRate(src_path, TransferDirection::push); } @@ -1226,8 +1479,8 @@ static int set_time_and_mode(const std::string& lpath, time_t time, return r1 ? r1 : r2; } -static bool copy_remote_dir_local(SyncConnection& sc, std::string rpath, - std::string lpath, bool copy_attrs) { +static bool copy_remote_dir_local(SyncConnection& sc, std::string rpath, std::string lpath, + bool copy_attrs, bool compressed) { sc.NewTransfer(); // Make sure that both directory paths end in a slash. @@ -1257,7 +1510,7 @@ static bool copy_remote_dir_local(SyncConnection& sc, std::string rpath, continue; } - if (!sync_recv(sc, ci.rpath.c_str(), ci.lpath.c_str(), nullptr, ci.size)) { + if (!sync_recv(sc, ci.rpath.c_str(), ci.lpath.c_str(), nullptr, ci.size, compressed)) { return false; } @@ -1274,8 +1527,8 @@ static bool copy_remote_dir_local(SyncConnection& sc, std::string rpath, return true; } -bool do_sync_pull(const std::vector& srcs, const char* dst, - bool copy_attrs, const char* name) { +bool do_sync_pull(const std::vector& srcs, const char* dst, bool copy_attrs, + bool compressed, const char* name) { SyncConnection sc; if (!sc.IsValid()) return false; @@ -1349,7 +1602,7 @@ bool do_sync_pull(const std::vector& srcs, const char* dst, dst_dir.append(android::base::Basename(src_path)); } - success &= copy_remote_dir_local(sc, src_path, dst_dir, copy_attrs); + success &= copy_remote_dir_local(sc, src_path, dst_dir, copy_attrs, compressed); continue; } else if (!should_pull_file(src_st.st_mode)) { sc.Warning("skipping special file '%s' (mode = 0o%o)", src_path, src_st.st_mode); @@ -1368,7 +1621,7 @@ bool do_sync_pull(const std::vector& srcs, const char* dst, sc.NewTransfer(); sc.SetExpectedTotalBytes(src_st.st_size); - if (!sync_recv(sc, src_path, dst_path, name, src_st.st_size)) { + if (!sync_recv(sc, src_path, dst_path, name, src_st.st_size, compressed)) { success = false; continue; } @@ -1384,11 +1637,12 @@ bool do_sync_pull(const std::vector& srcs, const char* dst, return success; } -bool do_sync_sync(const std::string& lpath, const std::string& rpath, bool list_only) { +bool do_sync_sync(const std::string& lpath, const std::string& rpath, bool list_only, + bool compressed) { SyncConnection sc; if (!sc.IsValid()) return false; - bool success = copy_local_dir_remote(sc, lpath, rpath, true, list_only); + bool success = copy_local_dir_remote(sc, lpath, rpath, true, list_only, compressed); if (!list_only) { sc.ReportOverallTransferRate(TransferDirection::push); } diff --git a/adb/client/file_sync_client.h b/adb/client/file_sync_client.h index df7f14ce4..de3f19245 100644 --- a/adb/client/file_sync_client.h +++ b/adb/client/file_sync_client.h @@ -20,8 +20,10 @@ #include bool do_sync_ls(const char* path); -bool do_sync_push(const std::vector& srcs, const char* dst, bool sync); +bool do_sync_push(const std::vector& srcs, const char* dst, bool sync, + bool compressed); bool do_sync_pull(const std::vector& srcs, const char* dst, bool copy_attrs, - const char* name = nullptr); + bool compressed, const char* name = nullptr); -bool do_sync_sync(const std::string& lpath, const std::string& rpath, bool list_only); +bool do_sync_sync(const std::string& lpath, const std::string& rpath, bool list_only, + bool compressed); diff --git a/adb/daemon/file_sync_service.cpp b/adb/daemon/file_sync_service.cpp index edf5683d3..07f6e65e8 100644 --- a/adb/daemon/file_sync_service.cpp +++ b/adb/daemon/file_sync_service.cpp @@ -32,6 +32,8 @@ #include #include +#include +#include #include #include @@ -55,10 +57,12 @@ #include "adb_io.h" #include "adb_trace.h" #include "adb_utils.h" +#include "brotli_utils.h" #include "file_sync_protocol.h" #include "security_log_tags.h" #include "sysdeps/errno.h" +using android::base::borrowed_fd; using android::base::Dirname; using android::base::StringPrintf; @@ -249,7 +253,7 @@ static bool do_list_v2(int s, const char* path) { // Make sure that SendFail from adb_io.cpp isn't accidentally used in this file. #pragma GCC poison SendFail -static bool SendSyncFail(int fd, const std::string& reason) { +static bool SendSyncFail(borrowed_fd fd, const std::string& reason) { D("sync: failure: %s", reason.c_str()); syncmsg msg; @@ -258,13 +262,89 @@ static bool SendSyncFail(int fd, const std::string& reason) { return WriteFdExactly(fd, &msg.data, sizeof(msg.data)) && WriteFdExactly(fd, reason); } -static bool SendSyncFailErrno(int fd, const std::string& reason) { +static bool SendSyncFailErrno(borrowed_fd fd, const std::string& reason) { return SendSyncFail(fd, StringPrintf("%s: %s", reason.c_str(), strerror(errno))); } -static bool handle_send_file(int s, const char* path, uint32_t* timestamp, uid_t uid, gid_t gid, - uint64_t capabilities, mode_t mode, std::vector& buffer, - bool do_unlink) { +static bool handle_send_file_compressed(borrowed_fd s, unique_fd fd, uint32_t* timestamp) { + syncmsg msg; + Block decode_buffer(SYNC_DATA_MAX); + BrotliDecoder decoder(std::span(decode_buffer.data(), decode_buffer.size())); + while (true) { + if (!ReadFdExactly(s, &msg.data, sizeof(msg.data))) return false; + + if (msg.data.id != ID_DATA) { + if (msg.data.id == ID_DONE) { + *timestamp = msg.data.size; + return true; + } + SendSyncFail(s, "invalid data message"); + return false; + } + + Block block(msg.data.size); + if (!ReadFdExactly(s, block.data(), msg.data.size)) return false; + decoder.Append(std::move(block)); + + while (true) { + std::span output; + BrotliDecodeResult result = decoder.Decode(&output); + if (result == BrotliDecodeResult::Error) { + SendSyncFailErrno(s, "decompress failed"); + return false; + } + + if (!WriteFdExactly(fd, output.data(), output.size())) { + SendSyncFailErrno(s, "write failed"); + return false; + } + + if (result == BrotliDecodeResult::NeedInput) { + break; + } else if (result == BrotliDecodeResult::MoreOutput) { + continue; + } else if (result == BrotliDecodeResult::Done) { + break; + } else { + LOG(FATAL) << "invalid BrotliDecodeResult: " << static_cast(result); + } + } + } + + __builtin_unreachable(); +} + +static bool handle_send_file_uncompressed(borrowed_fd s, unique_fd fd, uint32_t* timestamp, + std::vector& buffer) { + syncmsg msg; + + while (true) { + if (!ReadFdExactly(s, &msg.data, sizeof(msg.data))) return false; + + if (msg.data.id != ID_DATA) { + if (msg.data.id == ID_DONE) { + *timestamp = msg.data.size; + return true; + } + SendSyncFail(s, "invalid data message"); + return false; + } + + if (msg.data.size > buffer.size()) { // TODO: resize buffer? + SendSyncFail(s, "oversize data message"); + return false; + } + if (!ReadFdExactly(s, &buffer[0], msg.data.size)) return false; + if (!WriteFdExactly(fd, &buffer[0], msg.data.size)) { + SendSyncFailErrno(s, "write failed"); + return false; + } + } +} + +static bool handle_send_file(borrowed_fd s, const char* path, uint32_t* timestamp, uid_t uid, + gid_t gid, uint64_t capabilities, mode_t mode, bool compressed, + std::vector& buffer, bool do_unlink) { int rc; syncmsg msg; @@ -302,45 +382,33 @@ static bool handle_send_file(int s, const char* path, uint32_t* timestamp, uid_t fchmod(fd.get(), mode); } - rc = posix_fadvise(fd.get(), 0, 0, - POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE | POSIX_FADV_WILLNEED); - if (rc != 0) { - D("[ Failed to fadvise: %s ]", strerror(rc)); - } - - while (true) { - if (!ReadFdExactly(s, &msg.data, sizeof(msg.data))) goto fail; - - if (msg.data.id != ID_DATA) { - if (msg.data.id == ID_DONE) { - *timestamp = msg.data.size; - break; - } - SendSyncFail(s, "invalid data message"); - goto abort; + { + rc = posix_fadvise(fd.get(), 0, 0, + POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE | POSIX_FADV_WILLNEED); + if (rc != 0) { + D("[ Failed to fadvise: %s ]", strerror(rc)); } - if (msg.data.size > buffer.size()) { // TODO: resize buffer? - SendSyncFail(s, "oversize data message"); - goto abort; + bool result; + if (compressed) { + result = handle_send_file_compressed(s, std::move(fd), timestamp); + } else { + result = handle_send_file_uncompressed(s, std::move(fd), timestamp, buffer); } - if (!ReadFdExactly(s, &buffer[0], msg.data.size)) goto abort; - - if (!WriteFdExactly(fd.get(), &buffer[0], msg.data.size)) { - SendSyncFailErrno(s, "write failed"); + if (!result) { goto fail; } - } - if (!update_capabilities(path, capabilities)) { - SendSyncFailErrno(s, "update_capabilities failed"); - goto fail; - } + if (!update_capabilities(path, capabilities)) { + SendSyncFailErrno(s, "update_capabilities failed"); + goto fail; + } - msg.status.id = ID_OKAY; - msg.status.msglen = 0; - return WriteFdExactly(s, &msg.status, sizeof(msg.status)); + msg.status.id = ID_OKAY; + msg.status.msglen = 0; + return WriteFdExactly(s, &msg.status, sizeof(msg.status)); + } fail: // If there's a problem on the device, we'll send an ID_FAIL message and @@ -371,7 +439,6 @@ fail: if (!ReadFdExactly(s, &buffer[0], msg.data.size)) break; } -abort: if (do_unlink) adb_unlink(path); return false; } @@ -432,23 +499,8 @@ static bool handle_send_link(int s, const std::string& path, uint32_t* timestamp } #endif -static bool do_send(int s, const std::string& spec, std::vector& buffer) { - // 'spec' is of the form "/some/path,0755". Break it up. - size_t comma = spec.find_last_of(','); - if (comma == std::string::npos) { - SendSyncFail(s, "missing , in ID_SEND"); - return false; - } - - std::string path = spec.substr(0, comma); - - errno = 0; - mode_t mode = strtoul(spec.substr(comma + 1).c_str(), nullptr, 0); - if (errno != 0) { - SendSyncFail(s, "bad mode"); - return false; - } - +static bool send_impl(int s, const std::string& path, mode_t mode, bool compressed, + std::vector& buffer) { // Don't delete files before copying if they are not "regular" or symlinks. struct stat st; bool do_unlink = (lstat(path.c_str(), &st) == -1) || S_ISREG(st.st_mode) || @@ -474,8 +526,8 @@ static bool do_send(int s, const std::string& spec, std::vector& buffer) { adbd_fs_config(path.c_str(), 0, nullptr, &uid, &gid, &mode, &capabilities); } - result = handle_send_file(s, path.c_str(), ×tamp, uid, gid, capabilities, mode, buffer, - do_unlink); + result = handle_send_file(s, path.c_str(), ×tamp, uid, gid, capabilities, mode, + compressed, buffer, do_unlink); } if (!result) { @@ -491,7 +543,125 @@ static bool do_send(int s, const std::string& spec, std::vector& buffer) { return true; } -static bool do_recv(int s, const char* path, std::vector& buffer) { +static bool do_send_v1(int s, const std::string& spec, std::vector& buffer) { + // 'spec' is of the form "/some/path,0755". Break it up. + size_t comma = spec.find_last_of(','); + if (comma == std::string::npos) { + SendSyncFail(s, "missing , in ID_SEND_V1"); + return false; + } + + std::string path = spec.substr(0, comma); + + errno = 0; + mode_t mode = strtoul(spec.substr(comma + 1).c_str(), nullptr, 0); + if (errno != 0) { + SendSyncFail(s, "bad mode"); + return false; + } + + return send_impl(s, path, mode, false, buffer); +} + +static bool do_send_v2(int s, const std::string& path, std::vector& buffer) { + // Read the setup packet. + syncmsg msg; + int rc = ReadFdExactly(s, &msg.send_v2_setup, sizeof(msg.send_v2_setup)); + if (rc == 0) { + LOG(ERROR) << "failed to read send_v2 setup packet: EOF"; + return false; + } else if (rc < 0) { + PLOG(ERROR) << "failed to read send_v2 setup packet"; + } + + bool compressed = false; + if (msg.send_v2_setup.flags & kSyncFlagBrotli) { + msg.send_v2_setup.flags &= ~kSyncFlagBrotli; + compressed = true; + } + if (msg.send_v2_setup.flags) { + SendSyncFail(s, android::base::StringPrintf("unknown flags: %d", msg.send_v2_setup.flags)); + return false; + } + + errno = 0; + return send_impl(s, path, msg.send_v2_setup.mode, compressed, buffer); +} + +static bool recv_uncompressed(borrowed_fd s, unique_fd fd, std::vector& buffer) { + syncmsg msg; + msg.data.id = ID_DATA; + std::optional> encoder; + while (true) { + int r = adb_read(fd.get(), &buffer[0], buffer.size() - sizeof(msg.data)); + if (r <= 0) { + if (r == 0) break; + SendSyncFailErrno(s, "read failed"); + return false; + } + msg.data.size = r; + + if (!WriteFdExactly(s, &msg.data, sizeof(msg.data)) || !WriteFdExactly(s, &buffer[0], r)) { + return false; + } + } + + return true; +} + +static bool recv_compressed(borrowed_fd s, unique_fd fd) { + syncmsg msg; + msg.data.id = ID_DATA; + + BrotliEncoder encoder; + + bool sending = true; + while (sending) { + Block input(SYNC_DATA_MAX); + int r = adb_read(fd.get(), input.data(), input.size()); + if (r < 0) { + SendSyncFailErrno(s, "read failed"); + return false; + } + + if (r == 0) { + encoder.Finish(); + } else { + input.resize(r); + encoder.Append(std::move(input)); + } + + while (true) { + Block output; + BrotliEncodeResult result = encoder.Encode(&output); + if (result == BrotliEncodeResult::Error) { + SendSyncFailErrno(s, "compress failed"); + return false; + } + + if (!output.empty()) { + msg.data.size = output.size(); + if (!WriteFdExactly(s, &msg.data, sizeof(msg.data)) || + !WriteFdExactly(s, output.data(), output.size())) { + return false; + } + } + + if (result == BrotliEncodeResult::Done) { + sending = false; + break; + } else if (result == BrotliEncodeResult::NeedInput) { + break; + } else if (result == BrotliEncodeResult::MoreOutput) { + continue; + } + } + } + + return true; +} + +static bool recv_impl(borrowed_fd s, const char* path, bool compressed, std::vector& buffer) { __android_log_security_bswrite(SEC_TAG_ADB_RECV_FILE, path); unique_fd fd(adb_open(path, O_RDONLY | O_CLOEXEC)); @@ -505,26 +675,51 @@ static bool do_recv(int s, const char* path, std::vector& buffer) { D("[ Failed to fadvise: %s ]", strerror(rc)); } - syncmsg msg; - msg.data.id = ID_DATA; - while (true) { - int r = adb_read(fd.get(), &buffer[0], buffer.size() - sizeof(msg.data)); - if (r <= 0) { - if (r == 0) break; - SendSyncFailErrno(s, "read failed"); - return false; - } - msg.data.size = r; - if (!WriteFdExactly(s, &msg.data, sizeof(msg.data)) || !WriteFdExactly(s, &buffer[0], r)) { - return false; - } + bool result; + if (compressed) { + result = recv_compressed(s, std::move(fd)); + } else { + result = recv_uncompressed(s, std::move(fd), buffer); } + if (!result) { + return false; + } + + syncmsg msg; msg.data.id = ID_DONE; msg.data.size = 0; return WriteFdExactly(s, &msg.data, sizeof(msg.data)); } +static bool do_recv_v1(borrowed_fd s, const char* path, std::vector& buffer) { + return recv_impl(s, path, false, buffer); +} + +static bool do_recv_v2(borrowed_fd s, const char* path, std::vector& buffer) { + syncmsg msg; + // Read the setup packet. + int rc = ReadFdExactly(s, &msg.recv_v2_setup, sizeof(msg.recv_v2_setup)); + if (rc == 0) { + LOG(ERROR) << "failed to read recv_v2 setup packet: EOF"; + return false; + } else if (rc < 0) { + PLOG(ERROR) << "failed to read recv_v2 setup packet"; + } + + bool compressed = false; + if (msg.recv_v2_setup.flags & kSyncFlagBrotli) { + msg.recv_v2_setup.flags &= ~kSyncFlagBrotli; + compressed = true; + } + if (msg.recv_v2_setup.flags) { + SendSyncFail(s, android::base::StringPrintf("unknown flags: %d", msg.recv_v2_setup.flags)); + return false; + } + + return recv_impl(s, path, compressed, buffer); +} + static const char* sync_id_to_name(uint32_t id) { switch (id) { case ID_LSTAT_V1: @@ -537,10 +732,14 @@ static const char* sync_id_to_name(uint32_t id) { return "list_v1"; case ID_LIST_V2: return "list_v2"; - case ID_SEND: - return "send"; - case ID_RECV: - return "recv"; + case ID_SEND_V1: + return "send_v1"; + case ID_SEND_V2: + return "send_v2"; + case ID_RECV_V1: + return "recv_v1"; + case ID_RECV_V2: + return "recv_v2"; case ID_QUIT: return "quit"; default: @@ -585,11 +784,17 @@ static bool handle_sync_command(int fd, std::vector& buffer) { case ID_LIST_V2: if (!do_list_v2(fd, name)) return false; break; - case ID_SEND: - if (!do_send(fd, name, buffer)) return false; + case ID_SEND_V1: + if (!do_send_v1(fd, name, buffer)) return false; break; - case ID_RECV: - if (!do_recv(fd, name, buffer)) return false; + case ID_SEND_V2: + if (!do_send_v2(fd, name, buffer)) return false; + break; + case ID_RECV_V1: + if (!do_recv_v1(fd, name, buffer)) return false; + break; + case ID_RECV_V2: + if (!do_recv_v2(fd, name, buffer)) return false; break; case ID_QUIT: return false; diff --git a/adb/file_sync_protocol.h b/adb/file_sync_protocol.h index 87ede0c0c..fd9a5169e 100644 --- a/adb/file_sync_protocol.h +++ b/adb/file_sync_protocol.h @@ -27,8 +27,10 @@ #define ID_DENT_V1 MKID('D', 'E', 'N', 'T') #define ID_DENT_V2 MKID('D', 'N', 'T', '2') -#define ID_SEND MKID('S', 'E', 'N', 'D') -#define ID_RECV MKID('R', 'E', 'C', 'V') +#define ID_SEND_V1 MKID('S', 'E', 'N', 'D') +#define ID_SEND_V2 MKID('S', 'N', 'D', '2') +#define ID_RECV_V1 MKID('R', 'E', 'C', 'V') +#define ID_RECV_V2 MKID('R', 'C', 'V', '2') #define ID_DONE MKID('D', 'O', 'N', 'E') #define ID_DATA MKID('D', 'A', 'T', 'A') #define ID_OKAY MKID('O', 'K', 'A', 'Y') @@ -87,6 +89,26 @@ struct __attribute__((packed)) sync_dent_v2 { uint32_t namelen; }; // followed by `namelen` bytes of the name. +enum SyncFlag : uint32_t { + kSyncFlagNone = 0, + kSyncFlagBrotli = 1, +}; + +// send_v1 sent the path in a buffer, followed by a comma and the mode as a string. +// send_v2 sends just the path in the first request, and then sends another syncmsg (with the +// same ID!) with details. +struct __attribute__((packed)) sync_send_v2 { + uint32_t id; + uint32_t mode; + uint32_t flags; +}; + +// Likewise, recv_v1 just sent the path without any accompanying data. +struct __attribute__((packed)) sync_recv_v2 { + uint32_t id; + uint32_t flags; +}; + struct __attribute__((packed)) sync_data { uint32_t id; uint32_t size; @@ -104,6 +126,8 @@ union syncmsg { sync_dent_v2 dent_v2; sync_data data; sync_status status; + sync_send_v2 send_v2_setup; + sync_recv_v2 recv_v2_setup; }; #define SYNC_DATA_MAX (64 * 1024) diff --git a/adb/transport.cpp b/adb/transport.cpp index b7146b418..460faf0ef 100644 --- a/adb/transport.cpp +++ b/adb/transport.cpp @@ -81,6 +81,8 @@ const char* const kFeatureAbb = "abb"; const char* const kFeatureFixedPushSymlinkTimestamp = "fixed_push_symlink_timestamp"; const char* const kFeatureAbbExec = "abb_exec"; const char* const kFeatureRemountShell = "remount_shell"; +const char* const kFeatureSendRecv2 = "sendrecv_v2"; +const char* const kFeatureSendRecv2Brotli = "sendrecv_v2_brotli"; namespace { @@ -1181,6 +1183,8 @@ const FeatureSet& supported_features() { kFeatureFixedPushSymlinkTimestamp, kFeatureAbbExec, kFeatureRemountShell, + kFeatureSendRecv2, + kFeatureSendRecv2Brotli, // Increment ADB_SERVER_VERSION when adding a feature that adbd needs // to know about. Otherwise, the client can be stuck running an old // version of the server even after upgrading their copy of adb. diff --git a/adb/transport.h b/adb/transport.h index 8a0f62ab5..5d4e2971e 100644 --- a/adb/transport.h +++ b/adb/transport.h @@ -81,7 +81,12 @@ extern const char* const kFeatureAbb; extern const char* const kFeatureAbbExec; // adbd properly updates symlink timestamps on push. extern const char* const kFeatureFixedPushSymlinkTimestamp; +// Implement `adb remount` via shelling out to /system/bin/remount. extern const char* const kFeatureRemountShell; +// adbd supports version 2 of send/recv. +extern const char* const kFeatureSendRecv2; +// adbd supports brotli for send/recv v2. +extern const char* const kFeatureSendRecv2Brotli; TransportId NextTransportId(); diff --git a/adb/types.h b/adb/types.h index c619fffcf..deca7eafb 100644 --- a/adb/types.h +++ b/adb/types.h @@ -150,6 +150,22 @@ struct IOVector { IOVector& operator=(const IOVector& copy) = delete; IOVector& operator=(IOVector&& move) noexcept; + const value_type* front_data() const { + if (chain_.empty()) { + return nullptr; + } + + return chain_.front().data() + begin_offset_; + } + + size_type front_size() const { + if (chain_.empty()) { + return 0; + } + + return chain_.front().size() - begin_offset_; + } + size_type size() const { return chain_length_ - begin_offset_; } bool empty() const { return size() == 0; } From 620e5d48db380dd58ef81adedcbeca3555032f80 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 19 Mar 2020 23:09:45 -0700 Subject: [PATCH 193/388] init: Remove special-case hacks for the super partition. Rather than special-casing super in the uevent listener, call Realpath() after we've generated its symlink. This allows us to generalize the uevent listener code. Also, rename "metadata partition" to "super partition" in a few places, as this terminology is a bit dated. Bug: 150315914 Test: first-stage init boots Change-Id: I2bf3bebf3360f097582df7fba95f3c1753feb2e2 Merged-In: I2bf3bebf3360f097582df7fba95f3c1753feb2e2 --- init/first_stage_mount.cpp | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/init/first_stage_mount.cpp b/init/first_stage_mount.cpp index 622e45716..3451264ab 100644 --- a/init/first_stage_mount.cpp +++ b/init/first_stage_mount.cpp @@ -97,7 +97,7 @@ class FirstStageMount { bool TrySwitchSystemAsRoot(); bool TrySkipMountingPartitions(); bool IsDmLinearEnabled(); - void GetDmLinearMetadataDevice(std::set* devices); + void GetSuperDeviceName(std::set* devices); bool InitDmLinearBackingDevices(const android::fs_mgr::LpMetadata& metadata); void UseDsuIfPresent(); // Reads all fstab.avb_keys from the ramdisk for first-stage mount. @@ -116,7 +116,8 @@ class FirstStageMount { bool dsu_not_on_userdata_ = false; Fstab fstab_; - std::string lp_metadata_partition_; + // The super path is only set after InitDevices, and is invalid before. + std::string super_path_; std::string super_partition_name_; std::unique_ptr device_handler_; UeventListener uevent_listener_; @@ -268,12 +269,23 @@ bool FirstStageMount::DoFirstStageMount() { bool FirstStageMount::InitDevices() { std::set devices; - GetDmLinearMetadataDevice(&devices); + GetSuperDeviceName(&devices); if (!GetDmVerityDevices(&devices)) { return false; } - return InitRequiredDevices(std::move(devices)); + if (!InitRequiredDevices(std::move(devices))) { + return false; + } + + if (IsDmLinearEnabled()) { + auto super_symlink = "/dev/block/by-name/"s + super_partition_name_; + if (!android::base::Realpath(super_symlink, &super_path_)) { + PLOG(ERROR) << "realpath failed: " << super_symlink; + return false; + } + } + return true; } bool FirstStageMount::IsDmLinearEnabled() { @@ -283,7 +295,7 @@ bool FirstStageMount::IsDmLinearEnabled() { return false; } -void FirstStageMount::GetDmLinearMetadataDevice(std::set* devices) { +void FirstStageMount::GetSuperDeviceName(std::set* devices) { // Add any additional devices required for dm-linear mappings. if (!IsDmLinearEnabled()) { return; @@ -375,7 +387,7 @@ bool FirstStageMount::CreateLogicalPartitions() { if (!IsDmLinearEnabled()) { return true; } - if (lp_metadata_partition_.empty()) { + if (super_path_.empty()) { LOG(ERROR) << "Could not locate logical partition tables in partition " << super_partition_name_; return false; @@ -392,19 +404,19 @@ bool FirstStageMount::CreateLogicalPartitions() { if (!InitRequiredDevices({"userdata"})) { return false; } - return sm->CreateLogicalAndSnapshotPartitions(lp_metadata_partition_); + return sm->CreateLogicalAndSnapshotPartitions(super_path_); } } - auto metadata = android::fs_mgr::ReadCurrentMetadata(lp_metadata_partition_); + auto metadata = android::fs_mgr::ReadCurrentMetadata(super_path_); if (!metadata) { - LOG(ERROR) << "Could not read logical partition metadata from " << lp_metadata_partition_; + LOG(ERROR) << "Could not read logical partition metadata from " << super_path_; return false; } if (!InitDmLinearBackingDevices(*metadata.get())) { return false; } - return android::fs_mgr::CreateLogicalPartitions(*metadata.get(), lp_metadata_partition_); + return android::fs_mgr::CreateLogicalPartitions(*metadata.get(), super_path_); } ListenerAction FirstStageMount::HandleBlockDevice(const std::string& name, const Uevent& uevent, @@ -415,10 +427,6 @@ ListenerAction FirstStageMount::HandleBlockDevice(const std::string& name, const auto iter = required_devices->find(name); if (iter != required_devices->end()) { LOG(VERBOSE) << __PRETTY_FUNCTION__ << ": found partition: " << *iter; - if (IsDmLinearEnabled() && name == super_partition_name_) { - std::vector links = device_handler_->GetBlockDeviceSymlinks(uevent); - lp_metadata_partition_ = links[0]; - } required_devices->erase(iter); device_handler_->HandleUevent(uevent); if (required_devices->empty()) { From d8f032ee935539253239d76d9dd5725f549d213e Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 20 Mar 2020 19:38:28 -0700 Subject: [PATCH 194/388] init: Factor out first-stage uevent handling into a separate class. This will make it possible to re-use in second-stage init. Bug: 150315914 Test: first-stage init boots Change-Id: I6a0f13d5c71ab5529a76751f68ac0f15834323d1 Merged-In: I6a0f13d5c71ab5529a76751f68ac0f15834323d1 --- init/Android.bp | 1 + init/Android.mk | 1 + init/block_dev_initializer.cpp | 148 ++++++++++++++++++++++++++++++++ init/block_dev_initializer.h | 41 +++++++++ init/first_stage_mount.cpp | 150 +++------------------------------ 5 files changed, 202 insertions(+), 139 deletions(-) create mode 100644 init/block_dev_initializer.cpp create mode 100644 init/block_dev_initializer.h diff --git a/init/Android.bp b/init/Android.bp index d2bdf9874..9053c390a 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -36,6 +36,7 @@ init_common_sources = [ "util.cpp", ] init_device_sources = [ + "block_dev_initializer.cpp", "bootchart.cpp", "builtins.cpp", "devices.cpp", diff --git a/init/Android.mk b/init/Android.mk index 207b5e765..b49fb3b8b 100644 --- a/init/Android.mk +++ b/init/Android.mk @@ -48,6 +48,7 @@ ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) include $(CLEAR_VARS) LOCAL_CPPFLAGS := $(init_cflags) LOCAL_SRC_FILES := \ + block_dev_initializer.cpp \ devices.cpp \ first_stage_init.cpp \ first_stage_main.cpp \ diff --git a/init/block_dev_initializer.cpp b/init/block_dev_initializer.cpp new file mode 100644 index 000000000..b423f864e --- /dev/null +++ b/init/block_dev_initializer.cpp @@ -0,0 +1,148 @@ +// Copyright (C) 2020 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 +#include +#include +#include + +#include "block_dev_initializer.h" + +namespace android { +namespace init { + +using android::base::Timer; +using namespace std::chrono_literals; + +BlockDevInitializer::BlockDevInitializer() : uevent_listener_(16 * 1024 * 1024) { + auto boot_devices = android::fs_mgr::GetBootDevices(); + device_handler_ = std::make_unique( + std::vector{}, std::vector{}, std::vector{}, + std::move(boot_devices), false); +} + +bool BlockDevInitializer::InitDeviceMapper() { + const std::string dm_path = "/devices/virtual/misc/device-mapper"; + bool found = false; + auto dm_callback = [this, &dm_path, &found](const Uevent& uevent) { + if (uevent.path == dm_path) { + device_handler_->HandleUevent(uevent); + found = true; + return ListenerAction::kStop; + } + return ListenerAction::kContinue; + }; + uevent_listener_.RegenerateUeventsForPath("/sys" + dm_path, dm_callback); + if (!found) { + LOG(INFO) << "device-mapper device not found in /sys, waiting for its uevent"; + Timer t; + uevent_listener_.Poll(dm_callback, 10s); + LOG(INFO) << "Wait for device-mapper returned after " << t; + } + if (!found) { + LOG(ERROR) << "device-mapper device not found after polling timeout"; + return false; + } + return true; +} + +ListenerAction BlockDevInitializer::HandleUevent(const Uevent& uevent, + std::set* devices) { + // Ignore everything that is not a block device. + if (uevent.subsystem != "block") { + return ListenerAction::kContinue; + } + + auto name = uevent.partition_name; + if (name.empty()) { + size_t base_idx = uevent.path.rfind('/'); + if (base_idx == std::string::npos) { + return ListenerAction::kContinue; + } + name = uevent.path.substr(base_idx + 1); + } + + auto iter = devices->find(name); + if (iter == devices->end()) { + return ListenerAction::kContinue; + } + + LOG(VERBOSE) << __PRETTY_FUNCTION__ << ": found partition: " << name; + + devices->erase(iter); + device_handler_->HandleUevent(uevent); + return devices->empty() ? ListenerAction::kStop : ListenerAction::kContinue; +} + +bool BlockDevInitializer::InitDevices(std::set devices) { + auto uevent_callback = [&, this](const Uevent& uevent) -> ListenerAction { + return HandleUevent(uevent, &devices); + }; + uevent_listener_.RegenerateUevents(uevent_callback); + + // UeventCallback() will remove found partitions from |devices|. So if it + // isn't empty here, it means some partitions are not found. + if (!devices.empty()) { + LOG(INFO) << __PRETTY_FUNCTION__ + << ": partition(s) not found in /sys, waiting for their uevent(s): " + << android::base::Join(devices, ", "); + Timer t; + uevent_listener_.Poll(uevent_callback, 10s); + LOG(INFO) << "Wait for partitions returned after " << t; + } + + if (!devices.empty()) { + LOG(ERROR) << __PRETTY_FUNCTION__ << ": partition(s) not found after polling timeout: " + << android::base::Join(devices, ", "); + return false; + } + return true; +} + +// Creates "/dev/block/dm-XX" for dm nodes by running coldboot on /sys/block/dm-XX. +bool BlockDevInitializer::InitDmDevice(const std::string& device) { + const std::string device_name(basename(device.c_str())); + const std::string syspath = "/sys/block/" + device_name; + bool found = false; + + auto uevent_callback = [&device_name, &device, this, &found](const Uevent& uevent) { + if (uevent.device_name == device_name) { + LOG(VERBOSE) << "Creating device-mapper device : " << device; + device_handler_->HandleUevent(uevent); + found = true; + return ListenerAction::kStop; + } + return ListenerAction::kContinue; + }; + + uevent_listener_.RegenerateUeventsForPath(syspath, uevent_callback); + if (!found) { + LOG(INFO) << "dm device '" << device << "' not found in /sys, waiting for its uevent"; + Timer t; + uevent_listener_.Poll(uevent_callback, 10s); + LOG(INFO) << "wait for dm device '" << device << "' returned after " << t; + } + if (!found) { + LOG(ERROR) << "dm device '" << device << "' not found after polling timeout"; + return false; + } + return true; +} + +} // namespace init +} // namespace android diff --git a/init/block_dev_initializer.h b/init/block_dev_initializer.h new file mode 100644 index 000000000..0d4c6e9fc --- /dev/null +++ b/init/block_dev_initializer.h @@ -0,0 +1,41 @@ +// Copyright (C) 2020 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 "devices.h" +#include "uevent_listener.h" + +namespace android { +namespace init { + +class BlockDevInitializer final { + public: + BlockDevInitializer(); + + bool InitDeviceMapper(); + bool InitDevices(std::set devices); + bool InitDmDevice(const std::string& device); + + private: + ListenerAction HandleUevent(const Uevent& uevent, std::set* devices); + + std::unique_ptr device_handler_; + UeventListener uevent_listener_; +}; + +} // namespace init +} // namespace android diff --git a/init/first_stage_mount.cpp b/init/first_stage_mount.cpp index 3451264ab..8eb2f9748 100644 --- a/init/first_stage_mount.cpp +++ b/init/first_stage_mount.cpp @@ -42,6 +42,7 @@ #include #include +#include "block_dev_initializer.h" #include "devices.h" #include "switch_root.h" #include "uevent.h" @@ -84,11 +85,7 @@ class FirstStageMount { bool InitDevices(); protected: - ListenerAction HandleBlockDevice(const std::string& name, const Uevent&, - std::set* required_devices); bool InitRequiredDevices(std::set devices); - bool InitMappedDevice(const std::string& verity_device); - bool InitDeviceMapper(); bool CreateLogicalPartitions(); bool MountPartition(const Fstab::iterator& begin, bool erase_same_mounts, Fstab::iterator* end = nullptr); @@ -106,8 +103,6 @@ class FirstStageMount { // revocation check by DSU installation service. void CopyDsuAvbKeys(); - ListenerAction UeventCallback(const Uevent& uevent, std::set* required_devices); - // Pure virtual functions. virtual bool GetDmVerityDevices(std::set* devices) = 0; virtual bool SetUpDmVerity(FstabEntry* fstab_entry) = 0; @@ -119,8 +114,7 @@ class FirstStageMount { // The super path is only set after InitDevices, and is invalid before. std::string super_path_; std::string super_partition_name_; - std::unique_ptr device_handler_; - UeventListener uevent_listener_; + BlockDevInitializer block_dev_init_; // Reads all AVB keys before chroot into /system, as they might be used // later when mounting other partitions, e.g., /vendor and /product. std::map> preload_avb_key_blobs_; @@ -234,13 +228,7 @@ static bool IsStandaloneImageRollback(const AvbHandle& builtin_vbmeta, // Class Definitions // ----------------- -FirstStageMount::FirstStageMount(Fstab fstab) - : need_dm_verity_(false), fstab_(std::move(fstab)), uevent_listener_(16 * 1024 * 1024) { - auto boot_devices = android::fs_mgr::GetBootDevices(); - device_handler_ = std::make_unique( - std::vector{}, std::vector{}, std::vector{}, - std::move(boot_devices), false); - +FirstStageMount::FirstStageMount(Fstab fstab) : need_dm_verity_(false), fstab_(std::move(fstab)) { super_partition_name_ = fs_mgr_get_super_partition_name(); } @@ -308,62 +296,13 @@ void FirstStageMount::GetSuperDeviceName(std::set* devices) { // Found partitions will then be removed from it for the subsequent member // function to check which devices are NOT created. bool FirstStageMount::InitRequiredDevices(std::set devices) { - if (!InitDeviceMapper()) { + if (!block_dev_init_.InitDeviceMapper()) { return false; } - if (devices.empty()) { return true; } - - auto uevent_callback = [&, this](const Uevent& uevent) { - return UeventCallback(uevent, &devices); - }; - uevent_listener_.RegenerateUevents(uevent_callback); - - // UeventCallback() will remove found partitions from |devices|. So if it - // isn't empty here, it means some partitions are not found. - if (!devices.empty()) { - LOG(INFO) << __PRETTY_FUNCTION__ - << ": partition(s) not found in /sys, waiting for their uevent(s): " - << android::base::Join(devices, ", "); - Timer t; - uevent_listener_.Poll(uevent_callback, 10s); - LOG(INFO) << "Wait for partitions returned after " << t; - } - - if (!devices.empty()) { - LOG(ERROR) << __PRETTY_FUNCTION__ << ": partition(s) not found after polling timeout: " - << android::base::Join(devices, ", "); - return false; - } - - return true; -} - -bool FirstStageMount::InitDeviceMapper() { - const std::string dm_path = "/devices/virtual/misc/device-mapper"; - bool found = false; - auto dm_callback = [this, &dm_path, &found](const Uevent& uevent) { - if (uevent.path == dm_path) { - device_handler_->HandleUevent(uevent); - found = true; - return ListenerAction::kStop; - } - return ListenerAction::kContinue; - }; - uevent_listener_.RegenerateUeventsForPath("/sys" + dm_path, dm_callback); - if (!found) { - LOG(INFO) << "device-mapper device not found in /sys, waiting for its uevent"; - Timer t; - uevent_listener_.Poll(dm_callback, 10s); - LOG(INFO) << "Wait for device-mapper returned after " << t; - } - if (!found) { - LOG(ERROR) << "device-mapper device not found after polling timeout"; - return false; - } - return true; + return block_dev_init_.InitDevices(std::move(devices)); } bool FirstStageMount::InitDmLinearBackingDevices(const android::fs_mgr::LpMetadata& metadata) { @@ -419,75 +358,6 @@ bool FirstStageMount::CreateLogicalPartitions() { return android::fs_mgr::CreateLogicalPartitions(*metadata.get(), super_path_); } -ListenerAction FirstStageMount::HandleBlockDevice(const std::string& name, const Uevent& uevent, - std::set* required_devices) { - // Matches partition name to create device nodes. - // Both required_devices_partition_names_ and uevent->partition_name have A/B - // suffix when A/B is used. - auto iter = required_devices->find(name); - if (iter != required_devices->end()) { - LOG(VERBOSE) << __PRETTY_FUNCTION__ << ": found partition: " << *iter; - required_devices->erase(iter); - device_handler_->HandleUevent(uevent); - if (required_devices->empty()) { - return ListenerAction::kStop; - } else { - return ListenerAction::kContinue; - } - } - return ListenerAction::kContinue; -} - -ListenerAction FirstStageMount::UeventCallback(const Uevent& uevent, - std::set* required_devices) { - // Ignores everything that is not a block device. - if (uevent.subsystem != "block") { - return ListenerAction::kContinue; - } - - if (!uevent.partition_name.empty()) { - return HandleBlockDevice(uevent.partition_name, uevent, required_devices); - } else { - size_t base_idx = uevent.path.rfind('/'); - if (base_idx != std::string::npos) { - return HandleBlockDevice(uevent.path.substr(base_idx + 1), uevent, required_devices); - } - } - // Not found a partition or find an unneeded partition, continue to find others. - return ListenerAction::kContinue; -} - -// Creates "/dev/block/dm-XX" for dm-verity by running coldboot on /sys/block/dm-XX. -bool FirstStageMount::InitMappedDevice(const std::string& dm_device) { - const std::string device_name(basename(dm_device.c_str())); - const std::string syspath = "/sys/block/" + device_name; - bool found = false; - - auto verity_callback = [&device_name, &dm_device, this, &found](const Uevent& uevent) { - if (uevent.device_name == device_name) { - LOG(VERBOSE) << "Creating device-mapper device : " << dm_device; - device_handler_->HandleUevent(uevent); - found = true; - return ListenerAction::kStop; - } - return ListenerAction::kContinue; - }; - - uevent_listener_.RegenerateUeventsForPath(syspath, verity_callback); - if (!found) { - LOG(INFO) << "dm device '" << dm_device << "' not found in /sys, waiting for its uevent"; - Timer t; - uevent_listener_.Poll(verity_callback, 10s); - LOG(INFO) << "wait for dm device '" << dm_device << "' returned after " << t; - } - if (!found) { - LOG(ERROR) << "dm device '" << dm_device << "' not found after polling timeout"; - return false; - } - - return true; -} - bool FirstStageMount::MountPartition(const Fstab::iterator& begin, bool erase_same_mounts, Fstab::iterator* end) { // Sets end to begin + 1, so we can just return on failure below. @@ -499,7 +369,7 @@ bool FirstStageMount::MountPartition(const Fstab::iterator& begin, bool erase_sa if (!fs_mgr_update_logical_partition(&(*begin))) { return false; } - if (!InitMappedDevice(begin->blk_device)) { + if (!block_dev_init_.InitDmDevice(begin->blk_device)) { return false; } } @@ -666,7 +536,9 @@ bool FirstStageMount::MountPartitions() { auto init_devices = [this](std::set devices) -> bool { for (auto iter = devices.begin(); iter != devices.end();) { if (android::base::StartsWith(*iter, "/dev/block/dm-")) { - if (!InitMappedDevice(*iter)) return false; + if (!block_dev_init_.InitDmDevice(*iter)) { + return false; + } iter = devices.erase(iter); } else { iter++; @@ -782,7 +654,7 @@ bool FirstStageMountVBootV1::SetUpDmVerity(FstabEntry* fstab_entry) { // The exact block device name (fstab_rec->blk_device) is changed to // "/dev/block/dm-XX". Needs to create it because ueventd isn't started in init // first stage. - return InitMappedDevice(fstab_entry->blk_device); + return block_dev_init_.InitDmDevice(fstab_entry->blk_device); default: return false; } @@ -902,7 +774,7 @@ bool FirstStageMountVBootV2::SetUpDmVerity(FstabEntry* fstab_entry) { // The exact block device name (fstab_rec->blk_device) is changed to // "/dev/block/dm-XX". Needs to create it because ueventd isn't started in init // first stage. - return InitMappedDevice(fstab_entry->blk_device); + return block_dev_init_.InitDmDevice(fstab_entry->blk_device); default: return false; } From b9123e5bcea3e2e0dacbffb8eb506e65fcedf18f Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 20 Mar 2020 21:47:10 -0700 Subject: [PATCH 195/388] init: Forcefully mount system_ext on DAP devices if not present in fstab. Bug: 150315914 Test: cuttlefish boots with system_ext missing from fstab Change-Id: I99f292a070678b8a98500258af98129fbd81dfa7 Merged-In: I99f292a070678b8a98500258af98129fbd81dfa7 --- init/selinux.cpp | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/init/selinux.cpp b/init/selinux.cpp index 808cb7fc7..5a0255acd 100644 --- a/init/selinux.cpp +++ b/init/selinux.cpp @@ -63,12 +63,15 @@ #include #include #include +#include #include #include +#include #include #include #include +#include "block_dev_initializer.h" #include "debug_ramdisk.h" #include "reboot_utils.h" #include "util.h" @@ -598,6 +601,74 @@ int SelinuxGetVendorAndroidVersion() { return vendor_android_version; } +// This is for R system.img/system_ext.img to work on old vendor.img as system_ext.img +// is introduced in R. We mount system_ext in second stage init because the first-stage +// init in boot.img won't be updated in the system-only OTA scenario. +void MountMissingSystemPartitions() { + android::fs_mgr::Fstab fstab; + if (!ReadDefaultFstab(&fstab)) { + LOG(ERROR) << "Could not read default fstab"; + } + + android::fs_mgr::Fstab mounts; + if (!ReadFstabFromFile("/proc/mounts", &mounts)) { + LOG(ERROR) << "Could not read /proc/mounts"; + } + + static const std::vector kPartitionNames = {"system_ext", "product"}; + + android::fs_mgr::Fstab extra_fstab; + for (const auto& name : kPartitionNames) { + if (GetEntryForMountPoint(&mounts, "/"s + name)) { + // The partition is already mounted. + continue; + } + + auto system_entry = GetEntryForMountPoint(&fstab, "/system"); + if (!system_entry) { + LOG(ERROR) << "Could not find mount entry for /system"; + break; + } + if (!system_entry->fs_mgr_flags.logical) { + LOG(INFO) << "Skipping mount of " << name << ", system is not dynamic."; + break; + } + + auto entry = *system_entry; + auto partition_name = name + fs_mgr_get_slot_suffix(); + auto replace_name = "system"s + fs_mgr_get_slot_suffix(); + + entry.mount_point = "/"s + name; + entry.blk_device = + android::base::StringReplace(entry.blk_device, replace_name, partition_name, false); + if (!fs_mgr_update_logical_partition(&entry)) { + LOG(ERROR) << "Could not update logical partition"; + continue; + } + + extra_fstab.emplace_back(std::move(entry)); + } + + SkipMountingPartitions(&extra_fstab); + if (extra_fstab.empty()) { + return; + } + + BlockDevInitializer block_dev_init; + for (auto& entry : extra_fstab) { + if (access(entry.blk_device.c_str(), F_OK) != 0) { + auto block_dev = android::base::Basename(entry.blk_device); + if (!block_dev_init.InitDmDevice(block_dev)) { + LOG(ERROR) << "Failed to find device-mapper node: " << block_dev; + continue; + } + } + if (fs_mgr_do_mount_one(entry)) { + LOG(ERROR) << "Could not mount " << entry.mount_point; + } + } +} + int SetupSelinux(char** argv) { SetStdioToDevNull(argv); InitKernelLogging(argv); @@ -608,6 +679,8 @@ int SetupSelinux(char** argv) { boot_clock::time_point start_time = boot_clock::now(); + MountMissingSystemPartitions(); + // Set up SELinux, loading the SELinux policy. SelinuxSetupKernelLogging(); SelinuxInitialize(); From 37f5bb9faa4af96a60d1f5cb02d9b0951d45fa10 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 20 Feb 2020 17:56:28 -0800 Subject: [PATCH 196/388] libsnapshot: dump rollback indicator Test: snapshotctl dump Bug: 149956852 Change-Id: Ib0308ab75d6dce4047b46d06cece95eed23620a9 (cherry picked from commit 738a94b7985dabbcc091f130fcc28f3fa9bec8b3) Merged-In: Ib0308ab75d6dce4047b46d06cece95eed23620a9 --- fs_mgr/libsnapshot/snapshot.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 2d59f0c1c..1eec6a486 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2435,6 +2435,9 @@ bool SnapshotManager::Dump(std::ostream& os) { ss << "Current slot: " << device_->GetSlotSuffix() << std::endl; ss << "Boot indicator: booting from " << GetCurrentSlot() << " slot" << std::endl; + ss << "Rollback indicator: " + << (access(GetRollbackIndicatorPath().c_str(), F_OK) == 0 ? "exists" : strerror(errno)) + << std::endl; bool ok = true; std::vector snapshots; From 3c4b379cb0b550f4d0defeae1a9ea60eb600610d Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 26 Mar 2020 14:48:30 -0700 Subject: [PATCH 197/388] libsnapshot: Fix intermittent test failure due to missing null check. Bug: 152547190 Test: vts_snapshot_test Change-Id: If7adc4fba61325e52d6268531ce0a15b00c0a380 (cherry picked from commit 533b2b62965a6ce3509b07fefc178232547fe58d) Merged-In: If7adc4fba61325e52d6268531ce0a15b00c0a380 --- fs_mgr/libsnapshot/snapshot.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 1eec6a486..b82580578 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2505,7 +2505,9 @@ bool SnapshotManager::HandleImminentDataWipe(const std::function& callba } UpdateState state = ProcessUpdateState([&]() -> bool { - callback(); + if (callback) { + callback(); + } return true; }); LOG(INFO) << "Update state in recovery: " << state; From d5c899e46a567cc99844c383d979b5ff3417680e Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 24 Mar 2020 13:14:28 -0700 Subject: [PATCH 198/388] libsnapshot: Fix DataWipeAfterRollback test Test: run it Bug: 152094219 Change-Id: I06852d7a0514481cbeed3ef66192ba49a24cb54b (cherry picked from commit a4f9b07490998a90a0ce1ef7f241145ac279b2af) Merged-In: I06852d7a0514481cbeed3ef66192ba49a24cb54b --- fs_mgr/libsnapshot/snapshot_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp index 855451d82..fdcde522b 100644 --- a/fs_mgr/libsnapshot/snapshot_test.cpp +++ b/fs_mgr/libsnapshot/snapshot_test.cpp @@ -1498,7 +1498,7 @@ TEST_F(SnapshotUpdateTest, DataWipeAfterRollback) { ASSERT_TRUE(new_sm->HandleImminentDataWipe()); EXPECT_EQ(new_sm->GetUpdateState(), UpdateState::None); EXPECT_FALSE(test_device->IsSlotUnbootable(0)); - EXPECT_FALSE(test_device->IsSlotUnbootable(0)); + EXPECT_FALSE(test_device->IsSlotUnbootable(1)); } TEST_F(SnapshotUpdateTest, Hashtree) { From 1cc4ce96ce1a1299104a80a47cf01f682d144ef5 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 24 Mar 2020 10:51:07 -0700 Subject: [PATCH 199/388] libsnapshot: Add allow-forward-merge indicator. The indicator signals that on factory data reset, initiating merge is allowed. Test: vts_libsnapshot_test Test: apply downgrade update Test: apply update with FDR Bug: 152094219 Change-Id: Ieecddd198136571dd652ca62c27fe65a12b7b15f (cherry picked from commit f9e1e1637718da04fbb20c71eadb1c5e670cb094) Merged-In: Ieecddd198136571dd652ca62c27fe65a12b7b15f --- .../libsnapshot/include/libsnapshot/snapshot.h | 1 + fs_mgr/libsnapshot/snapshot.cpp | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 5c276b4c0..b14b0492b 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -452,6 +452,7 @@ class SnapshotManager final { std::string GetSnapshotBootIndicatorPath(); std::string GetRollbackIndicatorPath(); + std::string GetForwardMergeIndicatorPath(); // Return the name of the device holding the "snapshot" or "snapshot-merge" // target. This may not be the final device presented via MapSnapshot(), if diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index b82580578..6c18b1787 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -228,10 +228,17 @@ bool SnapshotManager::RemoveAllUpdateState(LockedFile* lock, const std::function return false; } - // It's okay if these fail - first-stage init performs a deeper check after + // It's okay if these fail: + // - For SnapshotBoot and Rollback, first-stage init performs a deeper check after // reading the indicator file, so it's not a problem if it still exists // after the update completes. - std::vector files = {GetSnapshotBootIndicatorPath(), GetRollbackIndicatorPath()}; + // - For ForwardMerge, FinishedSnapshotWrites asserts that the existence of the indicator + // matches the incoming update. + std::vector files = { + GetSnapshotBootIndicatorPath(), + GetRollbackIndicatorPath(), + GetForwardMergeIndicatorPath(), + }; for (const auto& file : files) { RemoveFileIfExists(file); } @@ -992,6 +999,10 @@ std::string SnapshotManager::GetRollbackIndicatorPath() { return metadata_dir_ + "/" + android::base::Basename(kRollbackIndicatorPath); } +std::string SnapshotManager::GetForwardMergeIndicatorPath() { + return metadata_dir_ + "/allow-forward-merge"; +} + void SnapshotManager::AcknowledgeMergeSuccess(LockedFile* lock) { RemoveAllUpdateState(lock); } @@ -2438,6 +2449,9 @@ bool SnapshotManager::Dump(std::ostream& os) { ss << "Rollback indicator: " << (access(GetRollbackIndicatorPath().c_str(), F_OK) == 0 ? "exists" : strerror(errno)) << std::endl; + ss << "Forward merge indicator: " + << (access(GetForwardMergeIndicatorPath().c_str(), F_OK) == 0 ? "exists" : strerror(errno)) + << std::endl; bool ok = true; std::vector snapshots; From c7c7a21d2eaab5d4acdc8139a73828d17556cce6 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 24 Mar 2020 10:57:56 -0700 Subject: [PATCH 200/388] libsnapshot: Place forward merge indicator for wipe If the device applies a package with FDR, place forward merge indicator so that on FDR, the snapshots aren't abandoned, and we forward merge the update. Test: apply downgrade Test: apply update with data wipe Test: vts_libsnapshot_test Bug: 152094219 Change-Id: Id32aeca380db797cd777321837f146333ae6b33c (cherry picked from commit 6b0251232ab368b52c67825a5edad568c9afeab7) Merged-In: Id32aeca380db797cd777321837f146333ae6b33c --- .../include/libsnapshot/snapshot.h | 8 ++++- fs_mgr/libsnapshot/snapshot.cpp | 20 +++++++++++- fs_mgr/libsnapshot/snapshot_test.cpp | 32 +++++++++---------- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index b14b0492b..08d17d1f0 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -142,7 +142,9 @@ class SnapshotManager final { // be created, and the device must either cancel the OTA (either before // rebooting or after rolling back), or merge the OTA. // Before calling this function, all snapshots must be mapped. - bool FinishedSnapshotWrites(); + // If |wipe| is set to true, wipe is scheduled after reboot, and snapshots + // may need to be merged before wiping. + bool FinishedSnapshotWrites(bool wipe); // Initiate a merge on all snapshot devices. This should only be used after an // update has been marked successful after booting. @@ -523,6 +525,10 @@ class SnapshotManager final { bool ShouldDeleteSnapshot(LockedFile* lock, const std::map& flashing_status, Slot current_slot, const std::string& name); + // Create or delete forward merge indicator given |wipe|. Iff wipe is scheduled, + // allow forward merge on FDR. + bool UpdateForwardMergeIndicator(bool wipe); + std::string gsid_dir_; std::string metadata_dir_; std::unique_ptr device_; diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 6c18b1787..f7df1815e 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -248,7 +248,7 @@ bool SnapshotManager::RemoveAllUpdateState(LockedFile* lock, const std::function return WriteUpdateState(lock, UpdateState::None); } -bool SnapshotManager::FinishedSnapshotWrites() { +bool SnapshotManager::FinishedSnapshotWrites(bool wipe) { auto lock = LockExclusive(); if (!lock) return false; @@ -268,6 +268,10 @@ bool SnapshotManager::FinishedSnapshotWrites() { return false; } + if (!UpdateForwardMergeIndicator(wipe)) { + return false; + } + // This file is written on boot to detect whether a rollback occurred. It // MUST NOT exist before rebooting, otherwise, we're at risk of deleting // snapshots too early. @@ -2638,5 +2642,19 @@ CreateResult SnapshotManager::RecoveryCreateSnapshotDevices( return CreateResult::CREATED; } +bool SnapshotManager::UpdateForwardMergeIndicator(bool wipe) { + if (!wipe) { + return RemoveFileIfExists(path); + } + + LOG(INFO) << "Wipe will be scheduled. Allowing forward merge of snapshots."; + if (!android::base::WriteStringToFile("1", path)) { + PLOG(ERROR) << "Unable to write forward merge indicator: " << path; + return false; + } + + return true; +} + } // namespace snapshot } // namespace android diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp index fdcde522b..862add1a5 100644 --- a/fs_mgr/libsnapshot/snapshot_test.cpp +++ b/fs_mgr/libsnapshot/snapshot_test.cpp @@ -320,7 +320,7 @@ class SnapshotTest : public ::testing::Test { // Simulate a reboot into the new slot. AssertionResult SimulateReboot() { lock_ = nullptr; - if (!sm->FinishedSnapshotWrites()) { + if (!sm->FinishedSnapshotWrites(false)) { return AssertionFailure(); } if (!dm_.DeleteDevice("test_partition_b")) { @@ -424,7 +424,7 @@ TEST_F(SnapshotTest, MapPartialSnapshot) { } TEST_F(SnapshotTest, NoMergeBeforeReboot) { - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Merge should fail, since the slot hasn't changed. ASSERT_FALSE(sm->InitiateMerge()); @@ -440,7 +440,7 @@ TEST_F(SnapshotTest, CleanFirstStageMount) { } TEST_F(SnapshotTest, FirstStageMountAfterRollback) { - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // We didn't change the slot, so we shouldn't need snapshots. TestDeviceInfo* info = new TestDeviceInfo(fake_super); @@ -476,7 +476,7 @@ TEST_F(SnapshotTest, Merge) { lock_ = nullptr; // Done updating. - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); test_device->set_slot_suffix("_b"); ASSERT_TRUE(sm->InitiateMerge()); @@ -1007,7 +1007,7 @@ TEST_F(SnapshotUpdateTest, FullUpdateFlow) { ASSERT_TRUE(IsPartitionUnchanged(name)); } - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Simulate shutting down the device. ASSERT_TRUE(UnmapAll()); @@ -1139,7 +1139,7 @@ TEST_F(SnapshotUpdateTest, TestRollback) { ASSERT_TRUE(IsPartitionUnchanged(name)); } - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Simulate shutting down the device. ASSERT_TRUE(UnmapAll()); @@ -1171,7 +1171,7 @@ TEST_F(SnapshotUpdateTest, TestRollback) { // Test that if an update is applied but not booted into, it can be canceled. TEST_F(SnapshotUpdateTest, CancelAfterApply) { ASSERT_TRUE(sm->BeginUpdate()); - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); ASSERT_TRUE(sm->CancelUpdate()); } @@ -1188,7 +1188,7 @@ TEST_F(SnapshotUpdateTest, ReclaimCow) { ASSERT_TRUE(sm->BeginUpdate()); ASSERT_TRUE(sm->CreateUpdateSnapshots(manifest_)); ASSERT_TRUE(MapUpdateSnapshots()); - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Simulate shutting down the device. ASSERT_TRUE(UnmapAll()); @@ -1295,7 +1295,7 @@ TEST_F(SnapshotUpdateTest, RetrofitAfterRegularAb) { ASSERT_TRUE(IsPartitionUnchanged(name)); } - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); } TEST_F(SnapshotUpdateTest, MergeCannotRemoveCow) { @@ -1324,7 +1324,7 @@ TEST_F(SnapshotUpdateTest, MergeCannotRemoveCow) { ASSERT_TRUE(sm->BeginUpdate()); ASSERT_TRUE(sm->CreateUpdateSnapshots(manifest_)); ASSERT_TRUE(MapUpdateSnapshots()); - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Simulate shutting down the device. ASSERT_TRUE(UnmapAll()); @@ -1428,7 +1428,7 @@ TEST_F(SnapshotUpdateTest, MergeInRecovery) { ASSERT_TRUE(sm->BeginUpdate()); ASSERT_TRUE(sm->CreateUpdateSnapshots(manifest_)); ASSERT_TRUE(MapUpdateSnapshots()); - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Simulate shutting down the device. ASSERT_TRUE(UnmapAll()); @@ -1460,7 +1460,7 @@ TEST_F(SnapshotUpdateTest, DataWipeRollbackInRecovery) { ASSERT_TRUE(sm->BeginUpdate()); ASSERT_TRUE(sm->CreateUpdateSnapshots(manifest_)); ASSERT_TRUE(MapUpdateSnapshots()); - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Simulate shutting down the device. ASSERT_TRUE(UnmapAll()); @@ -1485,7 +1485,7 @@ TEST_F(SnapshotUpdateTest, DataWipeAfterRollback) { ASSERT_TRUE(sm->BeginUpdate()); ASSERT_TRUE(sm->CreateUpdateSnapshots(manifest_)); ASSERT_TRUE(MapUpdateSnapshots()); - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Simulate shutting down the device. ASSERT_TRUE(UnmapAll()); @@ -1533,7 +1533,7 @@ TEST_F(SnapshotUpdateTest, Hashtree) { ASSERT_TRUE(WriteSnapshotAndHash("sys_b", partition_size)); // Finish update. - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Simulate shutting down the device. ASSERT_TRUE(UnmapAll()); @@ -1569,7 +1569,7 @@ TEST_F(SnapshotUpdateTest, Overflow) { ASSERT_EQ(1u, table.size()); EXPECT_TRUE(table[0].IsOverflowSnapshot()); - ASSERT_FALSE(sm->FinishedSnapshotWrites()) + ASSERT_FALSE(sm->FinishedSnapshotWrites(false)) << "FinishedSnapshotWrites should detect overflow of CoW device."; } @@ -1623,7 +1623,7 @@ TEST_P(FlashAfterUpdateTest, FlashSlotAfterUpdate) { ASSERT_TRUE(sm->BeginUpdate()); ASSERT_TRUE(sm->CreateUpdateSnapshots(manifest_)); ASSERT_TRUE(MapUpdateSnapshots()); - ASSERT_TRUE(sm->FinishedSnapshotWrites()); + ASSERT_TRUE(sm->FinishedSnapshotWrites(false)); // Simulate shutting down the device. ASSERT_TRUE(UnmapAll()); From 47c08de2d2081fbb54fd1ab48f2e0ec7ab0de4f5 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Tue, 24 Mar 2020 11:27:18 -0700 Subject: [PATCH 201/388] libsnapshot: Allow forward merge on FDR If forward merge indicator exists at unverified state during FDR, we are allowed to initiate merge and finish it before wiping userdata. Test: downgrades Test: update with data wipe Test: vts_libsnapshot_test Bug: 152094219 Change-Id: I151f1af4aca446cc52e669c5c3ea2b2e55acb468 (cherry picked from commit 973b8c10d1a74494e87bdda39bcfabf646abf0dd) Merged-In: I151f1af4aca446cc52e669c5c3ea2b2e55acb468 --- .../include/libsnapshot/snapshot.h | 7 +++ fs_mgr/libsnapshot/snapshot.cpp | 45 +++++++++++++++---- fs_mgr/libsnapshot/snapshot_test.cpp | 39 ++++++++++++++++ 3 files changed, 83 insertions(+), 8 deletions(-) diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h index 08d17d1f0..1daa83b8a 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h @@ -529,6 +529,13 @@ class SnapshotManager final { // allow forward merge on FDR. bool UpdateForwardMergeIndicator(bool wipe); + // Helper for HandleImminentDataWipe. + // Call ProcessUpdateState and handle states with special rules before data wipe. Specifically, + // if |allow_forward_merge| and allow-forward-merge indicator exists, initiate merge if + // necessary. + bool ProcessUpdateStateOnDataWipe(bool allow_forward_merge, + const std::function& callback); + std::string gsid_dir_; std::string metadata_dir_; std::unique_ptr device_; diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index f7df1815e..c9fa28e9f 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -2522,19 +2522,39 @@ bool SnapshotManager::HandleImminentDataWipe(const std::function& callba return false; } - UpdateState state = ProcessUpdateState([&]() -> bool { + auto process_callback = [&]() -> bool { if (callback) { callback(); } return true; - }); + }; + if (!ProcessUpdateStateOnDataWipe(true /* allow_forward_merge */, process_callback)) { + return false; + } + + // Nothing should be depending on partitions now, so unmap them all. + if (!UnmapAllPartitions()) { + LOG(ERROR) << "Unable to unmap all partitions; fastboot may fail to flash."; + } + return true; +} + +bool SnapshotManager::ProcessUpdateStateOnDataWipe(bool allow_forward_merge, + const std::function& callback) { + auto slot_number = SlotNumberForSlotSuffix(device_->GetSlotSuffix()); + UpdateState state = ProcessUpdateState(callback); LOG(INFO) << "Update state in recovery: " << state; switch (state) { case UpdateState::MergeFailed: LOG(ERROR) << "Unrecoverable merge failure detected."; return false; case UpdateState::Unverified: { - // If an OTA was just applied but has not yet started merging, we + // If an OTA was just applied but has not yet started merging: + // + // - if forward merge is allowed, initiate merge and call + // ProcessUpdateState again. + // + // - if forward merge is not allowed, we // have no choice but to revert slots, because the current slot will // immediately become unbootable. Rather than wait for the device // to reboot N times until a rollback, we proactively disable the @@ -2544,8 +2564,17 @@ bool SnapshotManager::HandleImminentDataWipe(const std::function& callba // as an error here. auto slot = GetCurrentSlot(); if (slot == Slot::Target) { + if (allow_forward_merge && + access(GetForwardMergeIndicatorPath().c_str(), F_OK) == 0) { + LOG(INFO) << "Forward merge allowed, initiating merge now."; + return InitiateMerge() && + ProcessUpdateStateOnDataWipe(false /* allow_forward_merge */, callback); + } + LOG(ERROR) << "Reverting to old slot since update will be deleted."; device_->SetSlotAsUnbootable(slot_number); + } else { + LOG(INFO) << "Booting from " << slot << " slot, no action is taken."; } break; } @@ -2557,11 +2586,6 @@ bool SnapshotManager::HandleImminentDataWipe(const std::function& callba default: break; } - - // Nothing should be depending on partitions now, so unmap them all. - if (!UnmapAllPartitions()) { - LOG(ERROR) << "Unable to unmap all partitions; fastboot may fail to flash."; - } return true; } @@ -2643,10 +2667,15 @@ CreateResult SnapshotManager::RecoveryCreateSnapshotDevices( } bool SnapshotManager::UpdateForwardMergeIndicator(bool wipe) { + auto path = GetForwardMergeIndicatorPath(); + if (!wipe) { + LOG(INFO) << "Wipe is not scheduled. Deleting forward merge indicator."; return RemoveFileIfExists(path); } + // TODO(b/152094219): Don't forward merge if no CoW file is allocated. + LOG(INFO) << "Wipe will be scheduled. Allowing forward merge of snapshots."; if (!android::base::WriteStringToFile("1", path)) { PLOG(ERROR) << "Unable to write forward merge indicator: " << path; diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp index 862add1a5..f82c082bf 100644 --- a/fs_mgr/libsnapshot/snapshot_test.cpp +++ b/fs_mgr/libsnapshot/snapshot_test.cpp @@ -1501,6 +1501,45 @@ TEST_F(SnapshotUpdateTest, DataWipeAfterRollback) { EXPECT_FALSE(test_device->IsSlotUnbootable(1)); } +// Test update package that requests data wipe. +TEST_F(SnapshotUpdateTest, DataWipeRequiredInPackage) { + AddOperationForPartitions(); + // Execute the update. + ASSERT_TRUE(sm->BeginUpdate()); + ASSERT_TRUE(sm->CreateUpdateSnapshots(manifest_)); + + // Write some data to target partitions. + for (const auto& name : {"sys_b", "vnd_b", "prd_b"}) { + ASSERT_TRUE(WriteSnapshotAndHash(name)) << name; + } + + ASSERT_TRUE(sm->FinishedSnapshotWrites(true /* wipe */)); + + // Simulate shutting down the device. + ASSERT_TRUE(UnmapAll()); + + // Simulate a reboot into recovery. + auto test_device = new TestDeviceInfo(fake_super, "_b"); + test_device->set_recovery(true); + auto new_sm = SnapshotManager::NewForFirstStageMount(test_device); + + ASSERT_TRUE(new_sm->HandleImminentDataWipe()); + // Manually mount metadata so that we can call GetUpdateState() below. + MountMetadata(); + EXPECT_EQ(new_sm->GetUpdateState(), UpdateState::None); + ASSERT_FALSE(test_device->IsSlotUnbootable(1)); + ASSERT_FALSE(test_device->IsSlotUnbootable(0)); + + // Now reboot into new slot. + test_device = new TestDeviceInfo(fake_super, "_b"); + auto init = SnapshotManager::NewForFirstStageMount(test_device); + ASSERT_TRUE(init->CreateLogicalAndSnapshotPartitions("super", snapshot_timeout_)); + // Verify that we are on the downgraded build. + for (const auto& name : {"sys_b", "vnd_b", "prd_b"}) { + ASSERT_TRUE(IsPartitionUnchanged(name)) << name; + } +} + TEST_F(SnapshotUpdateTest, Hashtree) { constexpr auto partition_size = 4_MiB; constexpr auto data_size = 3_MiB; From 9c83185c1e7f380047cde8c0dced8439d1a1fab3 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Thu, 26 Mar 2020 20:32:17 -0700 Subject: [PATCH 202/388] init: use an eventfd instead of socketpair to wake the main loop eventfd is a more suitable mechanism. Bug: 150863651 Test: boot CF, ctl.start services, reboot CF Merged-In: Ie5c3b0c048afdd7afa4bfc4cba26bec3225925e5 Change-Id: Ie5c3b0c048afdd7afa4bfc4cba26bec3225925e5 (cherry picked from commit 40463336a88eba61208b5c2b3c54f4eacc03bfbc) --- init/init.cpp | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/init/init.cpp b/init/init.cpp index 9eac473b1..6d984a2a2 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -114,30 +115,26 @@ static std::queue pending_control_messages; // to fill that socket and deadlock the system. Now we use locks to handle the property changes // directly in the property thread, however we still must wake the epoll to inform init that there // is a change to process, so we use this FD. It is non-blocking, since we do not care how many -// times WakeEpoll() is called, only that the epoll will wake. -static int wake_epoll_fd = -1; +// times WakeMainInitThread() is called, only that the epoll will wake. +static int wake_main_thread_fd = -1; static void InstallInitNotifier(Epoll* epoll) { - int sockets[2]; - if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, sockets) != 0) { - PLOG(FATAL) << "Failed to socketpair() between property_service and init"; + wake_main_thread_fd = eventfd(0, EFD_CLOEXEC); + if (wake_main_thread_fd == -1) { + PLOG(FATAL) << "Failed to create eventfd for waking init"; } - int epoll_fd = sockets[0]; - wake_epoll_fd = sockets[1]; - - auto drain_socket = [epoll_fd] { - char buf[512]; - while (read(epoll_fd, buf, sizeof(buf)) > 0) { - } + auto clear_eventfd = [] { + uint64_t counter; + TEMP_FAILURE_RETRY(read(wake_main_thread_fd, &counter, sizeof(counter))); }; - if (auto result = epoll->RegisterHandler(epoll_fd, drain_socket); !result.ok()) { + if (auto result = epoll->RegisterHandler(wake_main_thread_fd, clear_eventfd); !result.ok()) { LOG(FATAL) << result.error(); } } -static void WakeEpoll() { - constexpr char value[] = "1"; - TEMP_FAILURE_RETRY(write(wake_epoll_fd, value, sizeof(value))); +static void WakeMainInitThread() { + uint64_t counter = 1; + TEMP_FAILURE_RETRY(write(wake_main_thread_fd, &counter, sizeof(counter))); } static class PropWaiterState { @@ -181,7 +178,7 @@ static class PropWaiterState { LOG(INFO) << "Wait for property '" << wait_prop_name_ << "=" << wait_prop_value_ << "' took " << *waiting_for_prop_; ResetWaitForPropLocked(); - WakeEpoll(); + WakeMainInitThread(); } } } @@ -229,7 +226,7 @@ static class ShutdownState { auto lock = std::lock_guard{shutdown_command_lock_}; shutdown_command_ = command; do_shutdown_ = true; - WakeEpoll(); + WakeMainInitThread(); } std::optional CheckShutdown() { @@ -313,7 +310,7 @@ void PropertyChanged(const std::string& name, const std::string& value) { if (property_triggers_enabled) { ActionManager::GetInstance().QueuePropertyChange(name, value); - WakeEpoll(); + WakeMainInitThread(); } prop_waiter_state.CheckAndResetWait(name, value); @@ -439,7 +436,7 @@ bool QueueControlMessage(const std::string& message, const std::string& name, pi return false; } pending_control_messages.push({message, name, pid, fd}); - WakeEpoll(); + WakeMainInitThread(); return true; } @@ -465,7 +462,7 @@ static void HandleControlMessages() { } // If we still have items to process, make sure we wake back up to do so. if (!pending_control_messages.empty()) { - WakeEpoll(); + WakeMainInitThread(); } } From 43374ce9c11aff77cf91086fad7c5998a5409609 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Fri, 27 Mar 2020 13:57:53 -0700 Subject: [PATCH 203/388] init: fix StopSendingMessages() A typo made this function a no-op. Bug: 150863651 Test: CF responds to messages appropriately Merged-In: Iaae0264fae3f2b899ceb5ba0364a4773df1f7ca3 Change-Id: Iaae0264fae3f2b899ceb5ba0364a4773df1f7ca3 (cherry picked from commit 68855276a1781cc1d7fbb636c035acd8dd21f62a) --- init/property_service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init/property_service.cpp b/init/property_service.cpp index 820652249..a5fea7cd6 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -125,7 +125,7 @@ void StartSendingMessages() { void StopSendingMessages() { auto lock = std::lock_guard{accept_messages_lock}; - accept_messages = true; + accept_messages = false; } bool CanReadProperty(const std::string& source_context, const std::string& name) { From 495a394fd375f673829f4c8e47e4bb05f33afcc7 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Fri, 27 Mar 2020 14:08:20 -0700 Subject: [PATCH 204/388] init: do not handle control messages after shutdown We already stop queue'ing new control messages, but we forgot to stop handling those control messages that are already queued. This CL fixes that. Bug: 150863651 Test: CF reboots appropriately Merged-In: Ifea07a30b868de23eb735db10d8bae410e1b98bb Change-Id: Ifea07a30b868de23eb735db10d8bae410e1b98bb (cherry picked from commit 22d634884539ee7995e214a7dccbdad238049f95) --- init/init.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/init/init.cpp b/init/init.cpp index 6d984a2a2..cadd5c55d 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -879,7 +879,9 @@ int SecondStageMain(int argc, char** argv) { (*function)(); } } - HandleControlMessages(); + if (!IsShuttingDown()) { + HandleControlMessages(); + } } return 0; From 0d7fb3d260ebd2734410a99b7978d3a57192c3c0 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Mon, 30 Mar 2020 18:15:05 -0700 Subject: [PATCH 205/388] libstatspull documentation for puller guardrails Test: atest LibStatsPullTests Bug: 152543610 Change-Id: Ia5caad7c9307c02fef7d3dfe70998601e7ffeb55 --- libstats/pull/include/stats_pull_atom_callback.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libstats/pull/include/stats_pull_atom_callback.h b/libstats/pull/include/stats_pull_atom_callback.h index c976c6831..17df58435 100644 --- a/libstats/pull/include/stats_pull_atom_callback.h +++ b/libstats/pull/include/stats_pull_atom_callback.h @@ -46,7 +46,8 @@ void AStatsManager_PullAtomMetadata_release(AStatsManager_PullAtomMetadata* meta /** * Set the cool down time of the pull in milliseconds. If two successive pulls are issued - * within the cool down, a cached version of the first will be used for the second. + * within the cool down, a cached version of the first will be used for the second. The minimum + * allowed cool down is one second. */ void AStatsManager_PullAtomMetadata_setCoolDownMillis(AStatsManager_PullAtomMetadata* metadata, int64_t cool_down_millis); @@ -58,6 +59,7 @@ int64_t AStatsManager_PullAtomMetadata_getCoolDownMillis(AStatsManager_PullAtomM /** * Set the maximum time the pull can take in milliseconds. + * The maximum allowed timeout is 10 seconds. */ void AStatsManager_PullAtomMetadata_setTimeoutMillis(AStatsManager_PullAtomMetadata* metadata, int64_t timeout_millis); From 5b1c316a1f0a52b66558d5e2ca6b88f2c40b9a72 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Mon, 30 Mar 2020 09:11:23 -0700 Subject: [PATCH 206/388] init: require root for oneshot_on test Bug: 152630580 Bug: 152637928 Bug: 152662041 Bug: 152662652 Test: this test is skipped when run as non-root Merged-In: I7118025cc20081a200000bf484a08c9ed0b0d3ec Change-Id: I7118025cc20081a200000bf484a08c9ed0b0d3ec (cherry picked from commit 14f4afd2f2d4f24612cc789dada3e9f7b660372a) --- init/oneshot_on_test.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/init/oneshot_on_test.cpp b/init/oneshot_on_test.cpp index 7e7cc3679..650f0650b 100644 --- a/init/oneshot_on_test.cpp +++ b/init/oneshot_on_test.cpp @@ -26,6 +26,11 @@ using android::base::WaitForProperty; using namespace std::literals; TEST(init, oneshot_on) { + if (getuid() != 0) { + GTEST_SKIP() << "Skipping test, must be run as root."; + return; + } + // Bootanim shouldn't be running once the device has booted. ASSERT_EQ("stopped", GetProperty("init.svc.bootanim", "")); From 2b859925eaa5ac6ffc04a16f8c6a7a692dfc6db9 Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Tue, 31 Mar 2020 14:20:34 +0100 Subject: [PATCH 207/388] Add "com.android.os.statsd" to libprocessgroup apex_available The dependency path that determined libprocessgroup is in the com.android.os.statsd APEX is: com.android.os.statsd shared lib -> libstatspull static lib -> libutils shared lib -> libprocessgroup Bug: 152762638 Test: m droid Change-Id: Idf5d93085f926cc4fbeba40cbe03684c49baab72 --- libprocessgroup/Android.bp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libprocessgroup/Android.bp b/libprocessgroup/Android.bp index 618a5c57a..69533d7c6 100644 --- a/libprocessgroup/Android.bp +++ b/libprocessgroup/Android.bp @@ -23,6 +23,10 @@ cc_library { "task_profiles.cpp", ], name: "libprocessgroup", + apex_available: [ + "//apex_available:platform", + "com.android.os.statsd", + ], host_supported: true, native_bridge_supported: true, recovery_available: true, From bc445fbab8c4f52163bee0602c6c31fcecb27edd Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Thu, 26 Mar 2020 18:20:39 -0700 Subject: [PATCH 208/388] [adb] Use incremental installation by default This CL turns on the incremental installation for all "adb install ..." commands where no explicit mode has been set. To disable this, set the ADB_INSTALL_DEFAULT_INCREMENTAL environment variable to 0/n/no/false. Unset to enable back + improve the install command argument parsing a bit: allow --wait for all installation modes, --incr is enough for an incremental install (and --no-incr to disable it) Bug: 150183149 Test: adb install with different apks and command line switches Change-Id: I1a237f34b70d920146746ab16104e28ef555a5fd Merged-In: I1a237f34b70d920146746ab16104e28ef555a5fd --- adb/client/adb_install.cpp | 190 ++++++++++++++++++++++++++----------- adb/client/incremental.cpp | 91 +++++++++++++----- adb/client/incremental.h | 5 +- 3 files changed, 209 insertions(+), 77 deletions(-) diff --git a/adb/client/adb_install.cpp b/adb/client/adb_install.cpp index fe9182eb7..e4d010c71 100644 --- a/adb/client/adb_install.cpp +++ b/adb/client/adb_install.cpp @@ -22,11 +22,12 @@ #include #include #include -#include #include +#include #include #include +#include #include #include @@ -39,8 +40,9 @@ #include "fastdeploy.h" #include "incremental.h" +using namespace std::literals; + static constexpr int kFastDeployMinApi = 24; -static constexpr int kIncrementalMinApi = 29; namespace { @@ -50,6 +52,8 @@ enum InstallMode { INSTALL_STREAM, INSTALL_INCREMENTAL, }; + +enum class CmdlineOption { None, Enable, Disable }; } static bool can_use_feature(const char* feature) { @@ -299,28 +303,23 @@ static int msBetween(TimePoint start, TimePoint end) { return std::chrono::duration_cast(end - start).count(); } -static int install_app_incremental(int argc, const char** argv) { - printf("Performing Incremental Install\n"); +static int install_app_incremental(int argc, const char** argv, bool wait, bool silent) { using clock = std::chrono::high_resolution_clock; const auto start = clock::now(); int first_apk = -1; int last_apk = -1; - std::string cert_path; - bool wait = false; - std::vector args = {"package"}; + std::vector args = {"package"sv}; for (int i = 0; i < argc; ++i) { const auto arg = std::string_view(argv[i]); - if (android::base::EndsWithIgnoreCase(arg, ".apk")) { + if (android::base::EndsWithIgnoreCase(arg, ".apk"sv)) { last_apk = i; if (first_apk == -1) { first_apk = i; } - } else if (arg == "--wait") { - wait = true; - } else if (arg.starts_with("install-")) { + } else if (arg.starts_with("install-"sv)) { // incremental installation command on the device is the same for all its variations in // the adb, e.g. install-multiple or install-multi-package - args.push_back("install"); + args.push_back("install"sv); } else { args.push_back(arg); } @@ -328,16 +327,23 @@ static int install_app_incremental(int argc, const char** argv) { if (first_apk == -1) error_exit("Need at least one APK file on command line"); - const auto afterApk = clock::now(); + auto files = incremental::Files{argv + first_apk, argv + last_apk + 1}; + if (silent) { + // For a silent installation we want to do the lightweight check first and bail early and + // quietly if it fails. + if (!incremental::can_install(files)) { + return -1; + } + } - auto server_process = incremental::install({argv + first_apk, argv + last_apk + 1}); + printf("Performing Incremental Install\n"); + auto server_process = incremental::install(files, silent); if (!server_process) { return -1; } const auto end = clock::now(); - printf("Install command complete (ms: %d total, %d apk prep, %d install)\n", - msBetween(start, end), msBetween(start, afterApk), msBetween(afterApk, end)); + printf("Install command complete in %d ms\n", msBetween(start, end)); if (wait) { (*server_process).wait(); @@ -346,66 +352,134 @@ static int install_app_incremental(int argc, const char** argv) { return 0; } +static std::pair> calculateInstallMode( + InstallMode modeFromArgs, bool fastdeploy, CmdlineOption incrementalRequest) { + if (incrementalRequest == CmdlineOption::Enable) { + if (fastdeploy) { + error_exit( + "--incremental and --fast-deploy options are incompatible. " + "Please choose one"); + } + } + + if (modeFromArgs != INSTALL_DEFAULT) { + if (incrementalRequest == CmdlineOption::Enable) { + error_exit("--incremental is not compatible with other installation modes"); + } + return {modeFromArgs, std::nullopt}; + } + + if (incrementalRequest != CmdlineOption::Disable && !is_abb_exec_supported()) { + if (incrementalRequest == CmdlineOption::None) { + incrementalRequest = CmdlineOption::Disable; + } else { + error_exit("Device doesn't support incremental installations"); + } + } + if (incrementalRequest == CmdlineOption::None) { + // check if the host is ok with incremental by default + if (const char* incrementalFromEnv = getenv("ADB_INSTALL_DEFAULT_INCREMENTAL")) { + using namespace android::base; + auto val = ParseBool(incrementalFromEnv); + if (val == ParseBoolResult::kFalse) { + incrementalRequest = CmdlineOption::Disable; + } + } + } + if (incrementalRequest == CmdlineOption::None) { + // still ok: let's see if the device allows using incremental by default + // it starts feeling like we're looking for an excuse to not to use incremental... + std::string error; + std::vector args = {"settings", "get", + "enable_adb_incremental_install_default"}; + auto fd = send_abb_exec_command(args, &error); + if (!fd.ok()) { + fprintf(stderr, "adb: retrieving the default device installation mode failed: %s", + error.c_str()); + } else { + char buf[BUFSIZ] = {}; + read_status_line(fd.get(), buf, sizeof(buf)); + using namespace android::base; + auto val = ParseBool(buf); + if (val == ParseBoolResult::kFalse) { + incrementalRequest = CmdlineOption::Disable; + } + } + } + + if (incrementalRequest == CmdlineOption::Enable) { + // explicitly requested - no fallback + return {INSTALL_INCREMENTAL, std::nullopt}; + } + const auto bestMode = best_install_mode(); + if (incrementalRequest == CmdlineOption::None) { + // no opinion - use incremental, fallback to regular on a failure. + return {INSTALL_INCREMENTAL, bestMode}; + } + // incremental turned off - use the regular best mode without a fallback. + return {bestMode, std::nullopt}; +} + int install_app(int argc, const char** argv) { std::vector processedArgIndices; InstallMode installMode = INSTALL_DEFAULT; bool use_fastdeploy = false; bool is_reinstall = false; + bool wait = false; + auto incremental_request = CmdlineOption::None; FastDeploy_AgentUpdateStrategy agent_update_strategy = FastDeploy_AgentUpdateDifferentVersion; for (int i = 1; i < argc; i++) { - if (!strcmp(argv[i], "--streaming")) { + if (argv[i] == "--streaming"sv) { processedArgIndices.push_back(i); installMode = INSTALL_STREAM; - } else if (!strcmp(argv[i], "--no-streaming")) { + } else if (argv[i] == "--no-streaming"sv) { processedArgIndices.push_back(i); installMode = INSTALL_PUSH; - } else if (!strcmp(argv[i], "-r")) { + } else if (argv[i] == "-r"sv) { // Note that this argument is not added to processedArgIndices because it // must be passed through to pm is_reinstall = true; - } else if (!strcmp(argv[i], "--fastdeploy")) { + } else if (argv[i] == "--fastdeploy"sv) { processedArgIndices.push_back(i); use_fastdeploy = true; - } else if (!strcmp(argv[i], "--no-fastdeploy")) { + } else if (argv[i] == "--no-fastdeploy"sv) { processedArgIndices.push_back(i); use_fastdeploy = false; - } else if (!strcmp(argv[i], "--force-agent")) { + } else if (argv[i] == "--force-agent"sv) { processedArgIndices.push_back(i); agent_update_strategy = FastDeploy_AgentUpdateAlways; - } else if (!strcmp(argv[i], "--date-check-agent")) { + } else if (argv[i] == "--date-check-agent"sv) { processedArgIndices.push_back(i); agent_update_strategy = FastDeploy_AgentUpdateNewerTimeStamp; - } else if (!strcmp(argv[i], "--version-check-agent")) { + } else if (argv[i] == "--version-check-agent"sv) { processedArgIndices.push_back(i); agent_update_strategy = FastDeploy_AgentUpdateDifferentVersion; - } else if (!strcmp(argv[i], "--incremental")) { + } else if (strlen(argv[i]) >= "--incr"sv.size() && "--incremental"sv.starts_with(argv[i])) { processedArgIndices.push_back(i); - installMode = INSTALL_INCREMENTAL; - } else if (!strcmp(argv[i], "--no-incremental")) { + incremental_request = CmdlineOption::Enable; + } else if (strlen(argv[i]) >= "--no-incr"sv.size() && + "--no-incremental"sv.starts_with(argv[i])) { processedArgIndices.push_back(i); - installMode = INSTALL_DEFAULT; + incremental_request = CmdlineOption::Disable; + } else if (argv[i] == "--wait"sv) { + processedArgIndices.push_back(i); + wait = true; } } - if (installMode == INSTALL_INCREMENTAL) { - if (get_device_api_level() < kIncrementalMinApi || !is_abb_exec_supported()) { - error_exit("Attempting to use incremental install on unsupported device"); - } - } - - if (installMode == INSTALL_DEFAULT) { - installMode = best_install_mode(); - } - - if (installMode == INSTALL_STREAM && best_install_mode() == INSTALL_PUSH) { + auto [primaryMode, fallbackMode] = + calculateInstallMode(installMode, use_fastdeploy, incremental_request); + if ((primaryMode == INSTALL_STREAM || fallbackMode.value_or(INSTALL_PUSH) == INSTALL_STREAM) && + best_install_mode() == INSTALL_PUSH) { error_exit("Attempting to use streaming install on unsupported device"); } if (use_fastdeploy && get_device_api_level() < kFastDeployMinApi) { - printf("Fast Deploy is only compatible with devices of API version %d or higher, " - "ignoring.\n", - kFastDeployMinApi); + fprintf(stderr, + "Fast Deploy is only compatible with devices of API version %d or higher, " + "ignoring.\n", + kFastDeployMinApi); use_fastdeploy = false; } fastdeploy_set_agent_update_strategy(agent_update_strategy); @@ -421,19 +495,27 @@ int install_app(int argc, const char** argv) { error_exit("install requires an apk argument"); } - switch (installMode) { - case INSTALL_PUSH: - return install_app_legacy(passthrough_argv.size(), passthrough_argv.data(), - use_fastdeploy); - case INSTALL_STREAM: - return install_app_streamed(passthrough_argv.size(), passthrough_argv.data(), - use_fastdeploy); - case INSTALL_INCREMENTAL: - return install_app_incremental(passthrough_argv.size(), passthrough_argv.data()); - case INSTALL_DEFAULT: - default: - return 1; + auto runInstallMode = [&](InstallMode installMode, bool silent) { + switch (installMode) { + case INSTALL_PUSH: + return install_app_legacy(passthrough_argv.size(), passthrough_argv.data(), + use_fastdeploy); + case INSTALL_STREAM: + return install_app_streamed(passthrough_argv.size(), passthrough_argv.data(), + use_fastdeploy); + case INSTALL_INCREMENTAL: + return install_app_incremental(passthrough_argv.size(), passthrough_argv.data(), + wait, silent); + case INSTALL_DEFAULT: + default: + return 1; + } + }; + auto res = runInstallMode(primaryMode, fallbackMode.has_value()); + if (res && fallbackMode.value_or(primaryMode) != primaryMode) { + res = runInstallMode(*fallbackMode, false); } + return res; } int install_multiple_app(int argc, const char** argv) { diff --git a/adb/client/incremental.cpp b/adb/client/incremental.cpp index a9e65dc2c..b56df443e 100644 --- a/adb/client/incremental.cpp +++ b/adb/client/incremental.cpp @@ -90,38 +90,58 @@ static inline Size verity_tree_size_for_file(Size fileSize) { return total_tree_block_count * INCFS_DATA_FILE_BLOCK_SIZE; } -// Base64-encode signature bytes. Keeping fd at the position of start of verity tree. -static std::pair read_and_encode_signature(Size file_size, - std::string signature_file) { +// Read, verify and return the signature bytes. Keeping fd at the position of start of verity tree. +static std::pair> read_signature(Size file_size, + std::string signature_file, + bool silent) { signature_file += IDSIG; struct stat st; if (stat(signature_file.c_str(), &st)) { - fprintf(stderr, "Failed to stat signature file %s. Abort.\n", signature_file.c_str()); + if (!silent) { + fprintf(stderr, "Failed to stat signature file %s. Abort.\n", signature_file.c_str()); + } return {}; } unique_fd fd(adb_open(signature_file.c_str(), O_RDONLY | O_CLOEXEC)); if (fd < 0) { - fprintf(stderr, "Failed to open signature file: %s. Abort.\n", signature_file.c_str()); + if (!silent) { + fprintf(stderr, "Failed to open signature file: %s. Abort.\n", signature_file.c_str()); + } return {}; } auto [signature, tree_size] = read_id_sig_headers(fd); if (auto expected = verity_tree_size_for_file(file_size); tree_size != expected) { - fprintf(stderr, - "Verity tree size mismatch in signature file: %s [was %lld, expected %lld].\n", - signature_file.c_str(), (long long)tree_size, (long long)expected); + if (!silent) { + fprintf(stderr, + "Verity tree size mismatch in signature file: %s [was %lld, expected %lld].\n", + signature_file.c_str(), (long long)tree_size, (long long)expected); + } + return {}; + } + + return {std::move(fd), std::move(signature)}; +} + +// Base64-encode signature bytes. Keeping fd at the position of start of verity tree. +static std::pair read_and_encode_signature(Size file_size, + std::string signature_file, + bool silent) { + auto [fd, signature] = read_signature(file_size, std::move(signature_file), silent); + if (!fd.ok()) { return {}; } size_t base64_len = 0; if (!EVP_EncodedLength(&base64_len, signature.size())) { - fprintf(stderr, "Fail to estimate base64 encoded length. Abort.\n"); + if (!silent) { + fprintf(stderr, "Fail to estimate base64 encoded length. Abort.\n"); + } return {}; } - std::string encoded_signature; - encoded_signature.resize(base64_len); + std::string encoded_signature(base64_len, '\0'); encoded_signature.resize(EVP_EncodeBlock((uint8_t*)encoded_signature.data(), (const uint8_t*)signature.data(), signature.size())); @@ -130,7 +150,7 @@ static std::pair read_and_encode_signature(Size file_siz // Send install-incremental to the device along with properly configured file descriptors in // streaming format. Once connection established, send all fs-verity tree bytes. -static unique_fd start_install(const std::vector& files) { +static unique_fd start_install(const Files& files, bool silent) { std::vector command_args{"package", "install-incremental"}; // fd's with positions at the beginning of fs-verity @@ -141,11 +161,13 @@ static unique_fd start_install(const std::vector& files) { struct stat st; if (stat(file.c_str(), &st)) { - fprintf(stderr, "Failed to stat input file %s. Abort.\n", file.c_str()); + if (!silent) { + fprintf(stderr, "Failed to stat input file %s. Abort.\n", file.c_str()); + } return {}; } - auto [signature_fd, signature] = read_and_encode_signature(st.st_size, file); + auto [signature_fd, signature] = read_and_encode_signature(st.st_size, file, silent); if (!signature_fd.ok()) { return {}; } @@ -161,15 +183,19 @@ static unique_fd start_install(const std::vector& files) { std::string error; auto connection_fd = unique_fd(send_abb_exec_command(command_args, &error)); if (connection_fd < 0) { - fprintf(stderr, "Failed to run: %s, error: %s\n", - android::base::Join(command_args, " ").c_str(), error.c_str()); + if (!silent) { + fprintf(stderr, "Failed to run: %s, error: %s\n", + android::base::Join(command_args, " ").c_str(), error.c_str()); + } return {}; } // Pushing verity trees for all installation files. for (auto&& local_fd : signature_fds) { if (!copy_to_file(local_fd.get(), connection_fd.get())) { - fprintf(stderr, "Failed to stream tree bytes: %s. Abort.\n", strerror(errno)); + if (!silent) { + fprintf(stderr, "Failed to stream tree bytes: %s. Abort.\n", strerror(errno)); + } return {}; } } @@ -179,10 +205,27 @@ static unique_fd start_install(const std::vector& files) { } // namespace -std::optional install(std::vector files) { - auto connection_fd = start_install(files); +bool can_install(const Files& files) { + for (const auto& file : files) { + struct stat st; + if (stat(file.c_str(), &st)) { + return false; + } + + auto [fd, _] = read_signature(st.st_size, file, true); + if (!fd.ok()) { + return false; + } + } + return true; +} + +std::optional install(const Files& files, bool silent) { + auto connection_fd = start_install(files, silent); if (connection_fd < 0) { - fprintf(stderr, "adb: failed to initiate installation on device.\n"); + if (!silent) { + fprintf(stderr, "adb: failed to initiate installation on device.\n"); + } return {}; } @@ -198,7 +241,9 @@ std::optional install(std::vector files) { // pipe for child process to write output int print_fds[2]; if (adb_socketpair(print_fds) != 0) { - fprintf(stderr, "Failed to create socket pair for child to print to parent\n"); + if (!silent) { + fprintf(stderr, "Failed to create socket pair for child to print to parent\n"); + } return {}; } auto [pipe_read_fd, pipe_write_fd] = print_fds; @@ -210,7 +255,9 @@ std::optional install(std::vector files) { auto child = adb_launch_process(adb_path, std::move(args), {connection_fd.get(), pipe_write_fd}); if (!child) { - fprintf(stderr, "adb: failed to fork: %s\n", strerror(errno)); + if (!silent) { + fprintf(stderr, "adb: failed to fork: %s\n", strerror(errno)); + } return {}; } diff --git a/adb/client/incremental.h b/adb/client/incremental.h index 731e6fb4d..1fb1e0b19 100644 --- a/adb/client/incremental.h +++ b/adb/client/incremental.h @@ -25,7 +25,10 @@ namespace incremental { -std::optional install(std::vector files); +using Files = std::vector; + +bool can_install(const Files& files); +std::optional install(const Files& files, bool silent); enum class Result { Success, Failure, None }; Result wait_for_installation(int read_fd); From cbdc9934c21b5e2d09a56555038793176bbfbb3a Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Mon, 30 Mar 2020 17:38:37 -0700 Subject: [PATCH 209/388] adb: fix apex installation. Incremental doesn't support apex installation, but we were exiting instead of returning -1 to fall back to regular installation. Bug: http://b/151900478 Test: manual Change-Id: Id27009250090a65fbb45bb65fc39c1799bf1f861 Merged-In: Id27009250090a65fbb45bb65fc39c1799bf1f861 --- adb/client/adb_install.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/adb/client/adb_install.cpp b/adb/client/adb_install.cpp index e4d010c71..092a86684 100644 --- a/adb/client/adb_install.cpp +++ b/adb/client/adb_install.cpp @@ -325,7 +325,12 @@ static int install_app_incremental(int argc, const char** argv, bool wait, bool } } - if (first_apk == -1) error_exit("Need at least one APK file on command line"); + if (first_apk == -1) { + if (!silent) { + fprintf(stderr, "error: need at least one APK file on command line\n"); + } + return -1; + } auto files = incremental::Files{argv + first_apk, argv + last_apk + 1}; if (silent) { From 15e63dff214555fdd6ce84ab01864d0fa70acba6 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Wed, 25 Mar 2020 23:42:25 -0700 Subject: [PATCH 210/388] libdm: Link libraries statically for VTS. Bug: 152180548 Test: 32-bit libdm_test Change-Id: I9f356c854833b5e68820e4d3d4e9709af1288381 Merged-In: I9f356c854833b5e68820e4d3d4e9709af1288381 --- fs_mgr/libdm/Android.bp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs_mgr/libdm/Android.bp b/fs_mgr/libdm/Android.bp index 1c3427f6d..910c4fc6b 100644 --- a/fs_mgr/libdm/Android.bp +++ b/fs_mgr/libdm/Android.bp @@ -58,11 +58,11 @@ cc_defaults { defaults: ["fs_mgr_defaults"], static_libs: [ "libdm", + "libext2_uuid", + "libfs_mgr", ], shared_libs: [ "libbase", - "libext2_uuid", - "libfs_mgr", "liblog", ], srcs: [":libdm_test_srcs"], From 083df2945e610e25c2f0e5c88b7fb13ffe6026a5 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Mon, 23 Mar 2020 23:43:45 -0700 Subject: [PATCH 211/388] fastbootd: Unmount /cache before flashing. Bug: 150112538 Test: fastboot flash cache on non-A/B device Change-Id: I8a86bc4d12e4b3be020bbe47e02262a5aaa913a7 Merged-In: I8a86bc4d12e4b3be020bbe47e02262a5aaa913a7 --- fastboot/device/commands.cpp | 1 + fastboot/device/fastboot_device.cpp | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp index ca120c62a..b8eee4ac1 100644 --- a/fastboot/device/commands.cpp +++ b/fastboot/device/commands.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include diff --git a/fastboot/device/fastboot_device.cpp b/fastboot/device/fastboot_device.cpp index 31fc35937..bb085c536 100644 --- a/fastboot/device/fastboot_device.cpp +++ b/fastboot/device/fastboot_device.cpp @@ -16,18 +16,22 @@ #include "fastboot_device.h" +#include + #include #include #include #include +#include +#include #include -#include - #include "constants.h" #include "flashing.h" #include "usb_client.h" +using android::fs_mgr::EnsurePathUnmounted; +using android::fs_mgr::Fstab; using ::android::hardware::hidl_string; using ::android::hardware::boot::V1_0::IBootControl; using ::android::hardware::boot::V1_0::Slot; @@ -64,6 +68,13 @@ FastbootDevice::FastbootDevice() if (boot_control_hal_) { boot1_1_ = android::hardware::boot::V1_1::IBootControl::castFrom(boot_control_hal_); } + + // Make sure cache is unmounted, since recovery will have mounted it for + // logging. + Fstab fstab; + if (ReadDefaultFstab(&fstab)) { + EnsurePathUnmounted(&fstab, "/cache"); + } } FastbootDevice::~FastbootDevice() { From 27831220711f5ab4ccb2fca6253786c13245559a Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 27 Mar 2020 18:09:56 -0700 Subject: [PATCH 212/388] Move adbd's legacy USB implementation to fastboot. This code path is effectively dead in adbd, and fastboot's dependency on libadbd makes it hard to refactor adbd's dependencies. Bug: http://b/150317254 Test: built and flashed aosp_walleye-eng Change-Id: I5118136d32fdcbbd011559ed0a4a71e1dc7bf064 Merged-In: I5118136d32fdcbbd011559ed0a4a71e1dc7bf064 (cherry picked from commit 0871824de6c5b868f2a2e67c9b5673cb2181b4c6) --- adb/Android.bp | 17 +-- adb/adb.cpp | 4 + adb/adb.h | 3 +- adb/client/main.cpp | 1 + adb/{ => client}/transport_usb.cpp | 8 +- adb/{ => client}/usb.h | 42 ++++--- adb/client/usb_dispatch.cpp | 3 +- adb/client/usb_libusb.cpp | 5 +- adb/client/usb_linux.cpp | 3 +- adb/client/usb_osx.cpp | 2 + adb/client/usb_windows.cpp | 2 + adb/daemon/usb.cpp | 30 +---- adb/daemon/usb_ffs.cpp | 3 +- adb/daemon/{usb_dummy.cpp => usb_ffs.h} | 30 +---- adb/transport.cpp | 2 + adb/transport.h | 37 +++--- fastboot/Android.bp | 2 +- .../usb_legacy.cpp => fastboot/device/usb.cpp | 111 +----------------- .../include/adbd => fastboot/device}/usb.h | 9 +- fastboot/device/usb_client.h | 2 +- 20 files changed, 87 insertions(+), 229 deletions(-) rename adb/{ => client}/transport_usb.cpp (97%) rename adb/{ => client}/usb.h (72%) rename adb/daemon/{usb_dummy.cpp => usb_ffs.h} (52%) rename adb/daemon/usb_legacy.cpp => fastboot/device/usb.cpp (70%) rename {adb/daemon/include/adbd => fastboot/device}/usb.h (84%) diff --git a/adb/Android.bp b/adb/Android.bp index 9d47b8bf2..b1ca8af7d 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -133,7 +133,6 @@ libadb_srcs = [ "transport.cpp", "transport_fd.cpp", "transport_local.cpp", - "transport_usb.cpp", "types.cpp", ] @@ -169,6 +168,7 @@ cc_library_host_static { "client/usb_libusb.cpp", "client/usb_dispatch.cpp", "client/transport_mdns.cpp", + "client/transport_usb.cpp", "client/pairing/pairing_client.cpp", ], @@ -381,10 +381,6 @@ cc_library_static { "daemon/adb_wifi.cpp", ], - local_include_dirs: [ - "daemon/include", - ], - generated_headers: ["platform_tools_version"], static_libs: [ @@ -414,12 +410,6 @@ cc_library_static { "daemon/transport_qemu.cpp", "daemon/usb.cpp", "daemon/usb_ffs.cpp", - "daemon/usb_legacy.cpp", - ] - }, - linux_glibc: { - srcs: [ - "daemon/usb_dummy.cpp", ] }, recovery: { @@ -544,8 +534,9 @@ cc_library { "libmdnssd", ], - export_include_dirs: [ - "daemon/include", + visibility: [ + "//bootable/recovery/minadbd", + "//system/core/adb", ], } diff --git a/adb/adb.cpp b/adb/adb.cpp index 98db19123..44e5dacb1 100644 --- a/adb/adb.cpp +++ b/adb/adb.cpp @@ -66,6 +66,10 @@ using namespace std::chrono_literals; #include "daemon/logging.h" #endif +#if ADB_HOST +#include "client/usb.h" +#endif + std::string adb_version() { // Don't change the format of this --- it's parsed by ddmlib. return android::base::StringPrintf( diff --git a/adb/adb.h b/adb/adb.h index 86d205c98..ce12a55f9 100644 --- a/adb/adb.h +++ b/adb/adb.h @@ -29,7 +29,6 @@ #include "fdevent/fdevent.h" #include "socket.h" #include "types.h" -#include "usb.h" constexpr size_t MAX_PAYLOAD_V1 = 4 * 1024; constexpr size_t MAX_PAYLOAD = 1024 * 1024; @@ -139,7 +138,6 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply /* initialize a transport object's func pointers and state */ int init_socket_transport(atransport* t, unique_fd s, int port, int local); -void init_usb_transport(atransport* t, usb_handle* usb); std::string getEmulatorSerialString(int console_port); #if ADB_HOST @@ -252,4 +250,5 @@ void update_transport_status(); // Wait until device scan has completed and every transport is ready, or a timeout elapses. void adb_wait_for_device_initialization(); +void usb_init(); #endif diff --git a/adb/client/main.cpp b/adb/client/main.cpp index a85a18c4e..78f7b8f20 100644 --- a/adb/client/main.cpp +++ b/adb/client/main.cpp @@ -36,6 +36,7 @@ #include "adb_listeners.h" #include "adb_utils.h" #include "adb_wifi.h" +#include "client/usb.h" #include "commandline.h" #include "sysdeps/chrono.h" #include "transport.h" diff --git a/adb/transport_usb.cpp b/adb/client/transport_usb.cpp similarity index 97% rename from adb/transport_usb.cpp rename to adb/client/transport_usb.cpp index fb81b37e0..777edde0b 100644 --- a/adb/transport_usb.cpp +++ b/adb/client/transport_usb.cpp @@ -16,6 +16,10 @@ #define TRACE_TAG TRANSPORT +#include "sysdeps.h" + +#include "client/usb.h" + #include #include "sysdeps.h" @@ -135,8 +139,8 @@ static int remote_read(apacket* p, usb_handle* usb) { } p->payload.resize(p->msg.data_length); - if (usb_read(usb, &p->payload[0], p->payload.size()) - != static_cast(p->payload.size())) { + if (usb_read(usb, &p->payload[0], p->payload.size()) != + static_cast(p->payload.size())) { PLOG(ERROR) << "remote usb: terminated (data)"; return -1; } diff --git a/adb/usb.h b/adb/client/usb.h similarity index 72% rename from adb/usb.h rename to adb/client/usb.h index eb8ca6cc0..b371788cc 100644 --- a/adb/usb.h +++ b/adb/client/usb.h @@ -18,6 +18,9 @@ #include +#include "adb.h" +#include "transport.h" + // USB host/client interface. #define ADB_USB_INTERFACE(handle_ref_type) \ @@ -30,35 +33,38 @@ void usb_kick(handle_ref_type h); \ size_t usb_get_max_packet_size(handle_ref_type) -#if !ADB_HOST -// The daemon has a single implementation. - -struct usb_handle; -ADB_USB_INTERFACE(usb_handle*); - -#else // linux host || darwin // Linux and Darwin clients have native and libusb implementations. namespace libusb { - struct usb_handle; - ADB_USB_INTERFACE(libusb::usb_handle*); -} +struct usb_handle; +ADB_USB_INTERFACE(libusb::usb_handle*); +} // namespace libusb namespace native { - struct usb_handle; - ADB_USB_INTERFACE(native::usb_handle*); -} +struct usb_handle; +ADB_USB_INTERFACE(native::usb_handle*); +} // namespace native // Empty base that both implementations' opaque handles inherit from. -struct usb_handle { -}; +struct usb_handle {}; ADB_USB_INTERFACE(::usb_handle*); -#endif // linux host || darwin - - // USB device detection. int is_adb_interface(int usb_class, int usb_subclass, int usb_protocol); bool should_use_libusb(); + +struct UsbConnection : public BlockingConnection { + explicit UsbConnection(usb_handle* handle) : handle_(handle) {} + ~UsbConnection(); + + bool Read(apacket* packet) override final; + bool Write(apacket* packet) override final; + bool DoTlsHandshake(RSA* key, std::string* auth_key) override final; + + void Close() override final; + virtual void Reset() override final; + + usb_handle* handle_; +}; diff --git a/adb/client/usb_dispatch.cpp b/adb/client/usb_dispatch.cpp index f55ae9010..7b97117de 100644 --- a/adb/client/usb_dispatch.cpp +++ b/adb/client/usb_dispatch.cpp @@ -15,7 +15,8 @@ */ #include -#include "usb.h" + +#include "client/usb.h" void usb_init() { if (should_use_libusb()) { diff --git a/adb/client/usb_libusb.cpp b/adb/client/usb_libusb.cpp index 53f01a0ce..07cbc9418 100644 --- a/adb/client/usb_libusb.cpp +++ b/adb/client/usb_libusb.cpp @@ -14,10 +14,10 @@ * limitations under the License. */ -#include "usb.h" - #include "sysdeps.h" +#include "client/usb.h" + #include #include @@ -40,7 +40,6 @@ #include "adb.h" #include "adb_utils.h" #include "transport.h" -#include "usb.h" using android::base::StringPrintf; diff --git a/adb/client/usb_linux.cpp b/adb/client/usb_linux.cpp index 343e7b59a..95b1817dc 100644 --- a/adb/client/usb_linux.cpp +++ b/adb/client/usb_linux.cpp @@ -18,6 +18,8 @@ #include "sysdeps.h" +#include "client/usb.h" + #include #include #include @@ -48,7 +50,6 @@ #include "adb.h" #include "transport.h" -#include "usb.h" using namespace std::chrono_literals; using namespace std::literals; diff --git a/adb/client/usb_osx.cpp b/adb/client/usb_osx.cpp index 7207ca733..a93fa3a6b 100644 --- a/adb/client/usb_osx.cpp +++ b/adb/client/usb_osx.cpp @@ -18,6 +18,8 @@ #include "sysdeps.h" +#include "client/usb.h" + #include #include diff --git a/adb/client/usb_windows.cpp b/adb/client/usb_windows.cpp index 197c6fa5c..e209230c7 100644 --- a/adb/client/usb_windows.cpp +++ b/adb/client/usb_windows.cpp @@ -18,6 +18,8 @@ #include "sysdeps.h" +#include "client/usb.h" + // clang-format off #include // winsock.h *must* be included before windows.h. #include diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp index 87937fb6a..7fff05af1 100644 --- a/adb/daemon/usb.cpp +++ b/adb/daemon/usb.cpp @@ -45,19 +45,15 @@ #include #include -#include - #include "adb_unique_fd.h" #include "adb_utils.h" +#include "daemon/usb_ffs.h" #include "sysdeps/chrono.h" #include "transport.h" #include "types.h" using android::base::StringPrintf; -// We can't find out whether we have support for AIO on ffs endpoints until we submit a read. -static std::optional gFfsAioSupported; - // Not all USB controllers support operations larger than 16k, so don't go above that. // Also, each submitted operation does an allocation in the kernel of that size, so we want to // minimize our queue depth while still maintaining a deep enough queue to keep the USB stack fed. @@ -612,17 +608,10 @@ struct UsbFfsConnection : public Connection { block->pending = true; struct iocb* iocb = &block->control; if (io_submit(aio_context_.get(), 1, &iocb) != 1) { - if (errno == EINVAL && !gFfsAioSupported.has_value()) { - HandleError("failed to submit first read, AIO on FFS not supported"); - gFfsAioSupported = false; - return false; - } - HandleError(StringPrintf("failed to submit read: %s", strerror(errno))); return false; } - gFfsAioSupported = true; return true; } @@ -741,17 +730,10 @@ struct UsbFfsConnection : public Connection { static constexpr int kInterruptionSignal = SIGUSR1; }; -void usb_init_legacy(); - static void usb_ffs_open_thread() { adb_thread_setname("usb ffs open"); while (true) { - if (gFfsAioSupported.has_value() && !gFfsAioSupported.value()) { - LOG(INFO) << "failed to use nonblocking ffs, falling back to legacy"; - return usb_init_legacy(); - } - unique_fd control; unique_fd bulk_out; unique_fd bulk_in; @@ -773,13 +755,5 @@ static void usb_ffs_open_thread() { } void usb_init() { - bool use_nonblocking = android::base::GetBoolProperty( - "persist.adb.nonblocking_ffs", - android::base::GetBoolProperty("ro.adb.nonblocking_ffs", true)); - - if (use_nonblocking) { - std::thread(usb_ffs_open_thread).detach(); - } else { - usb_init_legacy(); - } + std::thread(usb_ffs_open_thread).detach(); } diff --git a/adb/daemon/usb_ffs.cpp b/adb/daemon/usb_ffs.cpp index cb7e2fb88..7bd611b66 100644 --- a/adb/daemon/usb_ffs.cpp +++ b/adb/daemon/usb_ffs.cpp @@ -18,6 +18,8 @@ #include "sysdeps.h" +#include "daemon/usb_ffs.h" + #include #include @@ -26,7 +28,6 @@ #include #include "adb.h" -#include "adbd/usb.h" #define MAX_PACKET_SIZE_FS 64 #define MAX_PACKET_SIZE_HS 512 diff --git a/adb/daemon/usb_dummy.cpp b/adb/daemon/usb_ffs.h similarity index 52% rename from adb/daemon/usb_dummy.cpp rename to adb/daemon/usb_ffs.h index c9bf79731..a19d7ccce 100644 --- a/adb/daemon/usb_dummy.cpp +++ b/adb/daemon/usb_ffs.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 The Android Open Source Project + * Copyright (C) 2020 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. @@ -14,29 +14,9 @@ * limitations under the License. */ -#include +#pragma once -#include +#include -int usb_write(usb_handle*, const void*, int) { - LOG(FATAL) << "unimplemented"; - return -1; -} - -int usb_read(usb_handle*, void*, int) { - LOG(FATAL) << "unimplemented"; - return -1; -} - -int usb_close(usb_handle*) { - LOG(FATAL) << "unimplemented"; - return -1; -} - -void usb_reset(usb_handle*) { - LOG(FATAL) << "unimplemented"; -} - -void usb_kick(usb_handle*) { - LOG(FATAL) << "unimplemented"; -} +bool open_functionfs(android::base::unique_fd* control, android::base::unique_fd* bulk_out, + android::base::unique_fd* bulk_in); diff --git a/adb/transport.cpp b/adb/transport.cpp index 460faf0ef..61467cb61 100644 --- a/adb/transport.cpp +++ b/adb/transport.cpp @@ -1454,6 +1454,7 @@ void kick_all_tcp_devices() { #endif +#if ADB_HOST void register_usb_transport(usb_handle* usb, const char* serial, const char* devpath, unsigned writeable) { atransport* t = new atransport(writeable ? kCsOffline : kCsNoPerm); @@ -1475,6 +1476,7 @@ void register_usb_transport(usb_handle* usb, const char* serial, const char* dev register_transport(t); } +#endif #if ADB_HOST // This should only be used for transports with connection_state == kCsNoPerm. diff --git a/adb/transport.h b/adb/transport.h index 5d4e2971e..5bc1b5c49 100644 --- a/adb/transport.h +++ b/adb/transport.h @@ -39,7 +39,6 @@ #include "adb.h" #include "adb_unique_fd.h" #include "types.h" -#include "usb.h" typedef std::unordered_set FeatureSet; @@ -202,20 +201,6 @@ struct FdConnection : public BlockingConnection { std::unique_ptr tls_; }; -struct UsbConnection : public BlockingConnection { - explicit UsbConnection(usb_handle* handle) : handle_(handle) {} - ~UsbConnection(); - - bool Read(apacket* packet) override final; - bool Write(apacket* packet) override final; - bool DoTlsHandshake(RSA* key, std::string* auth_key) override final; - - void Close() override final; - virtual void Reset() override final; - - usb_handle* handle_; -}; - // Waits for a transport's connection to be not pending. This is a separate // object so that the transport can be destroyed and another thread can be // notified of it in a race-free way. @@ -251,6 +236,10 @@ enum class ReconnectResult { Abort, }; +#if ADB_HOST +struct usb_handle; +#endif + class atransport : public enable_weak_from_this { public: // TODO(danalbert): We expose waaaaaaay too much stuff because this was @@ -291,8 +280,10 @@ class atransport : public enable_weak_from_this { return connection_; } +#if ADB_HOST void SetUsbHandle(usb_handle* h) { usb_handle_ = h; } usb_handle* GetUsbHandle() { return usb_handle_; } +#endif const TransportId id; @@ -399,8 +390,10 @@ class atransport : public enable_weak_from_this { // The underlying connection object. std::shared_ptr connection_ GUARDED_BY(mutex_); +#if ADB_HOST // USB handle for the connection, if available. usb_handle* usb_handle_ = nullptr; +#endif // A callback that will be invoked when the atransport needs to reconnect. ReconnectCallback reconnect_; @@ -441,8 +434,15 @@ void kick_all_transports_by_auth_key(std::string_view auth_key); #endif void register_transport(atransport* transport); -void register_usb_transport(usb_handle* h, const char* serial, - const char* devpath, unsigned writeable); + +#if ADB_HOST +void init_usb_transport(atransport* t, usb_handle* usb); +void register_usb_transport(usb_handle* h, const char* serial, const char* devpath, + unsigned writeable); + +// This should only be used for transports with connection_state == kCsNoPerm. +void unregister_usb_transport(usb_handle* usb); +#endif /* Connect to a network address and register it as a device */ void connect_device(const std::string& address, std::string* response); @@ -452,9 +452,6 @@ bool register_socket_transport(unique_fd s, std::string serial, int port, int lo atransport::ReconnectCallback reconnect, bool use_tls, int* error = nullptr); -// This should only be used for transports with connection_state == kCsNoPerm. -void unregister_usb_transport(usb_handle* usb); - bool check_header(apacket* p, atransport* t); void close_usb_devices(bool reset = false); diff --git a/fastboot/Android.bp b/fastboot/Android.bp index a757d56e5..884856dc7 100644 --- a/fastboot/Android.bp +++ b/fastboot/Android.bp @@ -115,6 +115,7 @@ cc_binary { "device/fastboot_device.cpp", "device/flashing.cpp", "device/main.cpp", + "device/usb.cpp", "device/usb_client.cpp", "device/utility.cpp", "device/variables.cpp", @@ -125,7 +126,6 @@ cc_binary { "android.hardware.boot@1.1", "android.hardware.fastboot@1.0", "android.hardware.health@2.0", - "libadbd", "libasyncio", "libbase", "libbootloader_message", diff --git a/adb/daemon/usb_legacy.cpp b/fastboot/device/usb.cpp similarity index 70% rename from adb/daemon/usb_legacy.cpp rename to fastboot/device/usb.cpp index fe80e7d59..4bee7b20c 100644 --- a/adb/daemon/usb_legacy.cpp +++ b/fastboot/device/usb.cpp @@ -14,9 +14,7 @@ * limitations under the License. */ -#define TRACE_TAG USB - -#include "sysdeps.h" +#include "usb.h" #include #include @@ -41,12 +39,9 @@ #include #include -#include "adb.h" -#include "adbd/usb.h" -#include "transport.h" - using namespace std::chrono_literals; +#define D(...) #define MAX_PACKET_SIZE_FS 64 #define MAX_PACKET_SIZE_HS 512 #define MAX_PACKET_SIZE_SS 1024 @@ -56,8 +51,6 @@ using namespace std::chrono_literals; // Number of buffers needed to fit MAX_PAYLOAD, with an extra for ZLPs. #define USB_FFS_NUM_BUFS ((4 * MAX_PAYLOAD / USB_FFS_BULK_SIZE) + 1) -static unique_fd& dummy_fd = *new unique_fd(); - static void aio_block_init(aio_block* aiob, unsigned num_bufs) { aiob->iocb.resize(num_bufs); aiob->iocbs.resize(num_bufs); @@ -82,46 +75,6 @@ static int getMaxPacketSize(int ffs_fd) { } } -static bool init_functionfs(struct usb_handle* h) { - LOG(INFO) << "initializing functionfs"; - if (!open_functionfs(&h->control, &h->bulk_out, &h->bulk_in)) { - return false; - } - - h->read_aiob.fd = h->bulk_out.get(); - h->write_aiob.fd = h->bulk_in.get(); - h->reads_zero_packets = true; - return true; -} - -static void usb_legacy_ffs_open_thread(usb_handle* usb) { - adb_thread_setname("usb legacy ffs open"); - - while (true) { - // wait until the USB device needs opening - std::unique_lock lock(usb->lock); - while (!usb->open_new_connection) { - usb->notify.wait(lock); - } - usb->open_new_connection = false; - lock.unlock(); - - while (true) { - if (init_functionfs(usb)) { - LOG(INFO) << "functionfs successfully initialized"; - break; - } - std::this_thread::sleep_for(1s); - } - - LOG(INFO) << "registering usb transport"; - register_usb_transport(usb, nullptr, nullptr, 1); - } - - // never gets here - abort(); -} - static int usb_ffs_write(usb_handle* h, const void* data, int len) { D("about to write (fd=%d, len=%d)", h->bulk_in.get(), len); @@ -129,7 +82,7 @@ static int usb_ffs_write(usb_handle* h, const void* data, int len) { int orig_len = len; while (len > 0) { int write_len = std::min(USB_FFS_BULK_SIZE, len); - int n = adb_write(h->bulk_in, buf, write_len); + int n = write(h->bulk_in, buf, write_len); if (n < 0) { D("ERROR: fd = %d, n = %d: %s", h->bulk_in.get(), n, strerror(errno)); return -1; @@ -150,7 +103,7 @@ static int usb_ffs_read(usb_handle* h, void* data, int len, bool allow_partial) unsigned count = 0; while (len > 0) { int read_len = std::min(USB_FFS_BULK_SIZE, len); - int n = adb_read(h->bulk_out, buf, read_len); + int n = read(h->bulk_out, buf, read_len); if (n < 0) { D("ERROR: fd = %d, n = %d: %s", h->bulk_out.get(), n, strerror(errno)); return -1; @@ -232,7 +185,7 @@ static int usb_ffs_do_aio(usb_handle* h, const void* data, int len, bool read) { } } -static int usb_ffs_aio_read(usb_handle* h, void* data, int len, bool allow_partial) { +static int usb_ffs_aio_read(usb_handle* h, void* data, int len, bool /* allow_partial */) { return usb_ffs_do_aio(h, data, len, true); } @@ -240,32 +193,9 @@ static int usb_ffs_aio_write(usb_handle* h, const void* data, int len) { return usb_ffs_do_aio(h, data, len, false); } -static void usb_ffs_kick(usb_handle* h) { - int err; - - err = ioctl(h->bulk_in.get(), FUNCTIONFS_CLEAR_HALT); - if (err < 0) { - D("[ kick: source (fd=%d) clear halt failed (%d) ]", h->bulk_in.get(), errno); - } - - err = ioctl(h->bulk_out.get(), FUNCTIONFS_CLEAR_HALT); - if (err < 0) { - D("[ kick: sink (fd=%d) clear halt failed (%d) ]", h->bulk_out.get(), errno); - } - - // don't close ep0 here, since we may not need to reinitialize it with - // the same descriptors again. if however ep1/ep2 fail to re-open in - // init_functionfs, only then would we close and open ep0 again. - // Ditto the comment in usb_adb_kick. - h->kicked = true; - TEMP_FAILURE_RETRY(dup2(dummy_fd.get(), h->bulk_out.get())); - TEMP_FAILURE_RETRY(dup2(dummy_fd.get(), h->bulk_in.get())); -} - static void usb_ffs_close(usb_handle* h) { LOG(INFO) << "closing functionfs transport"; - h->kicked = false; h->bulk_out.reset(); h->bulk_in.reset(); @@ -291,37 +221,6 @@ usb_handle* create_usb_handle(unsigned num_bufs, unsigned io_size) { aio_block_init(&h->write_aiob, num_bufs); } h->io_size = io_size; - h->kick = usb_ffs_kick; h->close = usb_ffs_close; return h; } - -void usb_init_legacy() { - D("[ usb_init - using legacy FunctionFS ]"); - dummy_fd.reset(adb_open("/dev/null", O_WRONLY | O_CLOEXEC)); - CHECK_NE(-1, dummy_fd.get()); - - std::thread(usb_legacy_ffs_open_thread, create_usb_handle(USB_FFS_NUM_BUFS, USB_FFS_BULK_SIZE)) - .detach(); -} - -int usb_write(usb_handle* h, const void* data, int len) { - return h->write(h, data, len); -} - -int usb_read(usb_handle* h, void* data, int len) { - return h->read(h, data, len, false /* allow_partial */); -} - -int usb_close(usb_handle* h) { - h->close(h); - return 0; -} - -void usb_reset(usb_handle* h) { - usb_close(h); -} - -void usb_kick(usb_handle* h) { - h->kick(h); -} diff --git a/adb/daemon/include/adbd/usb.h b/fastboot/device/usb.h similarity index 84% rename from adb/daemon/include/adbd/usb.h rename to fastboot/device/usb.h index 2204246c1..6c3f54252 100644 --- a/adb/daemon/include/adbd/usb.h +++ b/fastboot/device/usb.h @@ -36,17 +36,14 @@ struct aio_block { }; struct usb_handle { - usb_handle() : kicked(false) { - } + usb_handle() {} std::condition_variable notify; std::mutex lock; - std::atomic kicked; bool open_new_connection = true; int (*write)(usb_handle* h, const void* data, int len); int (*read)(usb_handle* h, void* data, int len, bool allow_partial); - void (*kick)(usb_handle* h); void (*close)(usb_handle* h); // FunctionFS @@ -63,6 +60,4 @@ struct usb_handle { size_t io_size; }; -usb_handle *create_usb_handle(unsigned num_bufs, unsigned io_size); -bool open_functionfs(android::base::unique_fd* control, android::base::unique_fd* bulk_out, - android::base::unique_fd* bulk_in); +usb_handle* create_usb_handle(unsigned num_bufs, unsigned io_size); diff --git a/fastboot/device/usb_client.h b/fastboot/device/usb_client.h index e6a1a8b8c..e702a0d22 100644 --- a/fastboot/device/usb_client.h +++ b/fastboot/device/usb_client.h @@ -17,7 +17,7 @@ #include -#include +#include "usb.h" #include "transport.h" From 2b5fa5505fb3e46d39eaa0b2b7999e19722405e1 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Mon, 30 Mar 2020 16:39:41 -0700 Subject: [PATCH 213/388] adb: temporarily kill adb_benchmark. Temporarily delete adb_benchmark, since it seems difficult to make this sensibly work with a single target that's used for both libadb and libadbd benchmarking. Bug: http://b/150317254 Test: treehugger Change-Id: Ibf81fdff4f2b7304b586ce9a7955b4bc2c11484e Merged-In: Ibf81fdff4f2b7304b586ce9a7955b4bc2c11484e (cherry picked from commit c6cb89ea80d240f12940b58f555f7eaf937a5e3b) --- adb/Android.bp | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/adb/Android.bp b/adb/Android.bp index b1ca8af7d..5f0916b3b 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -246,39 +246,6 @@ cc_test_host { }, } -cc_benchmark { - name: "adb_benchmark", - defaults: ["adb_defaults"], - - srcs: ["transport_benchmark.cpp"], - target: { - android: { - static_libs: [ - "libadbd", - ], - }, - host: { - static_libs: [ - "libadb_host", - ], - }, - }, - - static_libs: [ - "libadb_crypto_static", - "libadb_tls_connection_static", - "libadbd_auth", - "libbase", - "libcutils", - "libcrypto_utils", - "libcrypto_static", - "libdiagnose_usb", - "liblog", - "libssl", - "libusb", - ], -} - cc_binary_host { name: "adb", From 36fb67568c4464f5df29c8b2e7f54b9a4dafe56b Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 27 Mar 2020 19:41:59 -0700 Subject: [PATCH 214/388] Statically link libadbd into minadbd. Bug: http://b/150317254 Test: booted aosp_walleye-eng into recovery Change-Id: Ie479ae2fbaf1006228a531dab26c7d535ed403db Merged-In: Ie479ae2fbaf1006228a531dab26c7d535ed403db (cherry picked from commit 3735614b28af1573d96209388a05805c04957d10) --- adb/Android.bp | 94 ++++++++++++++++++------------- adb/crypto/Android.bp | 1 + adb/pairing_connection/Android.bp | 3 + adb/proto/Android.bp | 3 + adb/tls/Android.bp | 1 + 5 files changed, 64 insertions(+), 38 deletions(-) diff --git a/adb/Android.bp b/adb/Android.bp index 5f0916b3b..0af82e1d1 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -114,6 +114,44 @@ cc_defaults { }, } +cc_defaults { + name: "libadbd_binary_dependencies", + static_libs: [ + "libadb_crypto", + "libadb_pairing_connection", + "libadb_tls_connection", + "libadbd", + "libadbd_core", + "libadbconnection_server", + "libasyncio", + "libbrotli", + "libcutils_sockets", + "libdiagnose_usb", + "libmdnssd", + "libbase", + + "libadb_protos", + ], + + shared_libs: [ + "libadbd_auth", + "libadbd_fs", + "libcrypto", + "libcrypto_utils", + "liblog", + "libselinux", + ], + + target: { + recovery: { + exclude_static_libs: [ + "libadb_pairing_auth", + "libadb_pairing_connection", + ], + }, + }, +} + // libadb // ========================================================= // These files are compiled for both the host and the device. @@ -365,6 +403,7 @@ cc_library_static { "libbase", "libcrypto", "libcrypto_utils", + "libcutils_sockets", "liblog", ], @@ -418,13 +457,15 @@ cc_library { "libadb_pairing_connection", "libadb_protos", "libadb_tls_connection", - "libadbd_auth", - "libadbd_fs", "libasyncio", "libbase", - "libcrypto", "libcrypto_utils", "libcutils_sockets", + + // APEX dependencies. + "libadbd_auth", + "libadbd_fs", + "libcrypto", "liblog", ], @@ -464,25 +505,21 @@ cc_library { // libminadbd wants both, as it's used to build native tests. compile_multilib: "both", - // libadbd doesn't build any additional source, but to expose libadbd_core as a shared library. - whole_static_libs: [ - "libadbconnection_server", - "libadbd_core", - ], - shared_libs: [ "libadb_crypto", "libadb_pairing_connection", "libadb_tls_connection", - "libadbd_auth", - "libadbd_fs", - "libadbd_services", "libasyncio", "libbase", "libcrypto", "libcrypto_utils", "liblog", "libselinux", + + // APEX dependencies on the system image. + "libadbd_auth", + "libadbd_fs", + "libadbd_services", ], target: { @@ -495,6 +532,7 @@ cc_library { }, static_libs: [ + "libadbd_core", "libbrotli", "libcutils_sockets", "libdiagnose_usb", @@ -509,7 +547,7 @@ cc_library { cc_binary { name: "adbd", - defaults: ["adbd_defaults", "host_adbd_supported"], + defaults: ["adbd_defaults", "host_adbd_supported", "libadbd_binary_dependencies"], stl: "libc++_static", recovery_available: true, @@ -527,31 +565,17 @@ cc_binary { }, static_libs: [ - "libadb_crypto", - "libadb_tls_connection", - "libadbconnection_server", "libadbd", "libadbd_services", "libasyncio", - "libbase", - "libbrotli", "libcap", - "libcrypto_utils", - "libcutils_sockets", - "libdiagnose_usb", - "libmdnssd", "libminijail", "libssl", ], shared_libs: [ - "libadb_pairing_connection", "libadb_protos", "libadbd_auth", - "libadbd_fs", - "libcrypto", - "liblog", - "libselinux", ], target: { @@ -623,8 +647,7 @@ cc_binary { cc_test { name: "adbd_test", - defaults: ["adbd_defaults"], - stl: "libc++_static", + defaults: ["adbd_defaults", "libadbd_binary_dependencies"], recovery_available: false, srcs: libadb_test_srcs + [ @@ -635,21 +658,16 @@ cc_test { "shell_service_protocol_test.cpp", ], + shared_libs: [ + "liblog", + ], + static_libs: [ "libadbd", "libadbd_auth", - "libadb_crypto_static", - "libadb_pairing_connection_static", - "libadb_tls_connection_static", "libbase", "libcrypto_utils", - "libcrypto_static", - "libcutils_sockets", - "libdiagnose_usb", - "liblog", "libusb", - "libmdnssd", - "libselinux", ], test_suites: ["device-tests", "mts"], require_root: true, diff --git a/adb/crypto/Android.bp b/adb/crypto/Android.bp index ce1de4a52..9d14b030a 100644 --- a/adb/crypto/Android.bp +++ b/adb/crypto/Android.bp @@ -40,6 +40,7 @@ cc_defaults { visibility: [ "//system/core/adb:__subpackages__", + "//bootable/recovery/minadbd:__subpackages__", ], host_supported: true, diff --git a/adb/pairing_connection/Android.bp b/adb/pairing_connection/Android.bp index bcde7b1f2..707161bcb 100644 --- a/adb/pairing_connection/Android.bp +++ b/adb/pairing_connection/Android.bp @@ -41,6 +41,9 @@ cc_defaults { "//art:__subpackages__", "//system/core/adb:__subpackages__", "//frameworks/base/services:__subpackages__", + + // This needs to be visible to minadbd, even though it's removed via exclude_shared_libs. + "//bootable/recovery/minadbd:__subpackages__", ], apex_available: [ "com.android.adbd", diff --git a/adb/proto/Android.bp b/adb/proto/Android.bp index a7e5d9ca1..f7cba9522 100644 --- a/adb/proto/Android.bp +++ b/adb/proto/Android.bp @@ -41,6 +41,9 @@ cc_defaults { visibility: [ "//system/core/adb:__subpackages__", + + // This needs to be visible to minadbd, even though it's removed via exclude_shared_libs. + "//bootable/recovery/minadbd:__subpackages__", ], stl: "libc++_static", diff --git a/adb/tls/Android.bp b/adb/tls/Android.bp index f2837e11d..e5204f343 100644 --- a/adb/tls/Android.bp +++ b/adb/tls/Android.bp @@ -39,6 +39,7 @@ cc_defaults { recovery_available: true, visibility: [ + "//bootable/recovery/minadbd:__subpackages__", "//system/core/adb:__subpackages__", ], From 9fd393f4307ce2cdf0f4ecf2cf463f77e4974707 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Mon, 30 Mar 2020 23:39:57 +0100 Subject: [PATCH 215/388] Make init.userspace_reboot.is_supported a rw property General recommendation is to avoid read-only properties, and instead control "read-onlines" by only allowing init/vendor_init to set the property. Since ro.init.userspace_reboot.is_supported was added in this release, and nobody outside of the platform is querying it directly, it should be fine to simply rename it. Test: adb shell getprop init.userspace_reboot.is_supported Test: atest CtsUserspaceRebootHostSideTestCases Bug: 152803929 Change-Id: I7552d5ccc6e9b750a6081947eef8fcb027be13e1 Merged-In: I7552d5ccc6e9b750a6081947eef8fcb027be13e1 (cherry picked from commit 663cd35030d4d17625d896ef008b484b792619fe) --- init/sysprop/InitProperties.sysprop | 2 +- init/sysprop/api/com.android.sysprop.init-current.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/init/sysprop/InitProperties.sysprop b/init/sysprop/InitProperties.sysprop index b876dc0c3..24c2434d0 100644 --- a/init/sysprop/InitProperties.sysprop +++ b/init/sysprop/InitProperties.sysprop @@ -31,6 +31,6 @@ prop { type: Boolean scope: Public access: Readonly - prop_name: "ro.init.userspace_reboot.is_supported" + prop_name: "init.userspace_reboot.is_supported" integer_as_bool: true } diff --git a/init/sysprop/api/com.android.sysprop.init-current.txt b/init/sysprop/api/com.android.sysprop.init-current.txt index b8bcef997..01f4e9a91 100644 --- a/init/sysprop/api/com.android.sysprop.init-current.txt +++ b/init/sysprop/api/com.android.sysprop.init-current.txt @@ -2,7 +2,7 @@ props { module: "android.sysprop.InitProperties" prop { api_name: "is_userspace_reboot_supported" - prop_name: "ro.init.userspace_reboot.is_supported" + prop_name: "init.userspace_reboot.is_supported" integer_as_bool: true } prop { From ab9dfa43211a4ac07523eb9dbd15006be23e7f76 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Mon, 30 Mar 2020 13:27:50 +0900 Subject: [PATCH 216/388] Add min_sdk_version:R to updatable apexes APEXes introduced in R need to set min_sdk_version to ensure that they are built against correct version(30 or R) of stubs (libc/liblog/...). Bug: 152655956 Test: /vendor/google/build/build_mainline_modules.sh Change-Id: Id3f94a2ac09bd7bf7f9a4a0c2f62b624f29509d0 --- adb/apex/Android.bp | 1 + 1 file changed, 1 insertion(+) diff --git a/adb/apex/Android.bp b/adb/apex/Android.bp index 4346f6778..ddb17dac1 100644 --- a/adb/apex/Android.bp +++ b/adb/apex/Android.bp @@ -1,6 +1,7 @@ apex_defaults { name: "com.android.adbd-defaults", updatable: true, + min_sdk_version: "R", binaries: ["adbd"], compile_multilib: "both", From 767c723c25ad11af5de5a99be22ddcc082bcb29b Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Wed, 1 Apr 2020 22:02:49 -0700 Subject: [PATCH 217/388] rootdir/init.rc: enable iostat by default Bug: 152162885 Signed-off-by: Jaegeuk Kim Change-Id: If95e30c7d3bfec621dfde9452a6eda5211c64a2b --- rootdir/init.rc | 1 + 1 file changed, 1 insertion(+) diff --git a/rootdir/init.rc b/rootdir/init.rc index 53d9f8f6d..b5a75d56e 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -856,6 +856,7 @@ on boot # are not aware of using fsync()/sync() to prepare sudden power-cut. write /sys/fs/f2fs/${dev.mnt.blk.data}/cp_interval 200 write /sys/fs/f2fs/${dev.mnt.blk.data}/gc_urgent_sleep_time 50 + write /sys/fs/f2fs/${dev.mnt.blk.data}/iostat_enable 1 # limit discard size to 128MB in order to avoid long IO latency # for filesystem tuning first (dm or sda) From 6bd3bc8d015816eb0174ede8d0e8b7cfaa6569cd Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Tue, 31 Mar 2020 01:28:35 +0100 Subject: [PATCH 218/388] Properly fail userspace reboot if it's not supported Previously, after `adb reboot userspace` is called on a device that doesn't suppor it, init would've logged an error and quietly exit the shutdown sequence. This was leaving adb handing forever. With this approach, init will fail setprop "sys.powerctl=reboot,userspace" in case userspace reboot is not supported. Test: adb root Test: adb setprop init.userspace_reboot.is_supported 0 Test: adb reboot userspace Test: atest CtsInitTestCases Bug: 146639622 Change-Id: I1264078f53ed3ff54638c7f3b6846b7437f98ee5 Merged-In: I1264078f53ed3ff54638c7f3b6846b7437f98ee5 (cherry picked from commit 92116e4129812eccb32d7a20208e03be7ee2ec75) --- init/property_service.cpp | 6 ++++++ init/property_service_test.cpp | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/init/property_service.cpp b/init/property_service.cpp index a5fea7cd6..a89504e59 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -47,6 +47,7 @@ #include #include +#include #include #include #include @@ -85,6 +86,7 @@ using android::properties::BuildTrie; using android::properties::ParsePropertyInfoFile; using android::properties::PropertyInfoAreaFile; using android::properties::PropertyInfoEntry; +using android::sysprop::InitProperties::is_userspace_reboot_supported; namespace android { namespace init { @@ -489,6 +491,10 @@ uint32_t HandlePropertySet(const std::string& name, const std::string& value, } LOG(INFO) << "Received sys.powerctl='" << value << "' from pid: " << cr.pid << process_log_string; + if (value == "reboot,userspace" && !is_userspace_reboot_supported().value_or(false)) { + *error = "Userspace reboot is not supported by this device"; + return PROP_ERROR_INVALID_VALUE; + } } // If a process other than init is writing a non-empty value, it means that process is diff --git a/init/property_service_test.cpp b/init/property_service_test.cpp index 0f4cd0d1f..c6dcfa257 100644 --- a/init/property_service_test.cpp +++ b/init/property_service_test.cpp @@ -22,8 +22,10 @@ #include #include +#include #include +using android::base::GetProperty; using android::base::SetProperty; namespace android { @@ -74,5 +76,19 @@ TEST(property_service, non_utf8_value) { EXPECT_TRUE(SetProperty("property_service_utf8_test", "\xF0\x90\x80\x80")); } +TEST(property_service, userspace_reboot_not_supported) { + if (getuid() != 0) { + GTEST_SKIP() << "Skipping test, must be run as root."; + return; + } + const std::string original_value = GetProperty("init.userspace_reboot.is_supported", ""); + auto guard = android::base::make_scope_guard([&original_value]() { + SetProperty("init.userspace_reboot.is_supported", original_value); + }); + + ASSERT_TRUE(SetProperty("init.userspace_reboot.is_supported", "false")); + EXPECT_FALSE(SetProperty("sys.powerctl", "reboot,userspace")); +} + } // namespace init } // namespace android From 1a17a365461bd77c80d2c9f656c7df84cff5fc2d Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Tue, 31 Mar 2020 23:47:45 +0100 Subject: [PATCH 219/388] Improve logging in bootstat. This should help in debugging issues related to the mismatch between actual last reboot reason property and the expected one (see attached bug). Test: adb reboot Test: adb logcat | grep bootstat Bug: 152900920 Change-Id: I085cf1fb80a30389fd3ba821d40b6111a3294d95 Merged-In: I085cf1fb80a30389fd3ba821d40b6111a3294d95 (cherry picked from commit 49062f3b726cc71b10916d715881156ec6b94ef3) --- bootstat/bootstat.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/bootstat/bootstat.cpp b/bootstat/bootstat.cpp index a9c1676d9..5d6cee43c 100644 --- a/bootstat/bootstat.cpp +++ b/bootstat/bootstat.cpp @@ -1238,16 +1238,26 @@ void SetSystemBootReason() { // Shift last_reboot_reason_property to last_last_reboot_reason_property std::string last_boot_reason; if (!android::base::ReadFileToString(last_reboot_reason_file, &last_boot_reason)) { + PLOG(ERROR) << "Failed to read " << last_reboot_reason_file; last_boot_reason = android::base::GetProperty(last_reboot_reason_property, ""); + LOG(INFO) << "Value of " << last_reboot_reason_property << " : " << last_boot_reason; + } else { + LOG(INFO) << "Last reboot reason read from " << last_reboot_reason_file << " : " + << last_boot_reason << ". Last reboot reason read from " + << last_reboot_reason_property << " : " + << android::base::GetProperty(last_reboot_reason_property, ""); } if (last_boot_reason.empty() || isKernelRebootReason(system_boot_reason)) { last_boot_reason = system_boot_reason; } else { transformReason(last_boot_reason); } + LOG(INFO) << "Normalized last reboot reason : " << last_boot_reason; android::base::SetProperty(last_last_reboot_reason_property, last_boot_reason); android::base::SetProperty(last_reboot_reason_property, ""); - unlink(last_reboot_reason_file); + if (unlink(last_reboot_reason_file) != 0) { + PLOG(ERROR) << "Failed to unlink " << last_reboot_reason_file; + } } // Gets the boot time offset. This is useful when Android is running in a From 6288212ac3e1f81133b61a3635e78e2fd8af7b85 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Tue, 31 Mar 2020 16:31:37 -0700 Subject: [PATCH 220/388] init: don't sync() before shutting down services Devices in the lab are hitting an issue where they're getting stuck likely in the sync() call in DoReboot() before we start the reboot monitor thread and before we shut down services. It's possible that concurrent writing to RW file systems is causing this sync() call to take essentially forever. To protect against this, we need to remove this sync(). Note that we will still call sync() after shutting down services. Note that the service shutdown code has a timeout and there is a reboot monitor thread that will shutdown the device if more than 30 seconds pass above that timeout. This change increases that timeout to 300 seconds to give the final sync() calls explicitly more time to finish. Bug: 150863651 Test: reboot functions normally Test: put an infinite loop in DoReboot and the the reboot monitor thread triggers and shuts down the device appropriately Merged-In: I6fd7d3a25d3225081388e39a14c9fdab21b592ba Change-Id: I6fd7d3a25d3225081388e39a14c9fdab21b592ba (cherry picked from commit 10615eb3973a9d7cf9e15b3c8a23907f15021200) --- init/reboot.cpp | 53 ++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/init/reboot.cpp b/init/reboot.cpp index 081f6953a..d2dc6d350 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -102,7 +102,15 @@ static void PersistRebootReason(const char* reason, bool write_to_property) { if (write_to_property) { SetProperty(LAST_REBOOT_REASON_PROPERTY, reason); } - WriteStringToFile(reason, LAST_REBOOT_REASON_FILE); + auto fd = unique_fd(TEMP_FAILURE_RETRY(open( + LAST_REBOOT_REASON_FILE, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_BINARY, 0666))); + if (!fd.ok()) { + PLOG(ERROR) << "Could not open '" << LAST_REBOOT_REASON_FILE + << "' to persist reboot reason"; + return; + } + WriteStringToFd(reason, fd); + fsync(fd.get()); } // represents umount status during reboot / shutdown. @@ -317,9 +325,9 @@ void RebootMonitorThread(unsigned int cmd, const std::string& reboot_target, bool* reboot_monitor_run) { unsigned int remaining_shutdown_time = 0; - // 30 seconds more than the timeout passed to the thread as there is a final Umount pass + // 300 seconds more than the timeout passed to the thread as there is a final Umount pass // after the timeout is reached. - constexpr unsigned int shutdown_watchdog_timeout_default = 30; + constexpr unsigned int shutdown_watchdog_timeout_default = 300; auto shutdown_watchdog_timeout = android::base::GetUintProperty( "ro.build.shutdown.watchdog.timeout", shutdown_watchdog_timeout_default); remaining_shutdown_time = shutdown_watchdog_timeout + shutdown_timeout.count() / 1000; @@ -539,26 +547,6 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str Timer t; LOG(INFO) << "Reboot start, reason: " << reason << ", reboot_target: " << reboot_target; - // Ensure last reboot reason is reduced to canonical - // alias reported in bootloader or system boot reason. - size_t skip = 0; - std::vector reasons = Split(reason, ","); - if (reasons.size() >= 2 && reasons[0] == "reboot" && - (reasons[1] == "recovery" || reasons[1] == "bootloader" || reasons[1] == "cold" || - reasons[1] == "hard" || reasons[1] == "warm")) { - skip = strlen("reboot,"); - } - PersistRebootReason(reason.c_str() + skip, true); - sync(); - - // If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to - // worry about unmounting it. - if (!IsDataMounted()) { - sync(); - RebootSystem(cmd, reboot_target); - abort(); - } - bool is_thermal_shutdown = cmd == ANDROID_RB_THERMOFF; auto shutdown_timeout = 0ms; @@ -591,6 +579,25 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str // Start reboot monitor thread sem_post(&reboot_semaphore); + // Ensure last reboot reason is reduced to canonical + // alias reported in bootloader or system boot reason. + size_t skip = 0; + std::vector reasons = Split(reason, ","); + if (reasons.size() >= 2 && reasons[0] == "reboot" && + (reasons[1] == "recovery" || reasons[1] == "bootloader" || reasons[1] == "cold" || + reasons[1] == "hard" || reasons[1] == "warm")) { + skip = strlen("reboot,"); + } + PersistRebootReason(reason.c_str() + skip, true); + + // If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to + // worry about unmounting it. + if (!IsDataMounted()) { + sync(); + RebootSystem(cmd, reboot_target); + abort(); + } + // watchdogd is a vendor specific component but should be alive to complete shutdown safely. const std::set to_starts{"watchdogd"}; std::vector stop_first; From 1aa0274299fa69381d77bad3d3848291b5b8aeeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Thu, 2 Apr 2020 03:07:44 +0000 Subject: [PATCH 221/388] NetlinkEvent - ignore captive portal and pref64 nd user opts These are provided to userspace by newer kernels. Test: builds Bug: 150648313 Change-Id: I811c75e9a4739db149f502b9a43c99a8ed883341 Merged-In: I811c75e9a4739db149f502b9a43c99a8ed883341 --- libsysutils/src/NetlinkEvent.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libsysutils/src/NetlinkEvent.cpp b/libsysutils/src/NetlinkEvent.cpp index 2351afa8e..5efe03f13 100644 --- a/libsysutils/src/NetlinkEvent.cpp +++ b/libsysutils/src/NetlinkEvent.cpp @@ -529,6 +529,10 @@ bool NetlinkEvent::parseNdUserOptMessage(const struct nlmsghdr *nh) { free(buf); } else if (opthdr->nd_opt_type == ND_OPT_DNSSL) { // TODO: support DNSSL. + } else if (opthdr->nd_opt_type == ND_OPT_CAPTIVE_PORTAL) { + // TODO: support CAPTIVE PORTAL. + } else if (opthdr->nd_opt_type == ND_OPT_PREF64) { + // TODO: support PREF64. } else { SLOGD("Unknown ND option type %d\n", opthdr->nd_opt_type); return false; From 427a60e5925f50274805479262b309bb738e6f78 Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Fri, 3 Apr 2020 18:50:27 +0100 Subject: [PATCH 222/388] Revert "Add "com.android.os.statsd" to libprocessgroup apex_available" This reverts commit 2b859925eaa5ac6ffc04a16f8c6a7a692dfc6db9. Reason for revert: Not needed The original change was made in an attempt to close a perceived hole in the apex availability checking. However, there is no such hole and so this change is unnecessary. While there is a dependency path from the apex to this module one of the dependencies in that path is from a static library to a shared library. That dependency does not result in the code that includes the static library being linked to the shared library at either build time or runtime. Therefore, the shared library is not part of the APEX and so does not need to be marked as such. Bug: 152762638 Test: m droid Change-Id: I77c3b23d28eca99fcb133cb38eb8863277ac7179 --- libprocessgroup/Android.bp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libprocessgroup/Android.bp b/libprocessgroup/Android.bp index 69533d7c6..618a5c57a 100644 --- a/libprocessgroup/Android.bp +++ b/libprocessgroup/Android.bp @@ -23,10 +23,6 @@ cc_library { "task_profiles.cpp", ], name: "libprocessgroup", - apex_available: [ - "//apex_available:platform", - "com.android.os.statsd", - ], host_supported: true, native_bridge_supported: true, recovery_available: true, From 59f0acc14669677619008de22910823c289a8c36 Mon Sep 17 00:00:00 2001 From: Bill Peckham Date: Wed, 1 Apr 2020 14:29:12 -0700 Subject: [PATCH 223/388] Ignore functionfs mounts. Vendors may add additional functionfs mounts. Since these will never be remounted, we can safely filter these out. Bug: 153008210 Test: Test device with previously unfiltered entries. Change-Id: I7f384b8a0ce93dd6701fe3c4d9dd2557370b31e1 Merged-In: I7f384b8a0ce93dd6701fe3c4d9dd2557370b31e1 --- fs_mgr/tests/adb-remount-test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/fs_mgr/tests/adb-remount-test.sh b/fs_mgr/tests/adb-remount-test.sh index cf324fe8f..82c42629d 100755 --- a/fs_mgr/tests/adb-remount-test.sh +++ b/fs_mgr/tests/adb-remount-test.sh @@ -732,6 +732,7 @@ skip_administrative_mounts() { grep -v \ -e "^\(overlay\|tmpfs\|none\|sysfs\|proc\|selinuxfs\|debugfs\|bpf\) " \ -e "^\(binfmt_misc\|cg2_bpf\|pstore\|tracefs\|adb\|mtp\|ptp\|devpts\) " \ + -e " functionfs " \ -e "^\(/data/media\|/dev/block/loop[0-9]*\) " \ -e "^rootfs / rootfs rw," \ -e " /\(cache\|mnt/scratch\|mnt/vendor/persist\|persist\|metadata\) " From fbf30e4155344cbbc33138c0a14eb250314a25ea Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 3 Apr 2020 10:12:44 -0700 Subject: [PATCH 224/388] adb: add implementation of mempcpy for deficient platforms. Bug: http://b/150827486 Test: none Change-Id: Ic2f4e1c85c9f02e804d849c6cb60b22e15e981d6 (cherry picked from commit 0aafa0f714ffb2afe43712abb1098cc4318ed02d) --- adb/sysdeps.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/adb/sysdeps.h b/adb/sysdeps.h index 3e781b8ac..6ce5098cb 100644 --- a/adb/sysdeps.h +++ b/adb/sysdeps.h @@ -42,6 +42,12 @@ #include "sysdeps/network.h" #include "sysdeps/stat.h" +#if defined(__APPLE__) +static void* mempcpy(void* dst, const void* src, size_t n) { + return static_cast(memcpy(dst, src, n)) + n; +} +#endif + #ifdef _WIN32 // Clang-only nullability specifiers From 6e285ae4a738d87c27eaaea9a9558fdb19f89cba Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Fri, 3 Apr 2020 12:02:38 -0700 Subject: [PATCH 225/388] libsnapshot: Add VTS10 VtsLibsnapshotTest Add VTS10 variant of vts_libsnapshot_test so that it can be added to vts-kernel test. Bug: 142513589 Test: vts10-tradefed run vts-kernel -m VtsLibnsapshotTest Change-Id: I4e2516b94d84acb16f595aab87dd3c0cadad6166 (cherry picked from commit 405da5a9a66c2bd7ef0ebfae7b8c792630b6e647) Merged-In: I4e2516b94d84acb16f595aab87dd3c0cadad6166 --- fs_mgr/libsnapshot/Android.bp | 6 +++++ fs_mgr/libsnapshot/VtsLibsnapshotTest.xml | 29 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 fs_mgr/libsnapshot/VtsLibsnapshotTest.xml diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp index d670ca064..996fbcae6 100644 --- a/fs_mgr/libsnapshot/Android.bp +++ b/fs_mgr/libsnapshot/Android.bp @@ -195,6 +195,12 @@ cc_test { defaults: ["libsnapshot_test_defaults"], } +// For VTS 10 +vts_config { + name: "VtsLibsnapshotTest", + test_config: "VtsLibsnapshotTest.xml" +} + cc_binary { name: "snapshotctl", srcs: [ diff --git a/fs_mgr/libsnapshot/VtsLibsnapshotTest.xml b/fs_mgr/libsnapshot/VtsLibsnapshotTest.xml new file mode 100644 index 000000000..b53b51e88 --- /dev/null +++ b/fs_mgr/libsnapshot/VtsLibsnapshotTest.xml @@ -0,0 +1,29 @@ + + + + From 283128f26a532ad22d38d3f5de04470ae1e39820 Mon Sep 17 00:00:00 2001 From: Will McVicker Date: Mon, 6 Apr 2020 10:29:36 -0700 Subject: [PATCH 226/388] first_stage_init: increase serial console tries to 50 tl,dr; Increase the attempts to 50 to reduce the chances of failing to load the serial console. This will only happen if the cmdline parameter "androidboot.first_stage_console=1" is enabled. Details: 10 attempts only amounts to about 1 second of trying to open the serial console. I tested booting an ACK GKI image 5x with 20 vendor modules and found the serial console loaded on attempt 17 for all five boot tests. Bug: 153354917 Test: boot ACK image 5x and verify serial console comes up Change-Id: I161a4176b2c6cf7b0bc1eefe072ff38b894add5d --- init/first_stage_init.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init/first_stage_init.cpp b/init/first_stage_init.cpp index bd71cb554..438b44e04 100644 --- a/init/first_stage_init.cpp +++ b/init/first_stage_init.cpp @@ -107,7 +107,7 @@ void StartConsole() { return; } int fd = -1; - int tries = 10; + int tries = 50; // should timeout after 5s // The device driver for console may not be ready yet so retry for a while in case of failure. while (tries--) { fd = open("/dev/console", O_RDWR); From 12c7aa8ace0e18f53bcbf88a15e94f2b15e8b70f Mon Sep 17 00:00:00 2001 From: Dan Shi Date: Sun, 5 Apr 2020 23:55:10 -0700 Subject: [PATCH 227/388] Remove vts10 tests from vts suite The tests are only needed in vts10 suite, as they are part of CTS package and no longer needed in vts 11. Bug: 151896491 Test: local build Exempt-From-Owner-Approval: This CL removes vts10 tests from vts suite. It won't change test logic or behavior. Change-Id: I4d468be075b54213b56c7e1aa94af94f2bdce9ff Merged-In: I4d468be075b54213b56c7e1aa94af94f2bdce9ff --- fs_mgr/tests/Android.bp | 2 +- init/Android.bp | 2 +- liblog/tests/Android.bp | 2 +- logd/tests/Android.bp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fs_mgr/tests/Android.bp b/fs_mgr/tests/Android.bp index 4f6ec5a24..f68ab87cc 100644 --- a/fs_mgr/tests/Android.bp +++ b/fs_mgr/tests/Android.bp @@ -17,7 +17,7 @@ cc_test { test_suites: [ "cts", "device-tests", - "vts", + "vts10", ], compile_multilib: "both", multilib: { diff --git a/init/Android.bp b/init/Android.bp index 9053c390a..1b3aa18ea 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -258,7 +258,7 @@ cc_test { test_suites: [ "cts", "device-tests", - "vts", + "vts10", ], } diff --git a/liblog/tests/Android.bp b/liblog/tests/Android.bp index b4bb77f66..385b079e4 100644 --- a/liblog/tests/Android.bp +++ b/liblog/tests/Android.bp @@ -96,7 +96,7 @@ cc_test { cflags: ["-DNO_PSTORE"], test_suites: [ "cts", - "vts", + "vts10", ], } diff --git a/logd/tests/Android.bp b/logd/tests/Android.bp index d39da8a27..9a5defa17 100644 --- a/logd/tests/Android.bp +++ b/logd/tests/Android.bp @@ -63,6 +63,6 @@ cc_test { }, test_suites: [ "cts", - "vts", + "vts10", ], } From a7b9a2bfd26daa7cc599c6c6711677b1aa0b285a Mon Sep 17 00:00:00 2001 From: Dan Shi Date: Mon, 6 Apr 2020 16:11:29 -0700 Subject: [PATCH 228/388] Rename vts-core to vts Bug: 151896491 Test: presubmit check Exempt-From-Owner-Approval: This CL renames suite name vts-core to vts. It won't change test logic or behavior. Change-Id: I24779951257ce37fc18929f214d3cf5f76c23a19 --- fastboot/fuzzy_fastboot/Android.bp | 2 +- fs_mgr/libdm/Android.bp | 2 +- fs_mgr/libfiemap/Android.bp | 2 +- fs_mgr/liblp/Android.bp | 2 +- fs_mgr/liblp/liblp_test.xml | 1 - fs_mgr/libsnapshot/Android.bp | 2 +- libcutils/Android.bp | 2 +- 7 files changed, 6 insertions(+), 7 deletions(-) diff --git a/fastboot/fuzzy_fastboot/Android.bp b/fastboot/fuzzy_fastboot/Android.bp index bb54fd983..aa449b2fb 100644 --- a/fastboot/fuzzy_fastboot/Android.bp +++ b/fastboot/fuzzy_fastboot/Android.bp @@ -49,6 +49,6 @@ cc_test_host { auto_gen_config: false, test_suites: [ "general-tests", - "vts-core", + "vts", ], } diff --git a/fs_mgr/libdm/Android.bp b/fs_mgr/libdm/Android.bp index 910c4fc6b..d5b59cc50 100644 --- a/fs_mgr/libdm/Android.bp +++ b/fs_mgr/libdm/Android.bp @@ -79,7 +79,7 @@ cc_test { cc_test { name: "vts_libdm_test", defaults: ["libdm_test_defaults"], - test_suites: ["vts-core"], + test_suites: ["vts"], test_min_api_level: 29, } diff --git a/fs_mgr/libfiemap/Android.bp b/fs_mgr/libfiemap/Android.bp index 2fd463c3f..f6c2b5aa0 100644 --- a/fs_mgr/libfiemap/Android.bp +++ b/fs_mgr/libfiemap/Android.bp @@ -80,7 +80,7 @@ cc_test { "fiemap_writer_test.cpp", ], - test_suites: ["vts-core", "device-tests"], + test_suites: ["vts", "device-tests"], auto_gen_config: true, test_min_api_level: 29, require_root: true, diff --git a/fs_mgr/liblp/Android.bp b/fs_mgr/liblp/Android.bp index ea0fca83f..20349dc03 100644 --- a/fs_mgr/liblp/Android.bp +++ b/fs_mgr/liblp/Android.bp @@ -97,7 +97,7 @@ cc_test { cc_test { name: "vts_core_liblp_test", defaults: ["liblp_test_defaults"], - test_suites: ["vts-core"], + test_suites: ["vts"], auto_gen_config: true, test_min_api_level: 29, require_root: true, diff --git a/fs_mgr/liblp/liblp_test.xml b/fs_mgr/liblp/liblp_test.xml index d9ee12eac..98414b109 100644 --- a/fs_mgr/liblp/liblp_test.xml +++ b/fs_mgr/liblp/liblp_test.xml @@ -19,7 +19,6 @@