linux-user: Use do_munmap for target_mmap failure
[qemu/kevin.git] / hw / virtio / virtio-config-io.c
blobad78e0b9bc51b7914c0e116289393de05b969885
1 /*
2 * Virtio Support
4 * Copyright IBM, Corp. 2007
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
9 * SPDX-License-Identifier: GPL-2.0-or-later
12 #include "qemu/osdep.h"
13 #include "hw/virtio/virtio.h"
14 #include "cpu.h"
16 uint32_t virtio_config_readb(VirtIODevice *vdev, uint32_t addr)
18 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
19 uint8_t val;
21 if (addr + sizeof(val) > vdev->config_len) {
22 return (uint32_t)-1;
25 k->get_config(vdev, vdev->config);
27 val = ldub_p(vdev->config + addr);
28 return val;
31 uint32_t virtio_config_readw(VirtIODevice *vdev, uint32_t addr)
33 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
34 uint16_t val;
36 if (addr + sizeof(val) > vdev->config_len) {
37 return (uint32_t)-1;
40 k->get_config(vdev, vdev->config);
42 val = lduw_p(vdev->config + addr);
43 return val;
46 uint32_t virtio_config_readl(VirtIODevice *vdev, uint32_t addr)
48 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
49 uint32_t val;
51 if (addr + sizeof(val) > vdev->config_len) {
52 return (uint32_t)-1;
55 k->get_config(vdev, vdev->config);
57 val = ldl_p(vdev->config + addr);
58 return val;
61 void virtio_config_writeb(VirtIODevice *vdev, uint32_t addr, uint32_t data)
63 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
64 uint8_t val = data;
66 if (addr + sizeof(val) > vdev->config_len) {
67 return;
70 stb_p(vdev->config + addr, val);
72 if (k->set_config) {
73 k->set_config(vdev, vdev->config);
77 void virtio_config_writew(VirtIODevice *vdev, uint32_t addr, uint32_t data)
79 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
80 uint16_t val = data;
82 if (addr + sizeof(val) > vdev->config_len) {
83 return;
86 stw_p(vdev->config + addr, val);
88 if (k->set_config) {
89 k->set_config(vdev, vdev->config);
93 void virtio_config_writel(VirtIODevice *vdev, uint32_t addr, uint32_t data)
95 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
96 uint32_t val = data;
98 if (addr + sizeof(val) > vdev->config_len) {
99 return;
102 stl_p(vdev->config + addr, val);
104 if (k->set_config) {
105 k->set_config(vdev, vdev->config);
109 uint32_t virtio_config_modern_readb(VirtIODevice *vdev, uint32_t addr)
111 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
112 uint8_t val;
114 if (addr + sizeof(val) > vdev->config_len) {
115 return (uint32_t)-1;
118 k->get_config(vdev, vdev->config);
120 val = ldub_p(vdev->config + addr);
121 return val;
124 uint32_t virtio_config_modern_readw(VirtIODevice *vdev, uint32_t addr)
126 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
127 uint16_t val;
129 if (addr + sizeof(val) > vdev->config_len) {
130 return (uint32_t)-1;
133 k->get_config(vdev, vdev->config);
135 val = lduw_le_p(vdev->config + addr);
136 return val;
139 uint32_t virtio_config_modern_readl(VirtIODevice *vdev, uint32_t addr)
141 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
142 uint32_t val;
144 if (addr + sizeof(val) > vdev->config_len) {
145 return (uint32_t)-1;
148 k->get_config(vdev, vdev->config);
150 val = ldl_le_p(vdev->config + addr);
151 return val;
154 void virtio_config_modern_writeb(VirtIODevice *vdev,
155 uint32_t addr, uint32_t data)
157 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
158 uint8_t val = data;
160 if (addr + sizeof(val) > vdev->config_len) {
161 return;
164 stb_p(vdev->config + addr, val);
166 if (k->set_config) {
167 k->set_config(vdev, vdev->config);
171 void virtio_config_modern_writew(VirtIODevice *vdev,
172 uint32_t addr, uint32_t data)
174 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
175 uint16_t val = data;
177 if (addr + sizeof(val) > vdev->config_len) {
178 return;
181 stw_le_p(vdev->config + addr, val);
183 if (k->set_config) {
184 k->set_config(vdev, vdev->config);
188 void virtio_config_modern_writel(VirtIODevice *vdev,
189 uint32_t addr, uint32_t data)
191 VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
192 uint32_t val = data;
194 if (addr + sizeof(val) > vdev->config_len) {
195 return;
198 stl_le_p(vdev->config + addr, val);
200 if (k->set_config) {
201 k->set_config(vdev, vdev->config);