VirtualBox

Changeset 87154 in vbox for trunk


Ignore:
Timestamp:
Jan 2, 2021 2:14:52 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142066
Message:

iprt/asm.h: ASMAtomicXchgU8 and ASMNopPause. bugref:9898 bugref:9026

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/asm.h

    r87147 r87154  
    169169
    170170
     171/** @def RT_INLINE_ASM_EXTERNAL_TMP_ARM
     172 * Temporary version of RT_INLINE_ASM_EXTERNAL that excludes ARM. */
     173#if RT_INLINE_ASM_EXTERNAL && !(defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32))
     174# define RT_INLINE_ASM_EXTERNAL_TMP_ARM 1
     175#else
     176# define RT_INLINE_ASM_EXTERNAL_TMP_ARM 0
     177#endif
     178
     179
    171180/** @def ASMReturnAddress
    172181 * Gets the return address of the current (or calling if you like) function or method.
     
    243252    }
    244253#  endif
     254
     255# elif defined(RT_ARCH_ARM32) || defined(RT_ARCH_ARM64)
     256    __asm__ __volatile__("yield\n\t"); /* ARMv6K+ */
     257
    245258# else
    246259    /* dummy */
     
    257270 * @param   u8     The 8-bit value to assign to *pu8.
    258271 */
    259 #if RT_INLINE_ASM_EXTERNAL
     272#if RT_INLINE_ASM_EXTERNAL_TMP_ARM
    260273RT_ASM_DECL_PRAGMA_WATCOM(uint8_t) ASMAtomicXchgU8(volatile uint8_t RT_FAR *pu8, uint8_t u8) RT_NOTHROW_PROTO;
    261274#else
    262275DECLINLINE(uint8_t) ASMAtomicXchgU8(volatile uint8_t RT_FAR *pu8, uint8_t u8) RT_NOTHROW_DEF
    263276{
    264 # if RT_INLINE_ASM_GNU_STYLE
     277# if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
     278#  if RT_INLINE_ASM_GNU_STYLE
    265279    __asm__ __volatile__("xchgb %0, %1\n\t"
    266280                         : "=m" (*pu8),
     
    268282                         : "1" (u8),
    269283                           "m" (*pu8));
    270 # else
     284#  else
    271285    __asm
    272286    {
    273 ifdef RT_ARCH_AMD64
     287 ifdef RT_ARCH_AMD64
    274288        mov     rdx, [pu8]
    275289        mov     al, [u8]
    276290        xchg    [rdx], al
    277291        mov     [u8], al
    278 else
     292 else
    279293        mov     edx, [pu8]
    280294        mov     al, [u8]
    281295        xchg    [edx], al
    282296        mov     [u8], al
    283 endif
    284     }
    285 # endif
     297 endif
     298    }
     299#  endif
    286300    return u8;
     301
     302# elif defined(RT_ARCH_ARM32) || defined(RT_ARCH_ARM64)
     303    RTCCUINTREG uOld;
     304    RTCCUINTREG rcSpill;
     305    __asm__ __volatile__("try_again%=:\n\t"
     306#  if defined(RT_ARCH_ARM64)
     307                         "ldaxrb %w0, [%3]\n\t"
     308                         "stlxrb %w1, %w2, [%3]\n\t"
     309                         "cbnz %w1, try_again%=\n\t"
     310#  else
     311                         "ldrexb %0, [%3]\n\t"      /* ARMv6+ */
     312                         "strex %1, %2, [%3]\n\t"
     313                         "cmp %1, #0\n\t"
     314                         "bne try_again%=\n\t"
     315#  endif
     316                         : "=&r" (uOld),
     317                           "=&r" (rcSpill)
     318                         : "r" ((RTCCUINTREG)u8),
     319                           "r" (pu8)
     320                         : "memory");
     321    return (uint8_t)uOld;
     322
     323# else
     324#  error "Port me"
     325# endif
    287326}
    288327#endif
Note: See TracChangeset for help on using the changeset viewer.

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