VirtualBox

Changeset 81506 in vbox for trunk/src/VBox/Devices/EFI


Ignore:
Timestamp:
Oct 24, 2019 2:51:43 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134234
Message:

FlasCore: Experimental read cache, disabled. bugref:6940

Location:
trunk/src/VBox/Devices/EFI
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/EFI/FlashCore.cpp

    r81502 r81506  
    127127#ifdef IN_RING3
    128128                    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
    129135                    /* NB: Writes are instant and never fail. */
    130136                    LogFunc(("wrote byte to flash at %08RX32: %02X\n", off, bCmd));
     
    217223}
    218224
     225#if defined(FLASH_WITH_RZ_READ_CACHE_SIZE) && defined(IN_RING3)
     226/**
     227 * Fills the RZ cache with data.
     228 */
     229DECL_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
    219271/**
    220272 * Worker for flashRead that deals with a single byte.
     
    235287        case FLASH_CMD_ARRAY_READ:
    236288            if (off < pThis->cbFlashSize)
     289            {
    237290#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
    238298                bValue = pThis->pbFlash[off];
    239299#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
    240313                return VINF_IOM_R3_MMIO_READ;
     314# endif
    241315#endif
     316            }
    242317            else
    243318                bValue = 0xff; /* Play safe and return the default value of non initialized flash. */
     
    319394    pThis->cbBlockSize = cbBlock;
    320395    pThis->cbFlashSize = cbFlash;
     396#ifdef FLASH_WITH_RZ_READ_CACHE_SIZE
     397    pThis->offCache    = UINT32_MAX;
     398#endif
    321399
    322400    /* Set up the flash data. */
  • trunk/src/VBox/Devices/EFI/FlashCore.h

    r81502 r81506  
    4848#define FLASH_SAVED_STATE_VERSION           1
    4949
     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
    5056
    5157/*********************************************************************************************************************************
     
    7278    /** The configured block size of the device. */
    7379    uint16_t                cbBlockSize;
     80    /** The actual flash memory data.  */
     81    R3PTRTYPE(uint8_t *)    pbFlash;
    7482    /** The flash memory region size.  */
    7583    uint32_t                cbFlashSize;
    76     /** The actual flash memory data.  */
    77     R3PTRTYPE(uint8_t *)    pbFlash;
    7884    /** @} */
     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
    79102} FLASHCORE;
    80103
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette