gem5  v21.1.0.2
vma.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2020 Advanced Micro Devices, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include "sim/vma.hh"
30 
31 #include <sys/mman.h>
32 #include <sys/stat.h>
33 
34 #include "base/types.hh"
35 
36 namespace gem5
37 {
38 
39 void
40 VMA::fillMemPages(Addr start, Addr size, PortProxy &port) const
41 {
42  auto offset = start - _addrRange.start();
43 
47  if (offset < _hostBufLen) {
48  auto size = std::min(_hostBufLen - offset, _pageBytes);
49  port.writeBlob(start, (uint8_t*)_hostBuf + offset, size);
50  }
51 }
52 
53 bool
55 {
56  return (r.start() > _addrRange.start() && r.end() < _addrRange.end());
57 }
58 
59 void
61 {
62  if (hasHostBuf()) {
63  auto nonoverlap_len = slice_addr - _addrRange.start();
64  _hostBufLen = std::min(_hostBufLen, nonoverlap_len);
65  }
66 
67  _addrRange = AddrRange(_addrRange.start(), slice_addr);
68 
69  DPRINTF(Vma, "slice right vma start %#x end %#x\n", _addrRange.start(),
70  _addrRange.end());
71 
72  sanityCheck();
73 }
74 
75 void
77 {
78  if (hasHostBuf()) {
79  auto overlap_len = slice_addr - _addrRange.start();
80 
81  if (overlap_len >= _hostBufLen) {
82  _hostBufLen = 0;
83  _hostBuf = nullptr;
84  _origHostBuf = nullptr;
85  } else {
86  _hostBufLen -= overlap_len;
87  }
88 
89  _hostBuf = (void *)((uint8_t *)_hostBuf + overlap_len);
90  }
91 
92  _addrRange = AddrRange(slice_addr, _addrRange.end());
93 
94  DPRINTF(Vma, "slice left vma start %#x end %#x\n", _addrRange.start(),
95  _addrRange.end());
96 
97  sanityCheck();
98 }
99 
100 void
102 {
106  assert(_addrRange.start() != _addrRange.end());
107 
111  assert(_addrRange.start() < _addrRange.end());
112 
117  assert((_addrRange.start() % _pageBytes) == 0);
118  assert((_addrRange.end() % _pageBytes) == 0);
119 }
120 
122  off_t offset)
123  : _buffer(nullptr), _length(length)
124 {
125  panic_if(_length == 0, "Tried to mmap file of length zero");
126 
127  struct stat file_stat;
128  if (fstat(fd, &file_stat) > 0) {
129  panic("Cannot stat file: %s\n", strerror(errno));
130  }
131 
132  // Don't bother mapping more than the actual file size
133  panic_if(offset > file_stat.st_size,
134  "Tried to mmap with offset greater than file size");
135  _length = std::min((size_t)(file_stat.st_size - offset), _length);
136 
137  // cannot call mmap with _length == 0
138  if (_length) {
139  _buffer = mmap(NULL, _length, PROT_READ,
140  MAP_PRIVATE, fd, offset);
141  if (_buffer == MAP_FAILED) {
142  panic("Failed to map file into host address space: %s",
143  strerror(errno));
144  }
145  } else {
146  panic("Tried to mmap 0 bytes");
147  }
148 }
149 
151 {
152  if (_buffer) {
153  panic_if(munmap(_buffer, _length) == -1,
154  "mmap: failed to unmap file-backed host memory: %s",
155  strerror(errno));
156  }
157 }
158 
159 } // namespace gem5
gem5::VMA::_addrRange
AddrRange _addrRange
Address range for this virtual memory area.
Definition: vma.hh:146
gem5::AddrRange::start
Addr start() const
Get the start address of the range.
Definition: addr_range.hh:317
gem5::PortProxy::writeBlob
void writeBlob(Addr addr, const void *p, int size) const
Same as tryWriteBlob, but insists on success.
Definition: port_proxy.hh:192
gem5::VMA::sanityCheck
void sanityCheck()
Definition: vma.cc:101
gem5::VMA::hasHostBuf
bool hasHostBuf() const
Check if the virtual memory area has an equivalent buffer on the host machine.
Definition: vma.hh:83
gem5::VMA::MappedFileBuffer::MappedFileBuffer
MappedFileBuffer(int fd, size_t length, off_t offset)
Definition: vma.cc:121
gem5::ArmISA::fd
Bitfield< 14, 12 > fd
Definition: types.hh:150
gem5::VMA::fillMemPages
void fillMemPages(Addr start, Addr size, PortProxy &port) const
Copy memory from a buffer which resides on the host machine into a section of memory on the target.
Definition: vma.cc:40
gem5::VMA::_pageBytes
Addr _pageBytes
Number of bytes in an OS page.
Definition: vma.hh:151
gem5::VMA::MappedFileBuffer::_length
size_t _length
Definition: vma.hh:197
gem5::VMA::isStrictSuperset
bool isStrictSuperset(const AddrRange &range) const
Returns true if desired range exists within this virtual memory area and does not include the start a...
Definition: vma.cc:54
gem5::VMA::size
Addr size()
Defer AddrRange related calls to the AddrRange.
Definition: vma.hh:112
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:186
gem5::PortProxy
This object is a proxy for a port or other object which implements the functional response protocol,...
Definition: port_proxy.hh:86
gem5::ArmISA::offset
Bitfield< 23, 0 > offset
Definition: types.hh:144
gem5::AddrRange::end
Addr end() const
Get the end address of the range.
Definition: addr_range.hh:324
gem5::VMA::start
Addr start()
Definition: vma.hh:113
gem5::VMA::_hostBufLen
uint64_t _hostBufLen
Length of host buffer for this virtual memory area.
Definition: vma.hh:170
gem5::Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:147
gem5::VMA::_hostBuf
void * _hostBuf
Host buffer ptr for this virtual memory area.
Definition: vma.hh:165
panic_if
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Definition: logging.hh:203
gem5::VMA::sliceRegionLeft
void sliceRegionLeft(Addr slice_addr)
Remove the address range to the left of slice_addr.
Definition: vma.cc:76
gem5::VMA::MappedFileBuffer::~MappedFileBuffer
~MappedFileBuffer()
Definition: vma.cc:150
types.hh
gem5::VMA::_origHostBuf
std::shared_ptr< MappedFileBuffer > _origHostBuf
The host file backing will be chopped up and reassigned as pages are mapped, remapped,...
Definition: vma.hh:160
gem5::VMA::sliceRegionRight
void sliceRegionRight(Addr slice_addr)
Remove the address range to the right of slice_addr.
Definition: vma.cc:60
gem5::MipsISA::r
r
Definition: pra_constants.hh:98
gem5::AddrRange
The AddrRange class encapsulates an address range, and supports a number of tests to check if two ran...
Definition: addr_range.hh:71
vma.hh
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: decoder.cc:40
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:177
gem5::VMA::MappedFileBuffer::_buffer
void * _buffer
Definition: vma.hh:196

Generated on Tue Sep 21 2021 12:25:48 for gem5 by doxygen 1.8.17