0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome/*
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * CDDL HEADER START
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome *
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * The contents of this file are subject to the terms of the
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * Common Development and Distribution License (the "License").
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * You may not use this file except in compliance with the License.
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome *
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * or http://www.opensolaris.org/os/licensing.
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * See the License for the specific language governing permissions
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * and limitations under the License.
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome *
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * When distributing Covered Code, include this CDDL HEADER in each
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * If applicable, add the following below this CDDL HEADER, with the
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * fields enclosed by brackets "[]" replaced with your own identifying
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * information: Portions Copyright [yyyy] [name of copyright owner]
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome *
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * CDDL HEADER END
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome/*
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome * Copyright 2016 Toomas Soome <tsoome@me.com>
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#ifndef _INSTALLBOOT_H
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define _INSTALLBOOT_H
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#ifdef __cplusplus
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soomeextern "C" {
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#endif
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#include <sys/multiboot.h>
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#include <sys/types.h>
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define SECTOR_SIZE (512)
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome/* partitioning type for device */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soomeenum ig_devtype_t {
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome IG_DEV_VTOC = 0,
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome IG_DEV_MBR,
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome IG_DEV_EFI
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome};
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome/* file system type */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soomeenum ig_fstype_t {
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome IG_FS_NONE = 0,
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome IG_FS_ZFS,
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome IG_FS_UFS,
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome IG_FS_PCFS
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome};
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome/* partition info for boot block location. */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soomestruct stage_part {
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome char *path; /* device name */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome int fd; /* open file descriptor */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome int id; /* partition/slice number */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome enum ig_devtype_t devtype; /* partitioning type */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome enum ig_fstype_t fstype; /* none or pcfs */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome uint64_t start; /* partition LBA */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome uint64_t size; /* partition size */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome uint64_t offset; /* block offset */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome};
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome/* boot device data */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soometypedef struct _ib_device {
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome char *path; /* whole disk */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome int fd; /* whole disk fd */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome enum ig_devtype_t devtype;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome struct stage_part stage; /* location of boot block */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome struct stage_part target; /* target file system */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome char mbr[SECTOR_SIZE];
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome} ib_device_t;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome/* stage 2 location */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soometypedef struct _ib_bootblock {
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome char *buf;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome char *file;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome char *extra;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome multiboot_header_t *mboot;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome uint32_t mboot_off;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome uint32_t file_size;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome uint32_t buf_size;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome uint32_t extra_size;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome} ib_bootblock_t;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soometypedef struct _ib_data {
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome unsigned char stage1[SECTOR_SIZE]; /* partition boot block */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome ib_device_t device; /* boot device */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome ib_bootblock_t bootblock; /* stage 2 */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome} ib_data_t;
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define BBLK_BLKLIST_OFF 50 /* vtoc/disk boot offset */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define BBLK_ZFS_BLK_OFF 1024 /* vdev boot offset */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define BBLK_ZFS_BLK_SIZE (7ULL << 19) /* vdev max boot size */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome/* locations of MBR parts, must be reviewd if mbr code is changed */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define STAGE1_BPB_OFFSET (0x3) /* technically BPB starts at 0xb */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define STAGE1_BPB_SIZE (0x3b)
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define STAGE1_MBR_VERSION (0xfa) /* 2 bytes, not used */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define STAGE1_STAGE2_SIZE (0xfc) /* 16bits */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define STAGE1_STAGE2_LBA (0xfe) /* 64bits */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define STAGE1_STAGE2_UUID (0x106) /* 128bits */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define STAGE1_SIG (0x1b8) /* 4+2 bytes */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define STAGE1_PARTTBL (0x1be) /* MBR partition table */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#define STAGE1_MAGIC (0x1fe) /* 0xAA55 */
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#ifdef __cplusplus
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome}
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#endif
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome
0c946d80993858b7b1314e0b31773e48500e03fbToomas Soome#endif /* _INSTALLBOOT_H */