[go: nahoru, domu]

bullhead: edify script for safe updates of primary/backup partitions

- Flash backup partitions
- patch secondary pte's to swap primary/backup,enable secondary gpt
- Flash psuedo-backup partions, effectively flashing primary
- restore secondary pte's and restore primary gpt
- Flash all other non backup partitions

Change-Id: Iac7e96ebfef64911d690966471b990c67c32fb9e
Signed-off-by: Mohamed Khadri <mohamed.khadri@lge.com>
diff --git a/releasetools.py b/releasetools.py
index d19fe65..fb6291f 100644
--- a/releasetools.py
+++ b/releasetools.py
@@ -128,10 +128,10 @@
 # bullhead also has 8 backup partitions:
 #    sbl1, tz, rpm, aboot, pmic, hyp, keymaster, cmnlib
 #
-
-release_partitions = "sbl1 tz rpm aboot sdi imgdata pmic hyp sec keymaster cmnlib"
-debug_partitions = "sbl1 tz rpm aboot sdi imgdata pmic hyp sec keymaster cmnlib"
-backup_partitions = "sbl1 tz rpm aboot pmic hyp keymaster cmnlib"
+release_backup_partitions = "sbl1 tz rpm aboot pmic hyp keymaster cmnlib"
+debug_backup_partitions = "sbl1 tz rpm aboot pmic hyp keymaster cmnlib"
+release_nobackup_partitions = "sdi imgdata sec"
+debug_nobackup_partitions = "sdi imgdata sec"
 
 def WriteBootloader(info, bootloader):
   info.script.Print("Writing bootloader...")
@@ -169,13 +169,55 @@
       'package_extract_file("bootloader-flag.txt", "%s");' %
       (misc_device,))
 
+  # failed sbl updates, may render the handset unusable/unrestorable.
+  # Hence adopt below strategy for updates,enabling restore at all times.
+  # 1. Flash backup partitions
+  # 2. patch secondary pte's to swap primary/backup, and enable secondary gpt
+  # 3. Flash psuedo-backup partions, effectively flashing primary partitions
+  # 4. restore secondary pte's and restore primary gpt
+  # 5. Flash all other non backup partitions
+  #
   # Depending on the build fingerprint, we can decide which partitions
   # to update.
   fp = info.info_dict["build.prop"]["ro.build.fingerprint"]
   if "release-keys" in fp:
-    to_flash = release_partitions.split()
+    to_bkp_flash = release_backup_partitions.split()
+    to_flash = release_nobackup_partitions.split()
   else:
-    to_flash = debug_partitions.split()
+    to_bkp_flash = debug_backup_partitions.split()
+    to_flash = debug_nobackup_partitions.split()
+
+  # Write the images to separate files in the OTA package
+  # and flash backup partitions
+  for i in to_bkp_flash:
+    try:
+      _, device = common.GetTypeAndDevice("/"+i+"bak", info.info_dict)
+    except KeyError:
+      print "skipping flash of %s; not in recovery.fstab" % (i,)
+      continue
+    common.ZipWriteStr(info.output_zip, "bootloader.%s.img" % (i,),
+                       bootloader[imgs[i][0]:imgs[i][0]+imgs[i][1]])
+
+    info.script.AppendExtra('package_extract_file("bootloader.%s.img", "%s");' %
+                            (i, device))
+
+  target_device = info.info_dict["build.prop"]["ro.product.device"]
+  # swap ptes in secondary and force secondary gpt
+  info.script.AppendExtra("lge_"+target_device+"_update_gpt();")
+
+  # flash again after swap, effectively flashing primary
+  # pte's are not re-read, hence primary is psuedo-secondary
+  for i in to_bkp_flash:
+    try:
+      _, device = common.GetTypeAndDevice("/"+i, info.info_dict)
+    except KeyError:
+      print "skipping flash of %s; not in recovery.fstab" % (i,)
+      continue
+    info.script.AppendExtra('package_extract_file("bootloader.%s.img", "%s");' %
+                            (i, device))
+
+  # restore secondary gpt for correct mappings and enable primary gpt
+  info.script.AppendExtra("lge_"+target_device+"_recover_gpt();")
 
   # Write the images to separate files in the OTA package
   for i in to_flash:
@@ -194,14 +236,6 @@
       'package_extract_file("bootloader-flag-clear.txt", "%s");' %
       (misc_device,))
 
-  try:
-    for i in backup_partitions.split():
-      _, device = common.GetTypeAndDevice("/"+i+"bak", info.info_dict)
-      info.script.AppendExtra(
-          'package_extract_file("bootloader.%s.img", "%s");' % (i, device))
-  except KeyError:
-    pass
-
 
 def trunc_to_null(s):
   if '\0' in s: