VirtualBox

Changeset 43682 in vbox for trunk/src/VBox/Runtime/common


Ignore:
Timestamp:
Oct 18, 2012 3:41:15 PM (12 years ago)
Author:
vboxsync
Message:

asm-fake: Replace {u,}int32_t by {u,}int8_t to fix bus errors on certain architectures like Sparc because of unaligned accesses

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/asm/asm-fake.cpp

    r40959 r43682  
    229229RTDECL(void) ASMBitSet(volatile void *pvBitmap, int32_t iBit)
    230230{
    231     uint32_t volatile *pau32Bitmap = (uint32_t volatile *)pvBitmap;
    232     pau32Bitmap[iBit / 32] |= RT_BIT_32(iBit & 31);
     231    uint8_t volatile *pau8Bitmap = (uint8_t volatile *)pvBitmap;
     232    pau8Bitmap[iBit / 8] |= (uint8_t)RT_BIT_32(iBit & 7);
    233233}
    234234
     
    240240RTDECL(void) ASMBitClear(volatile void *pvBitmap, int32_t iBit)
    241241{
    242     uint32_t volatile *pau32Bitmap = (uint32_t volatile *)pvBitmap;
    243     pau32Bitmap[iBit / 32] &= ~RT_BIT_32(iBit & 31);
     242    uint8_t volatile *pau8Bitmap = (uint8_t volatile *)pvBitmap;
     243    pau8Bitmap[iBit / 8] &= ~((uint8_t)RT_BIT_32(iBit & 7));
    244244}
    245245
     
    251251RTDECL(void) ASMBitToggle(volatile void *pvBitmap, int32_t iBit)
    252252{
    253     uint32_t volatile *pau32Bitmap = (uint32_t volatile *)pvBitmap;
    254     pau32Bitmap[iBit / 32] ^= RT_BIT_32(iBit & 31);
     253    uint8_t volatile *pau8Bitmap = (uint8_t volatile *)pvBitmap;
     254    pau8Bitmap[iBit / 8] ^= (uint8_t)RT_BIT_32(iBit & 7);
    255255}
    256256
     
    300300RTDECL(bool) ASMBitTest(const volatile void *pvBitmap, int32_t iBit)
    301301{
    302     uint32_t volatile *pau32Bitmap = (uint32_t volatile *)pvBitmap;
    303     return pau32Bitmap[iBit / 32] & RT_BIT_32(iBit & 31) ? true : false;
     302    uint8_t volatile *pau8Bitmap = (uint8_t volatile *)pvBitmap;
     303    return  pau8Bitmap[iBit / 8] & (uint8_t)RT_BIT_32(iBit & 7) ? true : false;
    304304}
    305305
     
    307307{
    308308    uint32_t           iBit = 0;
    309     uint32_t volatile *pu32 = (uint32_t volatile *)pvBitmap;
     309    uint8_t volatile *pu8 = (uint8_t volatile *)pvBitmap;
     310
    310311    while (iBit < cBits)
    311312    {
    312         uint32_t u32 = *pu32;
    313         if (u32 != UINT32_MAX)
     313        uint8_t u8 = *pu8;
     314        if (u8 != UINT8_MAX)
    314315        {
    315             while (u32 & 1)
     316            while (u8 & 1)
    316317            {
    317                 u32 >>= 1;
     318                u8 >>= 1;
    318319                iBit++;
    319320            }
     
    323324        }
    324325
    325         iBit += 32;
    326         pu32++;
     326        iBit += 8;
     327        pu8++;
    327328    }
    328329    return -1;
     
    331332RTDECL(int) ASMBitNextClear(const volatile void *pvBitmap, uint32_t cBits, uint32_t iBitPrev)
    332333{
    333     const volatile uint32_t *pau32Bitmap = (const volatile uint32_t *)pvBitmap;
    334     int                      iBit = ++iBitPrev & 31;
     334    const volatile uint8_t *pau8Bitmap = (const volatile uint8_t *)pvBitmap;
     335    int                      iBit = ++iBitPrev & 7;
    335336    if (iBit)
    336337    {
    337338        /*
    338          * Inspect the 32-bit word containing the unaligned bit.
     339         * Inspect the byte containing the unaligned bit.
    339340         */
    340         uint32_t u32 = ~pau32Bitmap[iBitPrev / 32] >> iBit;
    341         if (u32)
     341        uint8_t u8 = ~pau8Bitmap[iBitPrev / 8] >> iBit;
     342        if (u8)
    342343        {
    343344            iBit = 0;
    344             while (!(u32 & 1))
     345            while (!(u8 & 1))
    345346            {
    346                 u32 >>= 1;
     347                u8 >>= 1;
    347348                iBit++;
    348349            }
     
    353354         * Skip ahead and see if there is anything left to search.
    354355         */
    355         iBitPrev |= 31;
     356        iBitPrev |= 7;
    356357        iBitPrev++;
    357         if (cBits <= (uint32_t)iBitPrev)
     358        if (cBits <= iBitPrev)
    358359            return -1;
    359360    }
    360361
    361362    /*
    362      * 32-bit aligned search, let ASMBitFirstClear do the dirty work.
     363     * Byte search, let ASMBitFirstClear do the dirty work.
    363364     */
    364     iBit = ASMBitFirstClear(&pau32Bitmap[iBitPrev / 32], cBits - iBitPrev);
     365    iBit = ASMBitFirstClear(&pau8Bitmap[iBitPrev / 8], cBits - iBitPrev);
    365366    if (iBit >= 0)
    366367        iBit += iBitPrev;
     
    371372{
    372373    uint32_t           iBit = 0;
    373     uint32_t volatile *pu32 = (uint32_t volatile *)pvBitmap;
     374    uint8_t volatile *pu8 = (uint8_t volatile *)pvBitmap;
    374375    while (iBit < cBits)
    375376    {
    376         uint32_t u32 = *pu32;
    377         if (u32 != 0)
     377        uint8_t u8 = *pu8;
     378        if (u8 != 0)
    378379        {
    379             while (!(u32 & 1))
     380            while (!(u8 & 1))
    380381            {
    381                 u32 >>= 1;
     382                u8 >>= 1;
    382383                iBit++;
    383384            }
     
    387388        }
    388389
    389         iBit += 32;
    390         pu32++;
     390        iBit += 8;
     391        pu8++;
    391392    }
    392393    return -1;
     
    395396RTDECL(int) ASMBitNextSet(const volatile void *pvBitmap, uint32_t cBits, uint32_t iBitPrev)
    396397{
    397     const volatile uint32_t *pau32Bitmap = (const volatile uint32_t *)pvBitmap;
    398     int                      iBit = ++iBitPrev & 31;
     398    const volatile uint8_t *pau8Bitmap = (const volatile uint8_t *)pvBitmap;
     399    int                      iBit = ++iBitPrev & 7;
    399400    if (iBit)
    400401    {
    401402        /*
    402          * Inspect the 32-bit word containing the unaligned bit.
     403         * Inspect the byte containing the unaligned bit.
    403404         */
    404         uint32_t u32 = pau32Bitmap[iBitPrev / 32] >> iBit;
    405         if (u32)
     405        uint8_t u8 = pau8Bitmap[iBitPrev / 8] >> iBit;
     406        if (u8)
    406407        {
    407408            iBit = 0;
    408             while (!(u32 & 1))
     409            while (!(u8 & 1))
    409410            {
    410                 u32 >>= 1;
     411                u8 >>= 1;
    411412                iBit++;
    412413            }
     
    417418         * Skip ahead and see if there is anything left to search.
    418419         */
    419         iBitPrev |= 31;
     420        iBitPrev |= 7;
    420421        iBitPrev++;
    421         if (cBits <= (uint32_t)iBitPrev)
     422        if (cBits <= iBitPrev)
    422423            return -1;
    423424    }
    424425
    425426    /*
    426      * 32-bit aligned search, let ASMBitFirstSet do the dirty work.
     427     * Byte search, let ASMBitFirstSet do the dirty work.
    427428     */
    428     iBit = ASMBitFirstSet(&pau32Bitmap[iBitPrev / 32], cBits - iBitPrev);
     429    iBit = ASMBitFirstSet(&pau8Bitmap[iBitPrev / 8], cBits - iBitPrev);
    429430    if (iBit >= 0)
    430431        iBit += iBitPrev;
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