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