1b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer// Use of this source code is governed by a BSD-style license that can be
3b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer// found in the LICENSE file.
4b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer
5b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer#include <string.h>
6b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer
70c3ba249abb1dc60f5ebabccf84ff13206440b83Bill Richardson#include "cgpt.h"
8b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer#include "cgptlib_internal.h"
90c3ba249abb1dc60f5ebabccf84ff13206440b83Bill Richardson#include "vboot_host.h"
10b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer
113f806a2abf07d7b801852a4a6f3a9080a4b5c427Bill Richardsonint CgptLegacy(CgptLegacyParams *params) {
12b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  struct drive drive;
13b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  GptHeader *h1, *h2;
14b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer
15b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  if (params == NULL)
16b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    return CGPT_FAILED;
17b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer
18ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen  if (CGPT_OK != DriveOpen(params->drive_name, &drive, O_RDWR,
19ab899591808dd3e5f955ab7693b54a83389cd35fNam T. Nguyen                           params->drive_size))
20b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    return CGPT_FAILED;
21b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer
22b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  h1 = (GptHeader *)drive.gpt.primary_header;
23b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  h2 = (GptHeader *)drive.gpt.secondary_header;
24b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  if (params->efipart) {
25b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    memcpy(h1->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
26b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    memcpy(h2->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
27b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    RepairEntries(&drive.gpt, MASK_SECONDARY);
28b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    drive.gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
29b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer                           GPT_MODIFIED_HEADER2);
30b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  } else {
31b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    memcpy(h1->signature, GPT_HEADER_SIGNATURE2, GPT_HEADER_SIGNATURE_SIZE);
32b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    memcpy(h2->signature, GPT_HEADER_SIGNATURE2, GPT_HEADER_SIGNATURE_SIZE);
33b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    memset(drive.gpt.primary_entries, 0, drive.gpt.sector_bytes);
34b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer    drive.gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
35b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer                           GPT_MODIFIED_HEADER2);
36b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  }
37b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer
38b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  UpdateCrc(&drive.gpt);
39b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer
40b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  // Write it all out
41b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer  return DriveClose(&drive, 1);
42b7b865cfee68190babd971ab9a897bdabbab075fStefan Reinauer}
43