qubes-installer-qubes-os/anaconda/gptsync/gptsync.h

220 lines
5.2 KiB
C
Raw Normal View History

/*
* gptsync/gptsync.h
* Common header for gptsync and showpart
*
* Copyright (c) 2006 Christoph Pfisterer
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* * Neither the name of Christoph Pfisterer nor the names of the
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
//
// config
//
#if defined(EFI32) || defined(EFIX64)
#define CONFIG_EFI
#endif
//
// platform-dependent types
//
#ifdef CONFIG_EFI
#include <efi.h>
#include <efilib.h>
#define copy_guid(destguid, srcguid) (CopyMem(destguid, srcguid, 16))
#define guids_are_equal(guid1, guid2) (CompareMem(guid1, guid2, 16) == 0)
typedef CHAR16 CHARN;
#define STR(x) L##x
#endif
#ifndef CONFIG_EFI
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
typedef int INTN;
typedef unsigned int UINTN;
typedef uint8_t UINT8;
typedef uint16_t UINT16;
typedef uint32_t UINT32;
typedef uint64_t UINT64;
typedef void VOID;
typedef int BOOLEAN;
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef TRUE
#define TRUE (1)
#endif
typedef unsigned short CHAR16;
typedef char CHARN;
#define STR(x) x
void Print(wchar_t *format, ...);
// FUTURE: use STR(), #define Print printf
#define CopyMem memcpy
#define SetMem memset
#define CompareMem memcmp
#define copy_guid(destguid, srcguid) (memcpy(destguid, srcguid, 16))
#define guids_are_equal(guid1, guid2) (memcmp(guid1, guid2, 16) == 0)
#endif
//
// platform-independent types
//
typedef struct {
UINT8 flags;
UINT8 start_chs[3];
UINT8 type;
UINT8 end_chs[3];
UINT32 start_lba;
UINT32 size;
} MBR_PARTITION_INFO;
typedef struct {
UINT8 type;
CHARN *name;
} MBR_PARTTYPE;
typedef struct {
UINT64 signature;
UINT32 spec_revision;
UINT32 header_size;
UINT32 header_crc32;
UINT32 reserved;
UINT64 header_lba;
UINT64 alternate_header_lba;
UINT64 first_usable_lba;
UINT64 last_usable_lba;
UINT8 disk_guid[16];
UINT64 entry_lba;
UINT32 entry_count;
UINT32 entry_size;
UINT32 entry_crc32;
} GPT_HEADER;
typedef struct {
UINT8 type_guid[16];
UINT8 partition_guid[16];
UINT64 start_lba;
UINT64 end_lba;
UINT64 attributes;
CHAR16 name[36];
} GPT_ENTRY;
#define GPT_KIND_SYSTEM (0)
#define GPT_KIND_DATA (1)
#define GPT_KIND_BASIC_DATA (2)
#define GPT_KIND_FATAL (3)
typedef struct {
UINT8 guid[16];
UINT8 mbr_type;
CHARN *name;
UINTN kind;
} GPT_PARTTYPE;
typedef struct {
UINTN index;
UINT64 start_lba;
UINT64 end_lba;
UINTN mbr_type;
UINT8 gpt_type[16];
GPT_PARTTYPE *gpt_parttype;
BOOLEAN active;
} PARTITION_INFO;
//
// functions provided by the OS-specific module
//
UINTN read_sector(UINT64 lba, UINT8 *buffer);
UINTN write_sector(UINT64 lba, UINT8 *buffer);
UINTN input_boolean(CHARN *prompt, BOOLEAN *bool_out);
//
// vars and functions provided by the common lib module
//
extern UINT8 empty_guid[16];
extern PARTITION_INFO mbr_parts[4];
extern UINTN mbr_part_count;
extern PARTITION_INFO gpt_parts[128];
extern UINTN gpt_part_count;
extern PARTITION_INFO new_mbr_parts[4];
extern UINTN new_mbr_part_count;
extern UINT8 sector[512];
extern MBR_PARTTYPE mbr_types[];
extern GPT_PARTTYPE gpt_types[];
extern GPT_PARTTYPE gpt_dummy_type;
CHARN * mbr_parttype_name(UINT8 type);
UINTN read_mbr(VOID);
GPT_PARTTYPE * gpt_parttype(UINT8 *type_guid);
UINTN read_gpt(VOID);
UINTN detect_mbrtype_fs(UINT64 partlba, UINTN *parttype, CHARN **fsname);
//
// actual platform-independent programs
//
UINTN gptsync(VOID);
UINTN showpart(VOID);
/* EOF */