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