From patchwork Wed Sep 12 14:50:42 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?=C5=81ukasz_Majewski?= X-Patchwork-Id: 183392 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id DBB042C0084 for ; Thu, 13 Sep 2012 00:51:31 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 71E8D2818D; Wed, 12 Sep 2012 16:51:25 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 9oKgARHG8rIs; Wed, 12 Sep 2012 16:51:24 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 1B7FA2816C; Wed, 12 Sep 2012 16:51:22 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id E06B528179 for ; Wed, 12 Sep 2012 16:51:20 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id dLKBcItX1dv0 for ; Wed, 12 Sep 2012 16:51:20 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by theia.denx.de (Postfix) with ESMTP id 3874A2817E for ; Wed, 12 Sep 2012 16:51:10 +0200 (CEST) MIME-version: 1.0 Received: from epcpsbgm2.samsung.com (epcpsbgm2 [203.254.230.27]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MA800JQVRWXPRL0@mailout2.samsung.com> for u-boot@lists.denx.de; Wed, 12 Sep 2012 23:51:08 +0900 (KST) X-AuditID: cbfee61b-b7f586d000007adc-24-5050a15c4fce Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id AC.30.31452.C51A0505; Wed, 12 Sep 2012 23:51:08 +0900 (KST) Received: from mcdsrvbld02.digital.local ([106.116.37.23]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MA800J3DRWP5D90@mmp1.samsung.com> for u-boot@lists.denx.de; Wed, 12 Sep 2012 23:51:08 +0900 (KST) From: Lukasz Majewski To: u-boot@lists.denx.de Date: Wed, 12 Sep 2012 16:50:42 +0200 Message-id: <1347461446-32097-4-git-send-email-l.majewski@samsung.com> X-Mailer: git-send-email 1.7.10 In-reply-to: <1347461446-32097-1-git-send-email-l.majewski@samsung.com> References: <1345795995-24656-1-git-send-email-l.majewski@samsung.com> <1347461446-32097-1-git-send-email-l.majewski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrFLMWRmVeSWpSXmKPExsVy+t9jAd2YhQEBBj93WFi83dvJ7sDocfbO DsYAxigum5TUnMyy1CJ9uwSujOnHpjEWLHapOP9oB2sD40GjLkZODgkBE4mPDeeZIGwxiQv3 1rN1MXJxCAksYpSY/f8BK0iCV0BQ4sfkeyxdjBwczALyEkcuZYOEmQXUJSbNW8QMUb+YSeLe 5etsIAk2AT2Jz3efgg0VEZCQ+NV/lRGkiFlgO5PE8VPfwIqEBYol+matACtiEVCVWLHzIRPE MjeJHU072SAukpd4er8PzOYUcJfYv/Qx2EFCAs2MEpN260xgFJiF5L5ZCPfNQnLfAkbmVYyi qQXJBcVJ6blGesWJucWleel6yfm5mxjBIfhMegfjqgaLQ4wCHIxKPLyJmf4BQqyJZcWVuYcY JTiYlUR4N+gGBAjxpiRWVqUW5ccXleakFh9ilOZgURLndTpnFyAkkJ5YkpqdmlqQWgSTZeLg lGpgnBFlV/PZqPrDP2VpTfnFF5bmum+YJ3ZRaafKicnPc4IkY1z22NkwzTg2d4J33M5zbIzp h6YuSdhZLX/9Zdd91s89Sz5Nb7c/cc/B8bHh7qwVx3+/t2mLdGPbrnVDQcuBR5VnspCE5M8V BhrXL1zbf+PTw7zFnx682qHAV3g6PUJz5srjwY8f5ymxFGckGmoxFxUnAgClCPjjPQIAAA== Cc: Stephen Warren , Kyungmin Park , Tom Warren , Tom Rini Subject: [U-Boot] =?utf-8?q?_=5BPATCH_v2_3/7=5D_gpt=3Adoc=3A_GPT_=28GUID_P?= =?utf-8?q?artition_Table=29_documentation?= X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de Documentation of the GPT format. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park --- Changes for v2: - Typos correction. - Adding guidlines about GPT restoration. - Adding information about GUID generator --- doc/README.gpt | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 207 insertions(+), 0 deletions(-) create mode 100644 doc/README.gpt diff --git a/doc/README.gpt b/doc/README.gpt new file mode 100644 index 0000000..ec56005 --- /dev/null +++ b/doc/README.gpt @@ -0,0 +1,207 @@ +# +# Copyright (C) 2012 Samsung Electronics +# +# Lukasz Majewski +# +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA + + +Glossary: +======== +- UUID -(Universally Unique Identifier) +- GUID - (Globally Unique ID) +- EFI - (Extensible Firmware Interface) +- UEFI - (Unified EFI) - EFI evolution +- GPT (GUID Partition Table) - it is the EFI standard part +- partitions - lists of available partitions (defined at u-boot): + ./include/configs/{target}.h + +Introduction: +============= +This document describes the GPT partition table format when used with u-boot. + + +UUID introduction: +==================== + +GPT for marking disks/partitions is using the UUID. It is supposed to be a +globally unique value. A UUID is a 16-byte (128-bit) number. The number of +theoretically possible UUIDs is therefore about 3 × 10^38. +More often UUID is stored as 32 hexadecimal digits, displayed in 5 groups +separated by hyphens, in the form 8-4-4-4-12 for a total of 36 characters +(32 digits and 4 hyphens) + +For instance, GUID of Linux data partition: EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 + +Historically there are 5 methods to generate this number. The oldest one is +combining machine's MAC address and timer (epoch) value. + +Successive versions are using MD5 hash, random numbers and SHA-1 hash. All major +OSes and programming languages are providing libraries to compute UUID (e.g. +uuid command line tool). + +GPT brief explanation: +====================== + + Layout: + ------- + + -------------------------------------------------- + LBA 0 |Protective MBR | + ---------------------------------------------------------- + LBA 1 |Primary GPT Header | Primary + -------------------------------------------------- GPT + LBA 2 |Entry 1|Entry 2| Entry 3| Entry 4| + -------------------------------------------------- + LBA 3 |Entries 5 - 128 | + | | + | | + ---------------------------------------------------------- + LBA 34 |Partition 1 | + | | + ----------------------------------- + |Partition 2 | + | | + ----------------------------------- + |Partition n | + | | + ---------------------------------------------------------- + LBA -34 |Entry 1|Entry 2| Entry 3| Entry 4| Secondary + -------------------------------------------------- (bkp) + LBA -33 |Entries 5 - 128 | GPT + | | + | | + LBA -2 | | + -------------------------------------------------- + LBA -1 |Secondary GPT Header | + ---------------------------------------------------------- + + +For a legacy reasons, GPT's LBA 0 sector has a MBR structure. It is called +"protective MBR". +Its first partition entry ID has 0xEE value, and disk software, which is not +handling the GPT sees it as a storage device without free space. + +It is possible to define 128 linearly placed partition entries. + +"LBA -1" means the last addressable block (in the mmc subsystem: +"dev_desc->lba - 1") + +Primary/Secondary GPT header: +---------------------------- +Offset Size Description + +0 8 B Signature ("EFI PART", 45 46 49 20 50 41 52 54) +8 4 B Revision (For version 1.0, the value is 00 00 01 00) +12 4 B Header size (in bytes, usually 5C 00 00 00 meaning 92 bytes) +16 4 B CRC32 of header (0 to header size), with this field zeroed + during calculation +20 4 B Reserved (ZERO); +24 8 B Current LBA (location of this header copy) +32 8 B Backup LBA (location of the other header copy) +40 8 B First usable LBA for partitions (primary partition table last + LBA + 1) +48 8 B Last usable LBA (secondary partition table first LBA - 1) +56 16 B Disk GUID (also referred as UUID on UNIXes) +72 8 B Partition entries starting LBA (always 2 in primary copy) +80 4 B Number of partition entries +84 4 B Size of a partition entry (usually 128) +88 4 B CRC32 of partition array +92 * Reserved; must be ZERO (420 bytes for a 512-byte LBA) + +TOTAL: 512 B + + + +IMPORTANT: + +GPT headers and partition entries are protected by CRC32 (the POSIX CRC32). + +Primary GPT header and Secondary GPT header have swapped values of "Current LBA" +and "Backup LBA" and therefore different CRC32 check-sum. + +CRC32 for GPT headers (field "CRC of header") are calculated up till +"Header size" (92), NOT 512 bytes. + +CRC32 for partition entries (field "CRC32 of partition array") is calculated for +the whole array entry ( Number_of_partition_entries * +sizeof(partition_entry_size (usually 128))) + +Observe, how Secondary GPT is placed in the memory. It is NOT a mirror reflect +of the Primary. + + + Partition Entry Format: + ---------------------- + Offset Size Description + + 0 16 B Partition type GUID + 16 16 B Unique partition GUID + 32 8 B First LBA (Little Endian) + 40 8 B Last LBA (inclusive) + 48 8 B Attribute flags [+] + 56 72 B Partition name (text) + + Attribute flags: + Bit 0 - System partition + Bit 60 - Read-only + Bit 62 - Hidden + Bit 63 - Not mount + + +Example usage: +============== + +To restore GUID partition table one needs to: +1. at ./include/configs/{board}.h + - define "partitions=" environment variable with format: + "name=u-boot,size=60M;name=kernel,size=60M;name=platform,size=1G;" + - define GPT_PARTS_NUM with actual number of partitions (as defined above) + - #define CONFIG_EFI_PARTITION and #define CONFIG_CMD_GPT + +2. From u-boot prompt type: + gpt mmc 0 uuid_disk=ec2cddf2-fbf5-11e1-af3a-001fd09285c0, \ + uuid1=ed09c4b0-fbf5-11e1-9a95-001fd09285c0, \ + uuid2=edd6d93c-fbf5-11e1-875a-001fd09285c0, \ + uuid3=f0485114-fbf5-11e1-a3ae-001fd09285c0 ... + + UUIDs shall be defined up to GPT_PARTS_NUM. Smaller number is acceptable. + When UUIDs are NOT provided, internal (rather weak) GUID generator will be + used instead + +Internal GUID generator: +======================= + +For "emergency" usage (or when list of UUIDs cannot be provided) the internal +GUID generator shall be used. It uses gd->start_addr_sp as a primary source of +UUID generator (16B). + + +Useful info: +============ + +Two programs, namely: 'fdisk' and 'parted' are recommended to work with GPT +recovery. Parted is able to handle GUID partitions. Unfortunately the 'fdisk' +hasn't got such ability. +Please, pay attention at -l switch for parted. + +"uuid" program is recommended to generate UUID string. Moreover it can decode +(-d switch) passed in UUID string. It can be used to generate partitions UUID +passed to u-boot environment variables.