gem5  v22.1.0.0
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 
44 namespace 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 
60 {
61 }
62 
63 void
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 
126 void
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 
140  Status status;
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);
159  status = S_UNSUPP;
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:186
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:294
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
#define SectorSize
Definition: disk_image.hh:44
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:178
#define warn(...)
Definition: logging.hh:246
ByteOrder byteOrder(const ThreadContext *tc)
Definition: utility.hh:357
Bitfield< 23, 0 > offset
Definition: types.hh:144
Bitfield< 5, 0 > status
Definition: misc_types.hh:429
Bitfield< 15 > system
Definition: misc.hh:1004
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
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 Wed Dec 21 2022 10:22:35 for gem5 by doxygen 1.9.1