cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

virtio_blk.h (6948B)


      1#ifndef _LINUX_VIRTIO_BLK_H
      2#define _LINUX_VIRTIO_BLK_H
      3/* This header is BSD licensed so anyone can use the definitions to implement
      4 * compatible drivers/servers.
      5 *
      6 * Redistribution and use in source and binary forms, with or without
      7 * modification, are permitted provided that the following conditions
      8 * are met:
      9 * 1. Redistributions of source code must retain the above copyright
     10 *    notice, this list of conditions and the following disclaimer.
     11 * 2. Redistributions in binary form must reproduce the above copyright
     12 *    notice, this list of conditions and the following disclaimer in the
     13 *    documentation and/or other materials provided with the distribution.
     14 * 3. Neither the name of IBM nor the names of its contributors
     15 *    may be used to endorse or promote products derived from this software
     16 *    without specific prior written permission.
     17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
     18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20 * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
     21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27 * SUCH DAMAGE. */
     28#include "standard-headers/linux/types.h"
     29#include "standard-headers/linux/virtio_ids.h"
     30#include "standard-headers/linux/virtio_config.h"
     31#include "standard-headers/linux/virtio_types.h"
     32
     33/* Feature bits */
     34#define VIRTIO_BLK_F_SIZE_MAX	1	/* Indicates maximum segment size */
     35#define VIRTIO_BLK_F_SEG_MAX	2	/* Indicates maximum # of segments */
     36#define VIRTIO_BLK_F_GEOMETRY	4	/* Legacy geometry available  */
     37#define VIRTIO_BLK_F_RO		5	/* Disk is read-only */
     38#define VIRTIO_BLK_F_BLK_SIZE	6	/* Block size of disk is available*/
     39#define VIRTIO_BLK_F_TOPOLOGY	10	/* Topology information is available */
     40#define VIRTIO_BLK_F_MQ		12	/* support more than one vq */
     41#define VIRTIO_BLK_F_DISCARD	13	/* DISCARD is supported */
     42#define VIRTIO_BLK_F_WRITE_ZEROES	14	/* WRITE ZEROES is supported */
     43
     44/* Legacy feature bits */
     45#ifndef VIRTIO_BLK_NO_LEGACY
     46#define VIRTIO_BLK_F_BARRIER	0	/* Does host support barriers? */
     47#define VIRTIO_BLK_F_SCSI	7	/* Supports scsi command passthru */
     48#define VIRTIO_BLK_F_FLUSH	9	/* Flush command supported */
     49#define VIRTIO_BLK_F_CONFIG_WCE	11	/* Writeback mode available in config */
     50/* Old (deprecated) name for VIRTIO_BLK_F_FLUSH. */
     51#define VIRTIO_BLK_F_WCE VIRTIO_BLK_F_FLUSH
     52#endif /* !VIRTIO_BLK_NO_LEGACY */
     53
     54#define VIRTIO_BLK_ID_BYTES	20	/* ID string length */
     55
     56struct virtio_blk_config {
     57	/* The capacity (in 512-byte sectors). */
     58	__virtio64 capacity;
     59	/* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */
     60	__virtio32 size_max;
     61	/* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */
     62	__virtio32 seg_max;
     63	/* geometry of the device (if VIRTIO_BLK_F_GEOMETRY) */
     64	struct virtio_blk_geometry {
     65		__virtio16 cylinders;
     66		uint8_t heads;
     67		uint8_t sectors;
     68	} geometry;
     69
     70	/* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */
     71	__virtio32 blk_size;
     72
     73	/* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY  */
     74	/* exponent for physical block per logical block. */
     75	uint8_t physical_block_exp;
     76	/* alignment offset in logical blocks. */
     77	uint8_t alignment_offset;
     78	/* minimum I/O size without performance penalty in logical blocks. */
     79	__virtio16 min_io_size;
     80	/* optimal sustained I/O size in logical blocks. */
     81	__virtio32 opt_io_size;
     82
     83	/* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */
     84	uint8_t wce;
     85	uint8_t unused;
     86
     87	/* number of vqs, only available when VIRTIO_BLK_F_MQ is set */
     88	__virtio16 num_queues;
     89
     90	/* the next 3 entries are guarded by VIRTIO_BLK_F_DISCARD */
     91	/*
     92	 * The maximum discard sectors (in 512-byte sectors) for
     93	 * one segment.
     94	 */
     95	__virtio32 max_discard_sectors;
     96	/*
     97	 * The maximum number of discard segments in a
     98	 * discard command.
     99	 */
    100	__virtio32 max_discard_seg;
    101	/* Discard commands must be aligned to this number of sectors. */
    102	__virtio32 discard_sector_alignment;
    103
    104	/* the next 3 entries are guarded by VIRTIO_BLK_F_WRITE_ZEROES */
    105	/*
    106	 * The maximum number of write zeroes sectors (in 512-byte sectors) in
    107	 * one segment.
    108	 */
    109	__virtio32 max_write_zeroes_sectors;
    110	/*
    111	 * The maximum number of segments in a write zeroes
    112	 * command.
    113	 */
    114	__virtio32 max_write_zeroes_seg;
    115	/*
    116	 * Set if a VIRTIO_BLK_T_WRITE_ZEROES request may result in the
    117	 * deallocation of one or more of the sectors.
    118	 */
    119	uint8_t write_zeroes_may_unmap;
    120
    121	uint8_t unused1[3];
    122} QEMU_PACKED;
    123
    124/*
    125 * Command types
    126 *
    127 * Usage is a bit tricky as some bits are used as flags and some are not.
    128 *
    129 * Rules:
    130 *   VIRTIO_BLK_T_OUT may be combined with VIRTIO_BLK_T_SCSI_CMD or
    131 *   VIRTIO_BLK_T_BARRIER.  VIRTIO_BLK_T_FLUSH is a command of its own
    132 *   and may not be combined with any of the other flags.
    133 */
    134
    135/* These two define direction. */
    136#define VIRTIO_BLK_T_IN		0
    137#define VIRTIO_BLK_T_OUT	1
    138
    139#ifndef VIRTIO_BLK_NO_LEGACY
    140/* This bit says it's a scsi command, not an actual read or write. */
    141#define VIRTIO_BLK_T_SCSI_CMD	2
    142#endif /* VIRTIO_BLK_NO_LEGACY */
    143
    144/* Cache flush command */
    145#define VIRTIO_BLK_T_FLUSH	4
    146
    147/* Get device ID command */
    148#define VIRTIO_BLK_T_GET_ID    8
    149
    150/* Discard command */
    151#define VIRTIO_BLK_T_DISCARD	11
    152
    153/* Write zeroes command */
    154#define VIRTIO_BLK_T_WRITE_ZEROES	13
    155
    156#ifndef VIRTIO_BLK_NO_LEGACY
    157/* Barrier before this op. */
    158#define VIRTIO_BLK_T_BARRIER	0x80000000
    159#endif /* !VIRTIO_BLK_NO_LEGACY */
    160
    161/*
    162 * This comes first in the read scatter-gather list.
    163 * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated,
    164 * this is the first element of the read scatter-gather list.
    165 */
    166struct virtio_blk_outhdr {
    167	/* VIRTIO_BLK_T* */
    168	__virtio32 type;
    169	/* io priority. */
    170	__virtio32 ioprio;
    171	/* Sector (ie. 512 byte offset) */
    172	__virtio64 sector;
    173};
    174
    175/* Unmap this range (only valid for write zeroes command) */
    176#define VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP	0x00000001
    177
    178/* Discard/write zeroes range for each request. */
    179struct virtio_blk_discard_write_zeroes {
    180	/* discard/write zeroes start sector */
    181	uint64_t sector;
    182	/* number of discard/write zeroes sectors */
    183	uint32_t num_sectors;
    184	/* flags for this range */
    185	uint32_t flags;
    186};
    187
    188#ifndef VIRTIO_BLK_NO_LEGACY
    189struct virtio_scsi_inhdr {
    190	__virtio32 errors;
    191	__virtio32 data_len;
    192	__virtio32 sense_len;
    193	__virtio32 residual;
    194};
    195#endif /* !VIRTIO_BLK_NO_LEGACY */
    196
    197/* And this is the final byte of the write scatter-gather list. */
    198#define VIRTIO_BLK_S_OK		0
    199#define VIRTIO_BLK_S_IOERR	1
    200#define VIRTIO_BLK_S_UNSUPP	2
    201#endif /* _LINUX_VIRTIO_BLK_H */