1/* 2 * Copyright (c) 2011-2013, 2018 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 --- 78 unchanged lines hidden (view full) --- 87 const unsigned int _cacheLineSize; 88 89 public: 90 PortProxy(MasterPort &port, unsigned int cacheLineSize) : 91 _port(port), _cacheLineSize(cacheLineSize) 92 {} 93 virtual ~PortProxy() { } 94 |
95 96 97 /** Fixed functionality for use in base classes. */ 98 |
99 /** |
100 * Read size bytes memory at physical address and store in p. 101 */ 102 void readBlobPhys(Addr addr, Request::Flags flags, 103 uint8_t* p, int size) const; 104 105 /** 106 * Write size bytes from p to physical address. 107 */ 108 void writeBlobPhys(Addr addr, Request::Flags flags, 109 const uint8_t* p, int size) const; 110 111 /** 112 * Fill size bytes starting at physical addr with byte value val. 113 */ 114 void memsetBlobPhys(Addr addr, Request::Flags flags, 115 uint8_t v, int size) const; 116 117 118 119 /** Methods to override in base classes */ 120 121 /** |
122 * Read size bytes memory at address and store in p. |
123 * Returns true on success and false on failure. |
124 */ |
125 virtual bool 126 tryReadBlob(Addr addr, uint8_t *p, int size) const |
127 { 128 readBlobPhys(addr, 0, p, size); |
129 return true; |
130 } 131 132 /** 133 * Write size bytes from p to address. |
134 * Returns true on success and false on failure. |
135 */ |
136 virtual bool 137 tryWriteBlob(Addr addr, const uint8_t *p, int size) const |
138 { 139 writeBlobPhys(addr, 0, p, size); |
140 return true; |
141 } 142 143 /** 144 * Fill size bytes starting at addr with byte value val. |
145 * Returns true on success and false on failure. |
146 */ |
147 virtual bool 148 tryMemsetBlob(Addr addr, uint8_t val, int size) const |
149 { |
150 memsetBlobPhys(addr, 0, val, size); 151 return true; |
152 } 153 |
154 155 156 /** Higher level interfaces based on the above. */ 157 |
158 /** |
159 * Same as tryReadBlob, but insists on success. |
160 */ |
161 void 162 readBlob(Addr addr, uint8_t* p, int size) const 163 { 164 if (!tryReadBlob(addr, p, size)) 165 fatal("readBlob(%#x, ...) failed", addr); 166 } |
167 168 /** |
169 * Same as tryWriteBlob, but insists on success. |
170 */ |
171 void 172 writeBlob(Addr addr, const uint8_t* p, int size) const 173 { 174 if (!tryWriteBlob(addr, p, size)) 175 fatal("writeBlob(%#x, ...) failed", addr); 176 } |
177 178 /** |
179 * Same as tryMemsetBlob, but insists on success. |
180 */ |
181 void 182 memsetBlob(Addr addr, uint8_t v, int size) const 183 { 184 if (!tryMemsetBlob(addr, v, size)) 185 fatal("memsetBlob(%#x, ...) failed", addr); 186 } |
187 188 /** 189 * Read sizeof(T) bytes from address and return as object T. 190 */ 191 template <typename T> 192 T read(Addr address) const; 193 194 /** --- 10 unchanged lines hidden (view full) --- 205 T read(Addr address, ByteOrder guest_byte_order) const; 206 207 /** 208 * Write object T to address. Writes sizeof(T) bytes. 209 * Performs endianness conversion from host to the selected guest order. 210 */ 211 template <typename T> 212 void write(Addr address, T data, ByteOrder guest_byte_order) const; |
213 214 /** 215 * Write the string str into guest memory at address addr. 216 * Returns true on success and false on failure. 217 */ 218 bool tryWriteString(Addr addr, const char *str) const; 219 220 /** 221 * Same as tryWriteString, but insists on success. 222 */ 223 void 224 writeString(Addr addr, const char *str) const 225 { 226 if (!tryWriteString(addr, str)) 227 fatal("writeString(%#x, ...) failed", addr); 228 } 229 230 /** 231 * Reads the string at guest address addr into the std::string str. 232 * Returns true on success and false on failure. 233 */ 234 bool tryReadString(std::string &str, Addr addr) const; 235 236 /** 237 * Same as tryReadString, but insists on success. 238 */ 239 void 240 readString(std::string &str, Addr addr) const 241 { 242 if (!tryReadString(str, addr)) 243 fatal("readString(%#x, ...) failed", addr); 244 } |
245}; 246 247 248template <typename T> 249T 250PortProxy::read(Addr address) const 251{ 252 T data; --- 29 unchanged lines hidden --- |