xref: /aosp_15_r20/external/vboot_reference/cgpt/cgpt_legacy.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1 /* Copyright 2012 The ChromiumOS Authors
2  * Use of this source code is governed by a BSD-style license that can be
3  * found in the LICENSE file.
4  */
5 
6 #include <string.h>
7 
8 #include "cgpt.h"
9 #include "cgptlib_internal.h"
10 #include "vboot_host.h"
11 
CgptLegacy(CgptLegacyParams * params)12 int CgptLegacy(CgptLegacyParams *params) {
13   struct drive drive;
14   int gpt_retval;
15   GptHeader *h1, *h2;
16 
17   if (params == NULL)
18     return CGPT_FAILED;
19 
20   if (CGPT_OK != DriveOpen(params->drive_name, &drive, O_RDWR,
21                            params->drive_size))
22     return CGPT_FAILED;
23 
24   if (GPT_SUCCESS != (gpt_retval = GptValidityCheck(&drive.gpt))) {
25     Error("GptValidityCheck() returned %d: %s\n",
26           gpt_retval, GptError(gpt_retval));
27     goto bad;
28   }
29 
30   h1 = (GptHeader *)drive.gpt.primary_header;
31   h2 = (GptHeader *)drive.gpt.secondary_header;
32   if (params->mode == CGPT_LEGACY_MODE_EFIPART) {
33     drive.gpt.ignored = MASK_NONE;
34     memcpy(h1->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
35     memcpy(h2->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
36     RepairEntries(&drive.gpt, MASK_SECONDARY);
37     drive.gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
38                            GPT_MODIFIED_HEADER2);
39   } else if (params->mode == CGPT_LEGACY_MODE_IGNORE_PRIMARY) {
40     if (!(drive.gpt.valid_headers & MASK_SECONDARY) ||
41         !(drive.gpt.valid_entries & MASK_SECONDARY) ||
42         drive.gpt.ignored & MASK_SECONDARY) {
43       Error("Refusing to mark primary GPT ignored unless secondary is valid.");
44       goto bad;
45     }
46     memset(h1, 0, sizeof(*h1));
47     memcpy(h1->signature, GPT_HEADER_SIGNATURE_IGNORED,
48            GPT_HEADER_SIGNATURE_SIZE);
49     drive.gpt.modified |= GPT_MODIFIED_HEADER1;
50   } else {
51     memcpy(h1->signature, GPT_HEADER_SIGNATURE2, GPT_HEADER_SIGNATURE_SIZE);
52     memcpy(h2->signature, GPT_HEADER_SIGNATURE2, GPT_HEADER_SIGNATURE_SIZE);
53     memset(drive.gpt.primary_entries, 0, drive.gpt.sector_bytes);
54     drive.gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
55                            GPT_MODIFIED_HEADER2);
56   }
57 
58   UpdateCrc(&drive.gpt);
59 
60   // Write it all out
61   return DriveClose(&drive, 1);
62 
63 bad:
64   (void) DriveClose(&drive, 0);
65   return CGPT_FAILED;
66 }
67