Merge "Add --keep_memtag_mode for --wipe_data" into main am: 0d4e8c333c am: f8d48e1846

Original change: https://android-review.googlesource.com/c/platform/bootable/recovery/+/2810434

Change-Id: Iee895c10dfe9f26c7f49c43101d1a3a49b09c741
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/install/include/install/wipe_data.h b/install/include/install/wipe_data.h
index 42cad87..255d9b1 100644
--- a/install/include/install/wipe_data.h
+++ b/install/include/install/wipe_data.h
@@ -27,4 +27,4 @@
 bool WipeCache(RecoveryUI* ui, const std::function<bool()>& confirm);
 
 // Returns true on success.
-bool WipeData(Device* device);
+bool WipeData(Device* device, bool keep_memtag_mode = false);
diff --git a/install/wipe_data.cpp b/install/wipe_data.cpp
index c65e6f4..7aff622 100644
--- a/install/wipe_data.cpp
+++ b/install/wipe_data.cpp
@@ -79,7 +79,7 @@
   return success;
 }
 
-bool WipeData(Device* device) {
+bool WipeData(Device* device, bool keep_memtag_mode) {
   RecoveryUI* ui = device->GetUI();
   ui->Print("\n-- Wiping data...\n");
   ui->SetBackground(RecoveryUI::ERASING);
@@ -101,11 +101,15 @@
       success &= EraseVolume(METADATA_ROOT, ui);
     }
   }
-  ui->Print("Resetting memtag message...\n");
-  std::string err;
-  if (!WriteMiscMemtagMessage({}, &err)) {
-    ui->Print("Failed to reset memtag message: %s\n", err.c_str());
-    success = false;
+  if (keep_memtag_mode) {
+    ui->Print("NOT resetting memtag message as per request...\n");
+  } else {
+    ui->Print("Resetting memtag message...\n");
+    std::string err;
+    if (!WriteMiscMemtagMessage({}, &err)) {
+      ui->Print("Failed to reset memtag message: %s\n", err.c_str());
+      success = false;
+    }
   }
   if (success) {
     success &= device->PostWipeData();
diff --git a/recovery.cpp b/recovery.cpp
index 4d39019..1a6a7d6 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -608,6 +608,7 @@
     { "wipe_ab", no_argument, nullptr, 0 },
     { "wipe_cache", no_argument, nullptr, 0 },
     { "wipe_data", no_argument, nullptr, 0 },
+    { "keep_memtag_mode", no_argument, nullptr, 0 },
     { "wipe_package_size", required_argument, nullptr, 0 },
     { nullptr, 0, nullptr, 0 },
   };
@@ -616,6 +617,7 @@
   bool install_with_fuse = false;  // memory map the update package by default.
   bool should_wipe_data = false;
   bool should_prompt_and_wipe_data = false;
+  bool should_keep_memtag_mode = false;
   bool should_wipe_cache = false;
   bool should_wipe_ab = false;
   size_t wipe_package_size = 0;
@@ -675,6 +677,8 @@
           should_wipe_data = true;
         } else if (option == "wipe_package_size") {
           android::base::ParseUint(optarg, &wipe_package_size);
+        } else if (option == "keep_memtag_mode") {
+          should_keep_memtag_mode = true;
         }
         break;
       }
@@ -793,7 +797,7 @@
   } else if (should_wipe_data) {
     save_current_log = true;
     CHECK(device->GetReason().has_value());
-    if (!WipeData(device)) {
+    if (!WipeData(device, should_keep_memtag_mode)) {
       status = INSTALL_ERROR;
     }
   } else if (should_prompt_and_wipe_data) {