Changeset 81506 in vbox for trunk/src/VBox/Devices/EFI
- Timestamp:
- Oct 24, 2019 2:51:43 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134234
- Location:
- trunk/src/VBox/Devices/EFI
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FlashCore.cpp
r81502 r81506 127 127 #ifdef IN_RING3 128 128 pThis->pbFlash[off] = bCmd; 129 # ifdef FLASH_WITH_RZ_READ_CACHE_SIZE 130 uint32_t const offInCache = off - pThis->offCache; 131 if (offInCache < sizeof(pThis->CacheData) && pThis->offCache != UINT32_MAX) 132 pThis->CacheData.ab[offInCache] = bCmd; 133 # endif 134 129 135 /* NB: Writes are instant and never fail. */ 130 136 LogFunc(("wrote byte to flash at %08RX32: %02X\n", off, bCmd)); … … 217 223 } 218 224 225 #if defined(FLASH_WITH_RZ_READ_CACHE_SIZE) && defined(IN_RING3) 226 /** 227 * Fills the RZ cache with data. 228 */ 229 DECL_FORCE_INLINE(void) flashFillRzCache(PFLASHCORE pThis, uint32_t off) 230 { 231 AssertCompile(RT_IS_POWER_OF_TWO(sizeof(pThis->CacheData))); 232 uint32_t const offCache = (off + 1) & ~(sizeof(pThis->CacheData) - 1); 233 if (offCache < pThis->cbFlashSize) 234 { 235 Log2(("flashMemReadByte: Filling RZ cache: offset %#x\n", offCache)); 236 # if FLASH_WITH_RZ_READ_CACHE_SIZE < 8 237 uint64_t const * const pu64Src = ((uint64_t const *)&pThis->pbFlash[offCache]); 238 pThis->CacheData.au64[0] = pu64Src[0]; 239 # if FLASH_WITH_RZ_READ_CACHE_SIZE > 1 240 pThis->CacheData.au64[1] = pu64Src[1]; 241 # endif 242 # if FLASH_WITH_RZ_READ_CACHE_SIZE > 2 243 pThis->CacheData.au64[2] = pu64Src[2]; 244 # endif 245 # if FLASH_WITH_RZ_READ_CACHE_SIZE > 3 246 pThis->CacheData.au64[3] = pu64Src[3]; 247 # endif 248 # if FLASH_WITH_RZ_READ_CACHE_SIZE > 4 249 pThis->CacheData.au64[4] = pu64Src[4]; 250 # endif 251 # if FLASH_WITH_RZ_READ_CACHE_SIZE > 5 252 pThis->CacheData.au64[5] = pu64Src[5]; 253 # endif 254 # if FLASH_WITH_RZ_READ_CACHE_SIZE > 6 255 pThis->CacheData.au64[6] = pu64Src[6]; 256 # endif 257 # if FLASH_WITH_RZ_READ_CACHE_SIZE > 7 258 pThis->CacheData.au64[7] = pu64Src[7]; 259 # endif 260 # if FLASH_WITH_RZ_READ_CACHE_SIZE > 8 261 pThis->CacheData.au64[8] = pu64Src[8]; 262 # endif 263 # else 264 memcpy(pThis->CacheData.ab, &pThis->pbFlash[offCache], sizeof(pThis->CacheData.ab)); 265 # endif 266 pThis->offCache = offCache; 267 } 268 } 269 #endif /* FLASH_WITH_RZ_READ_CACHE_SIZE && IN_RING3 */ 270 219 271 /** 220 272 * Worker for flashRead that deals with a single byte. … … 235 287 case FLASH_CMD_ARRAY_READ: 236 288 if (off < pThis->cbFlashSize) 289 { 237 290 #ifdef IN_RING3 291 # ifdef FLASH_WITH_RZ_READ_CACHE_SIZE 292 AssertCompile(RT_IS_POWER_OF_TWO(sizeof(pThis->CacheData))); 293 if (off + 1 - pThis->offCache < sizeof(pThis->CacheData) && pThis->offCache != UINT32_MAX) 294 { } 295 else 296 flashFillRzCache(pThis, off); 297 # endif 238 298 bValue = pThis->pbFlash[off]; 239 299 #else 300 # ifdef FLASH_WITH_RZ_READ_CACHE_SIZE 301 uint32_t const offInCache = off - pThis->offCache; 302 if (offInCache < sizeof(pThis->CacheData) && pThis->offCache != UINT32_MAX) 303 { 304 Log2(("flashMemReadByte: cache hit (at %#RX32 in cache)\n", offInCache)); 305 bValue = pThis->CacheData.ab[offInCache]; 306 } 307 else 308 { 309 Log2(("flashMemReadByte: cache miss: offInCache=%#RX32 offCache=%#RX32\n", offInCache, pThis->offCache)); 310 return VINF_IOM_R3_MMIO_READ; 311 } 312 # else 240 313 return VINF_IOM_R3_MMIO_READ; 314 # endif 241 315 #endif 316 } 242 317 else 243 318 bValue = 0xff; /* Play safe and return the default value of non initialized flash. */ … … 319 394 pThis->cbBlockSize = cbBlock; 320 395 pThis->cbFlashSize = cbFlash; 396 #ifdef FLASH_WITH_RZ_READ_CACHE_SIZE 397 pThis->offCache = UINT32_MAX; 398 #endif 321 399 322 400 /* Set up the flash data. */ -
trunk/src/VBox/Devices/EFI/FlashCore.h
r81502 r81506 48 48 #define FLASH_SAVED_STATE_VERSION 1 49 49 50 #if 0 51 /** Enables the ring-0/raw-mode read cache optimization, giving the size in 52 * uint64_t units. */ 53 #define FLASH_WITH_RZ_READ_CACHE_SIZE 32 54 #endif 55 50 56 51 57 /********************************************************************************************************************************* … … 72 78 /** The configured block size of the device. */ 73 79 uint16_t cbBlockSize; 80 /** The actual flash memory data. */ 81 R3PTRTYPE(uint8_t *) pbFlash; 74 82 /** The flash memory region size. */ 75 83 uint32_t cbFlashSize; 76 /** The actual flash memory data. */77 R3PTRTYPE(uint8_t *) pbFlash;78 84 /** @} */ 85 86 #ifdef FLASH_WITH_RZ_READ_CACHE_SIZE 87 /** @name Read cache for non-ring-3 code. 88 * @{ */ 89 /** The cache offset, UINT32_MAX if invalid. */ 90 uint32_t offCache; 91 # if ARCH_BITS == 32 92 uint32_t uPadding; 93 # endif 94 /** The cache data. */ 95 union 96 { 97 uint64_t au64[FLASH_WITH_RZ_READ_CACHE_SIZE]; 98 uint8_t ab[FLASH_WITH_RZ_READ_CACHE_SIZE * 8]; 99 } CacheData; 100 /** @} */ 101 #endif 79 102 } FLASHCORE; 80 103
Note:
See TracChangeset
for help on using the changeset viewer.