自学内容网 自学内容网

ac8257 android 9 lk upgrade升级后分区表错误问题

问题描述

ac8257 Android 9,使用lk upgrade升级功能升级固件,当分区表发生变化时,分区表会出现以下问题:

1、备份分区表错误

2、分区表存在重叠

验证方法

lk upgrade升级后,用sgdisk命令检测分区表是否存在错误。

sgdisk

--verify

# sgdisk --verify /dev/block/mmcblk0
Warning! Main and backup partition tables differ! Use the 'c' and 'e' options
on the recovery & transformation menu to examine the two tables.

Warning! One or more CRCs don't match. You should repair the disk!
Main header: OK
Backup header: OK
Main partition table: OK
Backup partition table: ERROR

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************
Warning! Main partition table overlaps the first partition by 960 blocks!
Try reducing the partition table size by 3840 entries.
(Use the 's' item on the experts' menu.)

Warning! Secondary partition table overlaps the last partition by
1 blocks!
Try reducing the partition table size by 4 entries.
(Use the 's' item on the experts' menu.)

Caution: The CRC for the backup partition table is invalid. This table may
be corrupt. This program will automatically create a new backup partition
table when you save your partitions.

Problem: main GPT header's size of partition entries (128) doesn't
match the backup GPT header's size of partition entries (0)
You should use the 'b' or 'd' option on the recovery & transformation menu to
select one or the other header.

Warning: There is a gap between the main partition table (ending sector 33)
and the first usable sector (1024). This is helpful in some exotic configurations,
but is unusual. The util-linux fdisk program often creates disks like this.
Using 'j' on the experts' menu can adjust this gap.
Warning! Main partition table overlaps the first partition by 960 blocks!
Try reducing the partition table size by 3840 entries.
(Use the 's' item on the experts' menu.)

Warning! Secondary partition table overlaps the last partition by
1 blocks!
Try reducing the partition table size by 4 entries.
(Use the 's' item on the experts' menu.)

Identified 4 problems!

--print

# sgdisk --print /dev/block/mmcblk0
Warning! Main and backup partition tables differ! Use the 'c' and 'e' options
on the recovery & transformation menu to examine the two tables.

Warning! One or more CRCs don't match. You should repair the disk!
Main header: OK
Backup header: OK
Main partition table: OK
Backup partition table: ERROR

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************
Warning! Main partition table overlaps the first partition by 960 blocks!
Try reducing the partition table size by 3840 entries.
(Use the 's' item on the experts' menu.)

Warning! Secondary partition table overlaps the last partition by
1 blocks!
Try reducing the partition table size by 4 entries.
(Use the 's' item on the experts' menu.)
Disk /dev/block/mmcblk0: 61112320 sectors, 29.1 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 00000000-0000-0000-0000-000000000000
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 1024, last usable sector is 61112285
Partitions will be aligned on 1-sector boundaries
Total free space is 0 sectors (0 bytes)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              64            2111   1024.0 KiB  0700  boot_para
   2            2112           67647   32.0 MiB    0700  recovery
   3           67648           68671   512.0 KiB   0700  para
   4           68672          109631   20.0 MiB    0700  expdb
   5          109632          175167   32.0 MiB    0700  nvcfg
   6          175168          306239   64.0 MiB    0700  nvdata
   7          306240          371775   32.0 MiB    0700  metadata
   8          371776          388159   8.0 MiB     0700  protect1
   9          388160          409599   10.5 MiB    0700  protect2
  10          409600          425983   8.0 MiB     0700  seccfg
  11          425984          524287   48.0 MiB    0700  persist
  12          524288          528383   2.0 MiB     0700  sec1
  13          528384          534527   3.0 MiB     0700  proinfo
  14          534528          739327   100.0 MiB   0700  md1img
  15          739328          741375   1024.0 KiB  0700  spmfw
  16          741376          743423   1024.0 KiB  0700  scp1
  17          743424          745471   1024.0 KiB  0700  scp2
  18          745472          747519   1024.0 KiB  0700  sspm_1
  19          747520          749567   1024.0 KiB  0700  sspm_2
  20          749568          782335   16.0 MiB    0700  gz1
  21          782336          815103   16.0 MiB    0700  gz2
  22          815104          946175   64.0 MiB    0700  nvram
  23          946176         1011711   32.0 MiB    0700  arm2
  24         1011712         1015807   2.0 MiB     0700  lk
  25         1015808         1019903   2.0 MiB     0700  lk2
  26         1019904         1040383   10.0 MiB    0700  boot
  27         1040384         1056767   8.0 MiB     0700  dtbo
  28         1056768         1067007   5.0 MiB     0700  tee1
  29         1067008         1081343   7.0 MiB     0700  tee2
  30         1081344         2719743   800.0 MiB   0700  vendor
  31         2719744         9011199   3.0 GiB     0700  system
  32         9011200         9027583   8.0 MiB     0700  vbmeta
  33         9027584         9093119   32.0 MiB    0700  logo
  34         9093120         9158655   32.0 MiB    0700  logo2
  35         9158656         9160703   1024.0 KiB  0700  metazone
  36         9160704         9160767   32.0 KiB    0700  misc
  37         9160768         9207807   23.0 MiB    0700  avm
  38         9207808        10092543   432.0 MiB   0700  cache
  41        10633216        60991454   24.0 GiB    0700  userdata
  42        60991455        61079518   43.0 MiB    0700  otp
  43        61079519        61112286   16.0 MiB    0700  flashinfo

补丁

备份分区表错误问题

--- a/platform/common/partition/efi.c
+++ b/platform/common/partition/efi.c
@@ -937,8 +937,7 @@ static void pack_pheader_data(void *data)
        header->alternate_lba = last_lba(dev->blkdev->part_user);
        header->last_usable_lba = get_gpt_header_last_usable_lba();
        header->partition_entry_lba = 0x2;
-       if (gpt_count)
-               header->num_partition_entries = 128;
+       header->num_partition_entries = 128;
        u64 entries_real_size = (u64)header->num_partition_entries * header->sizeof_partition_entry;
        //memcpy(header->disk_guid.b, GPT_DISK_GUID, sizeof(GPT_DISK_GUID));
        header->partition_entry_array_crc32 = efi_crc32((u8 *)part, (u32)entries_real_size);
@@ -1021,9 +1020,8 @@ static void pack_sheader_data(void *data)

        gpt_header *header = (gpt_header *)data;
        gpt_entry *part = (gpt_entry *)(data + BLK_SIZE);
-       header->sizeof_partition_entry = GPT_ENTRY_SIZE;
-
        memset(data, 0x0, BLK_SIZE);
+       header->sizeof_partition_entry = GPT_ENTRY_SIZE;
        header->signature = GPT_HEADER_SIGNATURE;
        header->revision = 0x00010000;
        header->header_size = 0x5C;
@@ -1036,8 +1034,7 @@ static void pack_sheader_data(void *data)
        //header->disk_guid
        //memcpy(header->disk_guid.b, GPT_DISK_GUID, sizeof(GPT_DISK_GUID));
        header->partition_entry_lba = get_gpt_header_last_usable_lba() + 1;
-       if (gpt_count)
-               header->num_partition_entries = 128;
+       header->num_partition_entries = 128;
        u64 entries_real_size = (u64)header->num_partition_entries * header->sizeof_partition_entry;
        header->partition_entry_array_crc32 = efi_crc32((u8 *)part, (u32)entries_real_size);

分区表重叠问题

--- a/platform/common/include/efi.h
+++ b/platform/common/include/efi.h
@@ -92,6 +92,8 @@ typedef struct {
 #define GPT_HEADER_SIGNATURE    0x5452415020494645ULL
 #ifdef ATC_AOSP_ENHANCEMENT
 #define GPT_ENTRY_SIZE                      128
+#define GPT_ENTRY_COUNT                                                128
+
 #define GPT_DISK_GUID                       "AUTO CHIPS"    //10 Bytes
 #define GPT_PART_GUID                       {0xA2, 0xA0, 0xD0, 0xEB, 0xE5, 0xB9, 0x33, 0x44, 0x87, 0xC0, 0x68, 0xB6, 0xB7, 0x26, 0x99, 0xC7}

@@ -101,7 +103,7 @@ typedef struct {
 /*used MBR: 8 bytes*/
 #define GPT_MBR_LK_UPG_FOR_ATE             424
 #define PART_MAGIC          0x58881688
-#define GPT_PART_SIZE       512*1024
+#define GPT_PART_SIZE       (2 * 512 + GPT_ENTRY_COUNT * GPT_ENTRY_SIZE)

 int atc_read_gpt(part_dev_t *dev);

--- a/platform/common/partition/efi.c
+++ b/platform/common/partition/efi.c
@@ -82,11 +82,11 @@ static u32 part_num = 0;
 int gpt_count = 0;
 #define BLK_SIZE           (512)
 #define GPT_PART_MAX_NUM 40
-#define GPT_PART_LENGTH ((PART_MAX_COUNT*sizeof(gpt_entry))+2*BLK_SIZE)
+#define GPT_PART_LENGTH  ((PART_MAX_COUNT*sizeof(gpt_entry))+2*BLK_SIZE)
 static u8 gpt_part_temp[GPT_PART_LENGTH];
 u8 gpt_part[GPT_PART_LENGTH];
 static bool need_resize = false;
-u32 sgpt_partition_lba_size = GPT_PART_LENGTH/BLK_SIZE;
+u32 sgpt_partition_lba_size = (GPT_PART_LENGTH/BLK_SIZE - 1);

 /*
  ********** Definition of CRC32 Calculation **********
@@ -197,7 +197,6 @@ static u64 get_gpt_header_last_usable_lba()
        part_dev_t *dev = mt_part_get_device();

        return (last_lba(dev->blkdev->part_user)-get_spgt_partition_lba_size());
-
 }

 static u32 entries_crc32;
@@ -937,7 +936,7 @@ static void pack_pheader_data(void *data)
        header->alternate_lba = last_lba(dev->blkdev->part_user);
        header->last_usable_lba = get_gpt_header_last_usable_lba();
        header->partition_entry_lba = 0x2;
-       header->num_partition_entries = 128;
+       header->num_partition_entries = GPT_ENTRY_COUNT;
        u64 entries_real_size = (u64)header->num_partition_entries * header->sizeof_partition_entry;
        //memcpy(header->disk_guid.b, GPT_DISK_GUID, sizeof(GPT_DISK_GUID));
        header->partition_entry_array_crc32 = efi_crc32((u8 *)part, (u32)entries_real_size);
@@ -980,7 +979,7 @@ static void pack_entries_data(void *data)
                /* it's last partition (do not have reserved partition ex: no flashinfo, otp), only need to update last partition */
                /* may not go to here unless customer remove flashinfo partition */
                if (i == nr_parts-1 && !entries[i].starting_lba && !entries[i].ending_lba) {
-                       entries[i].ending_lba = last_lba(dev->blkdev->part_user) - get_spgt_partition_lba_size() ;
+                       entries[i].ending_lba = last_lba(dev->blkdev->part_user) - get_spgt_partition_lba_size();
                        entries[i].starting_lba = entries[i-1].ending_lba + 1;
                        break;
                }
@@ -991,7 +990,7 @@ static void pack_entries_data(void *data)
                        /* it's a reserved partition and it's last partition, entries[i].ending_lba not empty(partition size is here)  */
                        if (i == nr_parts-1 && entries[i].ending_lba) {
                                entries[i].starting_lba = last_lba(dev->blkdev->part_user) - get_spgt_partition_lba_size() - entries[i].ending_lba + 1;
-                               entries[i].ending_lba = last_lba(dev->blkdev->part_user) - get_spgt_partition_lba_size() ;
+                               entries[i].ending_lba = last_lba(dev->blkdev->part_user) - get_spgt_partition_lba_size();
                        }
                        /* reserved parttiion but not last one  */
                        /* may not go to here uless there exists more than one reserved partitions (ex: otp + flashinfo)*/
@@ -1034,7 +1033,7 @@ static void pack_sheader_data(void *data)
        //header->disk_guid
        //memcpy(header->disk_guid.b, GPT_DISK_GUID, sizeof(GPT_DISK_GUID));
        header->partition_entry_lba = get_gpt_header_last_usable_lba() + 1;
-       header->num_partition_entries = 128;
+       header->num_partition_entries = GPT_ENTRY_COUNT;
        u64 entries_real_size = (u64)header->num_partition_entries * header->sizeof_partition_entry;
        header->partition_entry_array_crc32 = efi_crc32((u8 *)part, (u32)entries_real_size);


原文地址:https://blog.csdn.net/zhang6318/article/details/142516544

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!