gem5 v24.0.0.0
Loading...
Searching...
No Matches
block.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2014 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#include "dev/virtio/block.hh"
39
40#include "debug/VIOBlock.hh"
41#include "params/VirtIOBlock.hh"
42#include "sim/system.hh"
43
44namespace gem5
45{
46
48 : VirtIODeviceBase(params, ID_BLOCK, sizeof(Config), 0),
49 qRequests(params.system->physProxy, byteOrder,
50 params.queueSize, *this),
51 image(*params.image)
52{
54
56}
57
58
62
63void
65{
66 Config cfg_out;
68
69 readConfigBlob(pkt, cfgOffset, (uint8_t *)&cfg_out);
70}
71
74 size_t off_data, size_t size)
75{
77 uint64_t sector(req.sector);
78
79 DPRINTF(VIOBlock, "Read request starting @ sector %i (size: %i)\n",
80 sector, size);
81
82 if (size % SectorSize != 0)
83 panic("Unexpected request/sector size relationship\n");
84
85 for (Addr offset = 0; offset < size; offset += SectorSize) {
86 if (image.read(&data[offset], sector) != SectorSize) {
87 warn("Failed to read sector %i\n", sector);
88 return S_IOERR;
89 }
90 ++sector;
91 }
92
93 desc_chain->chainWrite(off_data, &data[0], size);
94
95 return S_OK;
96}
97
100 size_t off_data, size_t size)
101{
103 uint64_t sector(req.sector);
104
105 DPRINTF(VIOBlock, "Write request starting @ sector %i (size: %i)\n",
106 sector, size);
107
108 if (size % SectorSize != 0)
109 panic("Unexpected request/sector size relationship\n");
110
111
112 desc_chain->chainRead(off_data, &data[0], size);
113
114 for (Addr offset = 0; offset < size; offset += SectorSize) {
115 if (image.write(&data[offset], sector) != SectorSize) {
116 warn("Failed to write sector %i\n", sector);
117 return S_IOERR;
118 }
119 ++sector;
120 }
121
122 return S_OK;
123
124}
125
126void
128{
129 DPRINTF(VIOBlock, "Got input data descriptor (len: %i)\n",
130 desc->size());
131 /*
132 * Read the request structure and do endian conversion if
133 * necessary.
134 */
135 BlkRequest req;
136 desc->chainRead(0, (uint8_t *)&req, sizeof(req));
137 req.type = htog(req.type, byteOrder);
138 req.sector = htog(req.sector, byteOrder);
139
141 const size_t data_size(desc->chainSize()
142 - sizeof(BlkRequest) - sizeof(Status));
143
144 switch (req.type) {
145 case T_IN:
146 status = parent.read(req, desc, sizeof(BlkRequest), data_size);
147 break;
148
149 case T_OUT:
150 status = parent.write(req, desc, sizeof(BlkRequest), data_size);
151 break;
152
153 case T_FLUSH:
154 status = S_OK;
155 break;
156
157 default:
158 warn("Unsupported IO request: %i\n", req.type);
160 break;
161 }
162
163 desc->chainWrite(sizeof(BlkRequest) + data_size,
164 &status, sizeof(status));
165
166 // Tell the guest that we are done with this descriptor.
167 produceDescriptor(desc, sizeof(BlkRequest) + data_size + sizeof(Status));
168 parent.kick();
169}
170
171} // namespace gem5
#define DPRINTF(x,...)
Definition trace.hh:210
const char data[]
virtual std::streampos write(const uint8_t *data, std::streampos offset)=0
virtual std::streampos size() const =0
virtual std::streampos read(uint8_t *data, std::streampos offset) const =0
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition packet.hh:295
VirtIO descriptor (chain) wrapper.
Definition base.hh:118
size_t size() const
Retrieve the size of this descriptor.
Definition base.hh:213
void chainRead(size_t offset, uint8_t *dst, size_t size) const
Read the contents of a descriptor chain.
Definition base.cc:172
void chainWrite(size_t offset, const uint8_t *src, size_t size)
Write to a descriptor chain.
Definition base.cc:195
size_t chainSize() const
Retrieve the size of this descriptor chain.
Definition base.cc:218
void onNotifyDescriptor(VirtDescriptor *desc)
Notify queue of pending incoming descriptor.
Definition block.cc:127
DiskImage & image
Image backing this device.
Definition block.hh:187
static const RequestType T_OUT
Write request.
Definition block.hh:112
static const RequestType T_FLUSH
Flush device buffers.
Definition block.hh:114
RequestQueue qRequests
Device I/O request queue.
Definition block.hh:184
VirtIOBlock(const Params &params)
Definition block.cc:47
static const Status S_UNSUPP
Request not supported.
Definition block.hh:126
uint8_t Status
Definition block.hh:120
VirtIOBlockParams Params
Definition block.hh:73
static const Status S_IOERR
Request failed due to a device error.
Definition block.hh:124
Status read(const BlkRequest &req, VirtDescriptor *desc_chain, size_t off_data, size_t size)
Device read request.
Definition block.cc:73
virtual ~VirtIOBlock()
Definition block.cc:59
Config config
Definition block.hh:92
static const Status S_OK
Request succeeded.
Definition block.hh:122
Status write(const BlkRequest &req, VirtDescriptor *desc_chain, size_t off_data, size_t size)
Device write request.
Definition block.cc:99
void readConfig(PacketPtr pkt, Addr cfgOffset)
Read from the configuration space of a device.
Definition block.cc:64
static const RequestType T_IN
Read request.
Definition block.hh:110
Base class for all VirtIO-based devices.
Definition base.hh:588
void kick()
Inform the guest of available buffers.
Definition base.hh:638
ByteOrder byteOrder
The byte order of the queues, descriptors, etc.
Definition base.hh:747
void readConfigBlob(PacketPtr pkt, Addr cfgOffset, const uint8_t *cfg)
Read configuration data from a device structure.
Definition base.cc:434
void registerQueue(VirtQueue &queue)
Register a new VirtQueue with the device model.
Definition base.cc:491
void produceDescriptor(VirtDescriptor *desc, uint32_t len)
Send a descriptor chain to the guest.
Definition base.cc:304
ByteOrder byteOrder
Byte order in this queue.
Definition base.hh:447
STL vector class.
Definition stl.hh:37
#define SectorSize
Definition disk_image.hh:44
#define panic(...)
This implements a cprintf based panic() function.
Definition logging.hh:188
#define warn(...)
Definition logging.hh:256
ByteOrder byteOrder(const ThreadContext *tc)
Definition utility.hh:359
Bitfield< 23, 0 > offset
Definition types.hh:144
Bitfield< 5, 0 > status
Bitfield< 15 > system
Definition misc.hh:1032
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
T htog(T value, ByteOrder guest_byte_order)
Definition byteswap.hh:187
VirtIO block device request as sent by guest.
Definition block.hh:131
Block device configuration structure.
Definition block.hh:89

Generated on Tue Jun 18 2024 16:24:04 for gem5 by doxygen 1.11.0