diff options
-rw-r--r-- | Android.bp | 5 | ||||
-rw-r--r-- | boot_control/libboot_control.cpp | 4 | ||||
-rw-r--r-- | bootloader_message/include/bootloader_message/bootloader_message.h | 6 | ||||
-rw-r--r-- | install/Android.bp | 2 | ||||
-rw-r--r-- | install/include/install/snapshot_utils.h | 21 | ||||
-rw-r--r-- | install/snapshot_utils.cpp | 49 | ||||
-rw-r--r-- | install/wipe_data.cpp | 7 | ||||
-rw-r--r-- | update_verifier/update_verifier.cpp | 4 |
8 files changed, 95 insertions, 3 deletions
diff --git a/Android.bp b/Android.bp index d78c3fa94..a8e032e21 100644 --- a/Android.bp +++ b/Android.bp @@ -58,12 +58,16 @@ cc_defaults { ], shared_libs: [ + "android.hardware.boot@1.0", + "android.hardware.boot@1.1", "libbase", "libbootloader_message", "libcrypto", "libcutils", "libfs_mgr", + "liblp", "liblog", + "libprotobuf-cpp-lite", "libziparchive", ], @@ -73,6 +77,7 @@ cc_defaults { "libminui", "librecovery_utils", "libotautil", + "libsnapshot_nobinder", ], } diff --git a/boot_control/libboot_control.cpp b/boot_control/libboot_control.cpp index 702183979..ab9ce971b 100644 --- a/boot_control/libboot_control.cpp +++ b/boot_control/libboot_control.cpp @@ -365,13 +365,15 @@ bool InitMiscVirtualAbMessageIfNeeded() { return false; } - if (message.version == MISC_VIRTUAL_AB_MESSAGE_VERSION) { + if (message.version == MISC_VIRTUAL_AB_MESSAGE_VERSION && + message.magic == MISC_VIRTUAL_AB_MAGIC_HEADER) { // Already initialized. return true; } message = {}; message.version = MISC_VIRTUAL_AB_MESSAGE_VERSION; + message.magic = MISC_VIRTUAL_AB_MAGIC_HEADER; if (!WriteMiscVirtualAbMessage(message, &err)) { LOG(ERROR) << "Could not write merge status: " << err; return false; diff --git a/bootloader_message/include/bootloader_message/bootloader_message.h b/bootloader_message/include/bootloader_message/bootloader_message.h index a27e80bcc..9a482d423 100644 --- a/bootloader_message/include/bootloader_message/bootloader_message.h +++ b/bootloader_message/include/bootloader_message/bootloader_message.h @@ -189,12 +189,14 @@ static_assert(sizeof(struct bootloader_control) == // must be added to the end. struct misc_virtual_ab_message { uint8_t version; + uint32_t magic; uint8_t merge_status; // IBootControl 1.1, MergeStatus enum. uint8_t source_slot; // Slot number when merge_status was written. - uint8_t reserved[61]; + uint8_t reserved[57]; } __attribute__((packed)); -#define MISC_VIRTUAL_AB_MESSAGE_VERSION 1 +#define MISC_VIRTUAL_AB_MESSAGE_VERSION 2 +#define MISC_VIRTUAL_AB_MAGIC_HEADER 0x56740AB0 #if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) static_assert(sizeof(struct misc_virtual_ab_message) == 64, diff --git a/install/Android.bp b/install/Android.bp index d4606e92c..be08506e5 100644 --- a/install/Android.bp +++ b/install/Android.bp @@ -39,6 +39,7 @@ cc_defaults { static_libs: [ "librecovery_utils", "libotautil", + "libsnapshot_nobinder", // external dependencies "libvintf_recovery", @@ -60,6 +61,7 @@ cc_library_static { "fuse_install.cpp", "install.cpp", "package.cpp", + "snapshot_utils.cpp", "verifier.cpp", "wipe_data.cpp", "wipe_device.cpp", diff --git a/install/include/install/snapshot_utils.h b/install/include/install/snapshot_utils.h new file mode 100644 index 000000000..00c3ef7e1 --- /dev/null +++ b/install/include/install/snapshot_utils.h @@ -0,0 +1,21 @@ +/* + * 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 "recovery_ui/device.h" + +bool FinishPendingSnapshotMerges(Device* device); diff --git a/install/snapshot_utils.cpp b/install/snapshot_utils.cpp new file mode 100644 index 000000000..69da5eea0 --- /dev/null +++ b/install/snapshot_utils.cpp @@ -0,0 +1,49 @@ + +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <android-base/properties.h> +#include <libsnapshot/snapshot.h> + +#include "recovery_ui/device.h" +#include "recovery_ui/ui.h" +#include "recovery_utils/roots.h" + +using android::snapshot::SnapshotManager; + +bool FinishPendingSnapshotMerges(Device* device) { + if (!android::base::GetBoolProperty("ro.virtual_ab.enabled", false)) { + return true; + } + + RecoveryUI* ui = device->GetUI(); + auto sm = SnapshotManager::NewForFirstStageMount(); + if (!sm) { + ui->Print("Could not create SnapshotManager.\n"); + return false; + } + + auto callback = [&]() -> void { + double progress; + sm->GetUpdateState(&progress); + ui->Print("Waiting for merge to complete: %.2f\n", progress); + }; + if (!sm->HandleImminentDataWipe(callback)) { + ui->Print("Unable to check merge status and/or complete update merge.\n"); + return false; + } + return true; +} diff --git a/install/wipe_data.cpp b/install/wipe_data.cpp index 82660bef0..287208583 100644 --- a/install/wipe_data.cpp +++ b/install/wipe_data.cpp @@ -27,6 +27,7 @@ #include <android-base/logging.h> #include <android-base/stringprintf.h> +#include "install/snapshot_utils.h" #include "otautil/dirutil.h" #include "recovery_ui/ui.h" #include "recovery_utils/logging.h" @@ -104,6 +105,12 @@ bool WipeCache(RecoveryUI* ui, const std::function<bool()>& confirm_func) { bool WipeData(Device* device, bool convert_fbe) { RecoveryUI* ui = device->GetUI(); ui->Print("\n-- Wiping data...\n"); + + if (!FinishPendingSnapshotMerges(device)) { + ui->Print("Unable to check update status or complete merge, cannot wipe partitions.\n"); + return false; + } + bool success = device->PreWipeData(); if (success) { success &= EraseVolume(DATA_ROOT, ui, convert_fbe); diff --git a/update_verifier/update_verifier.cpp b/update_verifier/update_verifier.cpp index d04c455d8..a042f9008 100644 --- a/update_verifier/update_verifier.cpp +++ b/update_verifier/update_verifier.cpp @@ -371,6 +371,10 @@ int update_verifier(int argc, char** argv) { return reboot_device(); } LOG(INFO) << "Marked slot " << current_slot << " as booted successfully."; + // Clears the warm reset flag for next reboot. + if (!android::base::SetProperty("ota.warm_reset", "0")) { + LOG(WARNING) << "Failed to reset the warm reset flag"; + } } else { LOG(INFO) << "Deferred marking slot " << current_slot << " as booted successfully."; } |