mirror of
https://github.com/qemu/qemu.git
synced 2025-08-10 03:59:16 +00:00
pc-bios/s390-ccw: qemuize types
Turn [the most of] existing declarations from struct type_name { ... }; into struct TypeName { ... }; typedef struct TypeName TypeName; and make use of them. Also switch u{8,16,32,64} to uint{8,16,32,64}_t. Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
dc25e843f6
commit
b88d7fa590
@ -14,7 +14,7 @@
|
|||||||
char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
|
char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
|
||||||
char ring_area[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
|
char ring_area[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
|
||||||
uint64_t boot_value;
|
uint64_t boot_value;
|
||||||
static struct subchannel_id blk_schid = { .one = 1 };
|
static SubChannelId blk_schid = { .one = 1 };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Priniciples of Operations (SA22-7832-09) chapter 17 requires that
|
* Priniciples of Operations (SA22-7832-09) chapter 17 requires that
|
||||||
@ -23,7 +23,7 @@ static struct subchannel_id blk_schid = { .one = 1 };
|
|||||||
*/
|
*/
|
||||||
void write_subsystem_identification(void)
|
void write_subsystem_identification(void)
|
||||||
{
|
{
|
||||||
struct subchannel_id *schid = (struct subchannel_id *) 184;
|
SubChannelId *schid = (SubChannelId *) 184;
|
||||||
uint32_t *zeroes = (uint32_t *) 188;
|
uint32_t *zeroes = (uint32_t *) 188;
|
||||||
|
|
||||||
*schid = blk_schid;
|
*schid = blk_schid;
|
||||||
@ -38,7 +38,7 @@ void panic(const char *string)
|
|||||||
while (1) { }
|
while (1) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool find_dev(struct schib *schib, int dev_no)
|
static bool find_dev(Schib *schib, int dev_no)
|
||||||
{
|
{
|
||||||
int i, r;
|
int i, r;
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ static bool find_dev(struct schib *schib, int dev_no)
|
|||||||
|
|
||||||
static void virtio_setup(uint64_t dev_info)
|
static void virtio_setup(uint64_t dev_info)
|
||||||
{
|
{
|
||||||
struct schib schib;
|
Schib schib;
|
||||||
int ssid;
|
int ssid;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
uint16_t dev_no;
|
uint16_t dev_no;
|
||||||
|
@ -45,6 +45,14 @@ typedef unsigned long long __u64;
|
|||||||
|
|
||||||
#include "cio.h"
|
#include "cio.h"
|
||||||
|
|
||||||
|
typedef struct irb Irb;
|
||||||
|
typedef struct ccw1 Ccw1;
|
||||||
|
typedef struct cmd_orb CmdOrb;
|
||||||
|
typedef struct schib Schib;
|
||||||
|
typedef struct chsc_area_sda ChscAreaSda;
|
||||||
|
typedef struct senseid SenseId;
|
||||||
|
typedef struct subchannel_id SubChannelId;
|
||||||
|
|
||||||
/* start.s */
|
/* start.s */
|
||||||
void disabled_wait(void);
|
void disabled_wait(void);
|
||||||
void consume_sclp_int(void);
|
void consume_sclp_int(void);
|
||||||
@ -63,8 +71,8 @@ void sclp_setup(void);
|
|||||||
/* virtio.c */
|
/* virtio.c */
|
||||||
unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
|
unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
|
||||||
ulong subchan_id, void *load_addr);
|
ulong subchan_id, void *load_addr);
|
||||||
bool virtio_is_blk(struct subchannel_id schid);
|
bool virtio_is_blk(SubChannelId schid);
|
||||||
void virtio_setup_block(struct subchannel_id schid);
|
void virtio_setup_block(SubChannelId schid);
|
||||||
int virtio_read(ulong sector, void *load_addr);
|
int virtio_read(ulong sector, void *load_addr);
|
||||||
int enable_mss_facility(void);
|
int enable_mss_facility(void);
|
||||||
ulong get_second(void);
|
ulong get_second(void);
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include "s390-ccw.h"
|
#include "s390-ccw.h"
|
||||||
#include "virtio.h"
|
#include "virtio.h"
|
||||||
|
|
||||||
static struct vring block;
|
static VRing block;
|
||||||
|
|
||||||
static char chsc_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
|
static char chsc_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ static long kvm_hypercall(unsigned long nr, unsigned long param1,
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_notify(struct subchannel_id schid)
|
static void virtio_notify(SubChannelId schid)
|
||||||
{
|
{
|
||||||
kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32 *)&schid, 0);
|
kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32 *)&schid, 0);
|
||||||
}
|
}
|
||||||
@ -40,9 +40,9 @@ static void virtio_notify(struct subchannel_id schid)
|
|||||||
* Virtio functions *
|
* Virtio functions *
|
||||||
***********************************************/
|
***********************************************/
|
||||||
|
|
||||||
static int drain_irqs(struct subchannel_id schid)
|
static int drain_irqs(SubChannelId schid)
|
||||||
{
|
{
|
||||||
struct irb irb = {};
|
Irb irb = {};
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@ -59,11 +59,11 @@ static int drain_irqs(struct subchannel_id schid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int run_ccw(struct subchannel_id schid, int cmd, void *ptr, int len)
|
static int run_ccw(SubChannelId schid, int cmd, void *ptr, int len)
|
||||||
{
|
{
|
||||||
struct ccw1 ccw = {};
|
Ccw1 ccw = {};
|
||||||
struct cmd_orb orb = {};
|
CmdOrb orb = {};
|
||||||
struct schib schib;
|
Schib schib;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
/* start command processing */
|
/* start command processing */
|
||||||
@ -92,7 +92,7 @@ static int run_ccw(struct subchannel_id schid, int cmd, void *ptr, int len)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_set_status(struct subchannel_id schid,
|
static void virtio_set_status(SubChannelId schid,
|
||||||
unsigned long dev_addr)
|
unsigned long dev_addr)
|
||||||
{
|
{
|
||||||
unsigned char status = dev_addr;
|
unsigned char status = dev_addr;
|
||||||
@ -101,18 +101,18 @@ static void virtio_set_status(struct subchannel_id schid,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_reset(struct subchannel_id schid)
|
static void virtio_reset(SubChannelId schid)
|
||||||
{
|
{
|
||||||
run_ccw(schid, CCW_CMD_VDEV_RESET, NULL, 0);
|
run_ccw(schid, CCW_CMD_VDEV_RESET, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vring_init(struct vring *vr, unsigned int num, void *p,
|
static void vring_init(VRing *vr, unsigned int num, void *p,
|
||||||
unsigned long align)
|
unsigned long align)
|
||||||
{
|
{
|
||||||
debug_print_addr("init p", p);
|
debug_print_addr("init p", p);
|
||||||
vr->num = num;
|
vr->num = num;
|
||||||
vr->desc = p;
|
vr->desc = p;
|
||||||
vr->avail = p + num*sizeof(struct vring_desc);
|
vr->avail = p + num * sizeof(VRingDesc);
|
||||||
vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1)
|
vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1)
|
||||||
& ~(align - 1));
|
& ~(align - 1));
|
||||||
|
|
||||||
@ -129,12 +129,12 @@ static void vring_init(struct vring *vr, unsigned int num, void *p,
|
|||||||
debug_print_addr("init vr", vr);
|
debug_print_addr("init vr", vr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vring_notify(struct subchannel_id schid)
|
static void vring_notify(SubChannelId schid)
|
||||||
{
|
{
|
||||||
virtio_notify(schid);
|
virtio_notify(schid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vring_send_buf(struct vring *vr, void *p, int len, int flags)
|
static void vring_send_buf(VRing *vr, void *p, int len, int flags)
|
||||||
{
|
{
|
||||||
/* For follow-up chains we need to keep the first entry point */
|
/* For follow-up chains we need to keep the first entry point */
|
||||||
if (!(flags & VRING_HIDDEN_IS_CHAIN)) {
|
if (!(flags & VRING_HIDDEN_IS_CHAIN)) {
|
||||||
@ -174,10 +174,10 @@ ulong get_second(void)
|
|||||||
*
|
*
|
||||||
* Returns 0 on success, 1 on timeout.
|
* Returns 0 on success, 1 on timeout.
|
||||||
*/
|
*/
|
||||||
static int vring_wait_reply(struct vring *vr, int timeout)
|
static int vring_wait_reply(VRing *vr, int timeout)
|
||||||
{
|
{
|
||||||
ulong target_second = get_second() + timeout;
|
ulong target_second = get_second() + timeout;
|
||||||
struct subchannel_id schid = vr->schid;
|
SubChannelId schid = vr->schid;
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
/* Wait until the used index has moved. */
|
/* Wait until the used index has moved. */
|
||||||
@ -204,7 +204,7 @@ static int vring_wait_reply(struct vring *vr, int timeout)
|
|||||||
|
|
||||||
int virtio_read_many(ulong sector, void *load_addr, int sec_num)
|
int virtio_read_many(ulong sector, void *load_addr, int sec_num)
|
||||||
{
|
{
|
||||||
struct virtio_blk_outhdr out_hdr;
|
VirtioBlkOuthdr out_hdr;
|
||||||
u8 status;
|
u8 status;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
@ -363,10 +363,10 @@ uint64_t virtio_get_blocks(void)
|
|||||||
(virtio_get_block_size() / VIRTIO_SECTOR_SIZE);
|
(virtio_get_block_size() / VIRTIO_SECTOR_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void virtio_setup_block(struct subchannel_id schid)
|
void virtio_setup_block(SubChannelId schid)
|
||||||
{
|
{
|
||||||
struct vq_info_block info;
|
VqInfo info;
|
||||||
struct vq_config_block config = {};
|
VqConfig config = {};
|
||||||
|
|
||||||
blk_cfg.blk_size = 0; /* mark "illegal" - setup started... */
|
blk_cfg.blk_size = 0; /* mark "illegal" - setup started... */
|
||||||
guessed_disk_nature = false;
|
guessed_disk_nature = false;
|
||||||
@ -406,10 +406,10 @@ void virtio_setup_block(struct subchannel_id schid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool virtio_is_blk(struct subchannel_id schid)
|
bool virtio_is_blk(SubChannelId schid)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
struct senseid senseid = {};
|
SenseId senseid = {};
|
||||||
|
|
||||||
/* run sense id command */
|
/* run sense id command */
|
||||||
r = run_ccw(schid, CCW_CMD_SENSE_ID, &senseid, sizeof(senseid));
|
r = run_ccw(schid, CCW_CMD_SENSE_ID, &senseid, sizeof(senseid));
|
||||||
@ -426,7 +426,7 @@ bool virtio_is_blk(struct subchannel_id schid)
|
|||||||
int enable_mss_facility(void)
|
int enable_mss_facility(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct chsc_area_sda *sda_area = (struct chsc_area_sda *) chsc_page;
|
ChscAreaSda *sda_area = (ChscAreaSda *) chsc_page;
|
||||||
|
|
||||||
memset(sda_area, 0, PAGE_SIZE);
|
memset(sda_area, 0, PAGE_SIZE);
|
||||||
sda_area->request.length = 0x0400;
|
sda_area->request.length = 0x0400;
|
||||||
|
@ -23,48 +23,54 @@
|
|||||||
/* We've given up on this device. */
|
/* We've given up on this device. */
|
||||||
#define VIRTIO_CONFIG_S_FAILED 0x80
|
#define VIRTIO_CONFIG_S_FAILED 0x80
|
||||||
|
|
||||||
enum virtio_dev_type {
|
enum VirtioDevType {
|
||||||
VIRTIO_ID_NET = 1,
|
VIRTIO_ID_NET = 1,
|
||||||
VIRTIO_ID_BLOCK = 2,
|
VIRTIO_ID_BLOCK = 2,
|
||||||
VIRTIO_ID_CONSOLE = 3,
|
VIRTIO_ID_CONSOLE = 3,
|
||||||
VIRTIO_ID_BALLOON = 5,
|
VIRTIO_ID_BALLOON = 5,
|
||||||
};
|
};
|
||||||
|
typedef enum VirtioDevType VirtioDevType;
|
||||||
|
|
||||||
struct virtio_dev_header {
|
struct VirtioDevHeader {
|
||||||
enum virtio_dev_type type : 8;
|
VirtioDevType type:8;
|
||||||
u8 num_vq;
|
uint8_t num_vq;
|
||||||
u8 feature_len;
|
uint8_t feature_len;
|
||||||
u8 config_len;
|
uint8_t config_len;
|
||||||
u8 status;
|
uint8_t status;
|
||||||
u8 vqconfig[];
|
uint8_t vqconfig[];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
typedef struct VirtioDevHeader VirtioDevHeader;
|
||||||
|
|
||||||
struct virtio_vqconfig {
|
struct VirtioVqConfig {
|
||||||
u64 token;
|
uint64_t token;
|
||||||
u64 address;
|
uint64_t address;
|
||||||
u16 num;
|
uint16_t num;
|
||||||
u8 pad[6];
|
uint8_t pad[6];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
typedef struct VirtioVqConfig VirtioVqConfig;
|
||||||
|
|
||||||
struct vq_info_block {
|
struct VqInfo {
|
||||||
u64 queue;
|
uint64_t queue;
|
||||||
u32 align;
|
uint32_t align;
|
||||||
u16 index;
|
uint16_t index;
|
||||||
u16 num;
|
uint16_t num;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
typedef struct VqInfo VqInfo;
|
||||||
|
|
||||||
struct vq_config_block {
|
struct VqConfig {
|
||||||
u16 index;
|
uint16_t index;
|
||||||
u16 num;
|
uint16_t num;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
typedef struct VqConfig VqConfig;
|
||||||
|
|
||||||
struct virtio_dev {
|
struct VirtioDev {
|
||||||
struct virtio_dev_header *header;
|
VirtioDevHeader *header;
|
||||||
struct virtio_vqconfig *vqconfig;
|
VirtioVqConfig *vqconfig;
|
||||||
char *host_features;
|
char *host_features;
|
||||||
char *guest_features;
|
char *guest_features;
|
||||||
char *config;
|
char *config;
|
||||||
};
|
};
|
||||||
|
typedef struct VirtioDev VirtioDev;
|
||||||
|
|
||||||
#define KVM_S390_VIRTIO_RING_ALIGN 4096
|
#define KVM_S390_VIRTIO_RING_ALIGN 4096
|
||||||
|
|
||||||
@ -81,46 +87,51 @@ struct virtio_dev {
|
|||||||
#define VRING_HIDDEN_IS_CHAIN 256
|
#define VRING_HIDDEN_IS_CHAIN 256
|
||||||
|
|
||||||
/* Virtio ring descriptors: 16 bytes. These can chain together via "next". */
|
/* Virtio ring descriptors: 16 bytes. These can chain together via "next". */
|
||||||
struct vring_desc {
|
struct VRingDesc {
|
||||||
/* Address (guest-physical). */
|
/* Address (guest-physical). */
|
||||||
u64 addr;
|
uint64_t addr;
|
||||||
/* Length. */
|
/* Length. */
|
||||||
u32 len;
|
uint32_t len;
|
||||||
/* The flags as indicated above. */
|
/* The flags as indicated above. */
|
||||||
u16 flags;
|
uint16_t flags;
|
||||||
/* We chain unused descriptors via this, too */
|
/* We chain unused descriptors via this, too */
|
||||||
u16 next;
|
uint16_t next;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
typedef struct VRingDesc VRingDesc;
|
||||||
|
|
||||||
struct vring_avail {
|
struct VRingAvail {
|
||||||
u16 flags;
|
uint16_t flags;
|
||||||
u16 idx;
|
uint16_t idx;
|
||||||
u16 ring[];
|
uint16_t ring[];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
typedef struct VRingAvail VRingAvail;
|
||||||
|
|
||||||
/* u32 is used here for ids for padding reasons. */
|
/* uint32_t is used here for ids for padding reasons. */
|
||||||
struct vring_used_elem {
|
struct VRingUsedElem {
|
||||||
/* Index of start of used descriptor chain. */
|
/* Index of start of used descriptor chain. */
|
||||||
u32 id;
|
uint32_t id;
|
||||||
/* Total length of the descriptor chain which was used (written to) */
|
/* Total length of the descriptor chain which was used (written to) */
|
||||||
u32 len;
|
uint32_t len;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
typedef struct VRingUsedElem VRingUsedElem;
|
||||||
|
|
||||||
struct vring_used {
|
struct VRingUsed {
|
||||||
u16 flags;
|
uint16_t flags;
|
||||||
u16 idx;
|
uint16_t idx;
|
||||||
struct vring_used_elem ring[];
|
VRingUsedElem ring[];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
typedef struct VRingUsed VRingUsed;
|
||||||
|
|
||||||
struct vring {
|
struct VRing {
|
||||||
unsigned int num;
|
unsigned int num;
|
||||||
int next_idx;
|
int next_idx;
|
||||||
int used_idx;
|
int used_idx;
|
||||||
struct vring_desc *desc;
|
VRingDesc *desc;
|
||||||
struct vring_avail *avail;
|
VRingAvail *avail;
|
||||||
struct vring_used *used;
|
VRingUsed *used;
|
||||||
struct subchannel_id schid;
|
SubChannelId schid;
|
||||||
};
|
};
|
||||||
|
typedef struct VRing VRing;
|
||||||
|
|
||||||
|
|
||||||
/***********************************************
|
/***********************************************
|
||||||
@ -152,37 +163,39 @@ struct vring {
|
|||||||
#define VIRTIO_BLK_T_BARRIER 0x80000000
|
#define VIRTIO_BLK_T_BARRIER 0x80000000
|
||||||
|
|
||||||
/* This is the first element of the read scatter-gather list. */
|
/* This is the first element of the read scatter-gather list. */
|
||||||
struct virtio_blk_outhdr {
|
struct VirtioBlkOuthdr {
|
||||||
/* VIRTIO_BLK_T* */
|
/* VIRTIO_BLK_T* */
|
||||||
u32 type;
|
uint32_t type;
|
||||||
/* io priority. */
|
/* io priority. */
|
||||||
u32 ioprio;
|
uint32_t ioprio;
|
||||||
/* Sector (ie. 512 byte offset) */
|
/* Sector (ie. 512 byte offset) */
|
||||||
u64 sector;
|
uint64_t sector;
|
||||||
};
|
};
|
||||||
|
typedef struct VirtioBlkOuthdr VirtioBlkOuthdr;
|
||||||
|
|
||||||
typedef struct VirtioBlkConfig {
|
struct VirtioBlkConfig {
|
||||||
u64 capacity; /* in 512-byte sectors */
|
uint64_t capacity; /* in 512-byte sectors */
|
||||||
u32 size_max; /* max segment size (if VIRTIO_BLK_F_SIZE_MAX) */
|
uint32_t size_max; /* max segment size (if VIRTIO_BLK_F_SIZE_MAX) */
|
||||||
u32 seg_max; /* max number of segments (if VIRTIO_BLK_F_SEG_MAX) */
|
uint32_t seg_max; /* max number of segments (if VIRTIO_BLK_F_SEG_MAX) */
|
||||||
|
|
||||||
struct virtio_blk_geometry {
|
struct VirtioBlkGeometry {
|
||||||
u16 cylinders;
|
uint16_t cylinders;
|
||||||
u8 heads;
|
uint8_t heads;
|
||||||
u8 sectors;
|
uint8_t sectors;
|
||||||
} geometry; /* (if VIRTIO_BLK_F_GEOMETRY) */
|
} geometry; /* (if VIRTIO_BLK_F_GEOMETRY) */
|
||||||
|
|
||||||
u32 blk_size; /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */
|
uint32_t blk_size; /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */
|
||||||
|
|
||||||
/* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY */
|
/* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY */
|
||||||
u8 physical_block_exp; /* exponent for physical block per logical block */
|
uint8_t physical_block_exp; /* exponent for physical blk per logical blk */
|
||||||
u8 alignment_offset; /* alignment offset in logical blocks */
|
uint8_t alignment_offset; /* alignment offset in logical blocks */
|
||||||
u16 min_io_size; /* min I/O size without performance penalty
|
uint16_t min_io_size; /* min I/O size without performance penalty
|
||||||
in logical blocks */
|
in logical blocks */
|
||||||
u32 opt_io_size; /* optimal sustained I/O size in logical blocks */
|
uint32_t opt_io_size; /* optimal sustained I/O size in logical blks */
|
||||||
|
|
||||||
u8 wce; /* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */
|
uint8_t wce; /* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */
|
||||||
} __attribute__((packed)) VirtioBlkConfig;
|
} __attribute__((packed));
|
||||||
|
typedef struct VirtioBlkConfig VirtioBlkConfig;
|
||||||
|
|
||||||
bool virtio_guessed_disk_nature(void);
|
bool virtio_guessed_disk_nature(void);
|
||||||
void virtio_assume_scsi(void);
|
void virtio_assume_scsi(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user