freebsd-dev/sys/boot/common/disk.h
Toomas Soome 151139ad9e loader: disk/part api needs to use uint64_t offsets
The disk_* and part_* api is using 64bit values for media size and
offsets. However, the current api is using off_t type, which is signed
64-bit int.

In this context the signed media size does not make any sense, and
the offsets are used to mark absolute, not relative locations.

Also, the data from GPT partition table and some other sources is
already using uint64_t data type, so using signed off_t can cause sign
issues.

Reviewed by:	imp
Approved by:	imp (mentor)
Differential Revision:	https://reviews.freebsd.org/D8710
2017-02-01 20:10:56 +00:00

120 lines
4.0 KiB
C

/*-
* Copyright (c) 2011 Google, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
*
* $FreeBSD$
*/
/*
* Device descriptor for partitioned disks. To use, set the
* d_slice and d_partition variables as follows:
*
* Whole disk access:
*
* d_slice = -1
* d_partition = -1
*
* Whole MBR slice:
*
* d_slice = MBR slice number (typically 1..4)
* d_partition = -1
*
* BSD disklabel partition within an MBR slice:
*
* d_slice = MBR slice number (typically 1..4)
* d_partition = disklabel partition (typically 0..19)
*
* BSD disklabel partition on the true dedicated disk:
*
* d_slice = -1
* d_partition = disklabel partition (typically 0..19)
*
* GPT partition:
*
* d_slice = GPT partition number (typically 1..N)
* d_partition = 255
*
* For both MBR and GPT, to automatically find the 'best' slice or partition,
* set d_slice to zero. This uses the partition type to decide which partition
* to use according to the following list of preferences:
*
* FreeBSD (active)
* FreeBSD (inactive)
* Linux (active)
* Linux (inactive)
* DOS/Windows (active)
* DOS/Windows (inactive)
*
* Active MBR slices (marked as bootable) are preferred over inactive. GPT
* doesn't have the concept of active/inactive partitions. In both MBR and GPT,
* if there are multiple slices/partitions of a given type, the first one
* is chosen.
*
* The low-level disk device will typically call disk_open() from its open
* method to interpret the disk partition tables according to the rules above.
* This will initialize d_offset to the block offset of the start of the
* selected partition - this offset should be added to the offset passed to
* the device's strategy method.
*/
struct disk_devdesc
{
struct devsw *d_dev;
int d_type;
int d_unit;
void *d_opendata;
int d_slice;
int d_partition;
uint64_t d_offset;
};
enum disk_ioctl {
IOCTL_GET_BLOCKS,
IOCTL_GET_BLOCK_SIZE
};
/*
* Parse disk metadata and initialise dev->d_offset.
*/
extern int disk_open(struct disk_devdesc *dev, uint64_t mediasize,
u_int sectorsize, u_int flags);
#define DISK_F_NOCACHE 0x0001 /* Do not use metadata caching */
extern int disk_close(struct disk_devdesc *dev);
extern void disk_cleanup(const struct devsw *d_dev);
extern int disk_ioctl(struct disk_devdesc *dev, u_long cmd, void *buf);
extern int disk_read(struct disk_devdesc *dev, void *buf, uint64_t offset,
u_int blocks);
extern int disk_write(struct disk_devdesc *dev, void *buf, uint64_t offset,
u_int blocks);
extern int ptblread(void *d, void *buf, size_t blocks, uint64_t offset);
/*
* Print information about slices on a disk.
*/
extern int disk_print(struct disk_devdesc *dev, char *prefix, int verbose);
extern char* disk_fmtdev(struct disk_devdesc *dev);
extern int disk_parsedev(struct disk_devdesc *dev, const char *devspec,
const char **path);