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