Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset cffa82aa in mainline


Ignore:
Timestamp:
2015-11-04T18:39:51Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
f71b938
Parents:
eed70f1
Message:

Implement GPT protective MBR.

Location:
uspace/lib/label
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/label/include/std/mbr.h

    reed70f1 rcffa82aa  
    7373        mbr_pt_minix        = 0x81,
    7474        /** Linux */
    75         mbr_pt_linux        = 0x83
     75        mbr_pt_linux        = 0x83,
     76        /** GPT Protective */
     77        mbr_pt_gpt_protect  = 0xee
    7678};
    7779
  • uspace/lib/label/src/gpt.c

    reed70f1 rcffa82aa  
    3939#include <errno.h>
    4040#include <mem.h>
     41#include <stdint.h>
    4142#include <stdlib.h>
    4243#include <uuid.h>
    4344
     45#include "std/mbr.h"
    4446#include "std/gpt.h"
    4547#include "gpt.h"
     
    6870static void gpt_hdr_compute_crc(gpt_header_t *, size_t);
    6971static int gpt_hdr_get_crc(gpt_header_t *, size_t, uint32_t *);
     72
     73static int gpt_pmbr_create(service_id_t, size_t, uint64_t);
     74static int gpt_pmbr_destroy(service_id_t, size_t);
    7075
    7176const uint8_t efi_signature[8] = {
     
    375380        }
    376381
     382        rc = gpt_pmbr_create(sid, bsize, nblocks);
     383        if (rc != EOK) {
     384                rc = EIO;
     385                goto error;
     386        }
     387
    377388        uuid_generate(&disk_uuid);
    378389
     
    538549        }
    539550
     551        rc = gpt_pmbr_destroy(label->svc_id, label->block_size);
     552        if (rc != EOK)
     553                goto error;
     554
    540555        free(label);
    541556        return EOK;
     
    957972}
    958973
     974/** Create GPT Protective MBR */
     975static int gpt_pmbr_create(service_id_t sid, size_t bsize, uint64_t nblocks)
     976{
     977        mbr_br_block_t *pmbr = NULL;
     978        uint64_t pmbr_nb;
     979        int rc;
     980
     981        pmbr = calloc(1, bsize);
     982        if (pmbr == NULL) {
     983                rc = ENOMEM;
     984                goto error;
     985        }
     986
     987        pmbr_nb = nblocks - gpt_hdr_ba;
     988
     989        pmbr->pte[0].ptype = mbr_pt_gpt_protect;
     990        pmbr->pte[0].first_lba = gpt_hdr_ba;
     991
     992        if (pmbr_nb <= UINT32_MAX)
     993                pmbr->pte[0].length = host2uint32_t_le((uint32_t)pmbr_nb);
     994        else
     995                pmbr->pte[0].length = host2uint32_t_le(UINT32_MAX);
     996
     997        pmbr->signature = host2uint16_t_le(mbr_br_signature);
     998
     999        rc = block_write_direct(sid, mbr_ba, 1, pmbr);
     1000        if (rc != EOK) {
     1001                rc = EIO;
     1002                goto error;
     1003        }
     1004
     1005        free(pmbr);
     1006        return EOK;
     1007error:
     1008        free(pmbr);
     1009        return rc;
     1010}
     1011
     1012/** Destroy GPT Protective MBR */
     1013static int gpt_pmbr_destroy(service_id_t sid, size_t bsize)
     1014{
     1015        mbr_br_block_t *pmbr = NULL;
     1016        int rc;
     1017
     1018        pmbr = calloc(1, bsize);
     1019        if (pmbr == NULL) {
     1020                rc = ENOMEM;
     1021                goto error;
     1022        }
     1023
     1024        rc = block_write_direct(sid, mbr_ba, 1, pmbr);
     1025        if (rc != EOK) {
     1026                rc = EIO;
     1027                goto error;
     1028        }
     1029
     1030        free(pmbr);
     1031        return EOK;
     1032error:
     1033        free(pmbr);
     1034        return rc;
     1035}
     1036
    9591037/** @}
    9601038 */
Note: See TracChangeset for help on using the changeset viewer.