⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 system.h

📁 xen 3.2.2 源码
💻 H
字号:
#ifndef __X86_32_SYSTEM_H__#define __X86_32_SYSTEM_H__static always_inline unsigned long long __cmpxchg8b(    volatile void *ptr, unsigned long long old, unsigned long long new){    unsigned long long prev;    asm volatile (        LOCK_PREFIX "cmpxchg8b %3"        : "=A" (prev)        : "c" ((u32)(new>>32)), "b" ((u32)new),          "m" (*__xg((volatile void *)ptr)), "0" (old)        : "memory" );    return prev;}#define cmpxchg(ptr,o,n)                                \({                                                      \    __typeof__(*(ptr)) __prev;                          \    switch ( sizeof(*(ptr)) ) {                         \    case 8:                                             \        __prev = ((__typeof__(*(ptr)))__cmpxchg8b(      \            (ptr),                                      \            (unsigned long long)(o),                    \            (unsigned long long)(n)));                  \        break;                                          \    default:                                            \        __prev = ((__typeof__(*(ptr)))__cmpxchg(        \            (ptr),                                      \            (unsigned long)(o),                         \            (unsigned long)(n),                         \            sizeof(*(ptr))));                           \        break;                                          \    }                                                   \    __prev;                                             \})/* * This function causes value _o to be changed to _n at location _p. * If this access causes a fault then we return 1, otherwise we return 0. * If no fault occurs then _o is updated to the value we saw at _p. If this * is the same as the initial value of _o then _n is written to location _p. */#define __cmpxchg_user(_p,_o,_n,_isuff,_oppre,_regtype)                 \    asm volatile (                                                      \        "1: " LOCK_PREFIX "cmpxchg"_isuff" %"_oppre"2,%3\n"             \        "2:\n"                                                          \        ".section .fixup,\"ax\"\n"                                      \        "3:     movl $1,%1\n"                                           \        "       jmp 2b\n"                                               \        ".previous\n"                                                   \        ".section __ex_table,\"a\"\n"                                   \        "       .align 4\n"                                             \        "       .long 1b,3b\n"                                          \        ".previous"                                                     \        : "=a" (_o), "=r" (_rc)                                         \        : _regtype (_n), "m" (*__xg((volatile void *)_p)), "0" (_o), "1" (0) \        : "memory");#define cmpxchg_user(_p,_o,_n)                                          \({                                                                      \    int _rc;                                                            \    switch ( sizeof(*(_p)) ) {                                          \    case 1:                                                             \        __cmpxchg_user(_p,_o,_n,"b","b","q");                           \        break;                                                          \    case 2:                                                             \        __cmpxchg_user(_p,_o,_n,"w","w","r");                           \        break;                                                          \    case 4:                                                             \        __cmpxchg_user(_p,_o,_n,"l","","r");                            \        break;                                                          \    case 8:                                                             \        asm volatile (                                                  \            "1: " LOCK_PREFIX "cmpxchg8b %4\n"                          \            "2:\n"                                                      \            ".section .fixup,\"ax\"\n"                                  \            "3:     movl $1,%1\n"                                       \            "       jmp 2b\n"                                           \            ".previous\n"                                               \            ".section __ex_table,\"a\"\n"                               \            "       .align 4\n"                                         \            "       .long 1b,3b\n"                                      \            ".previous"                                                 \            : "=A" (_o), "=r" (_rc)                                     \            : "c" ((u32)((u64)(_n)>>32)), "b" ((u32)(_n)),              \              "m" (*__xg((volatile void *)(_p))), "0" (_o), "1" (0)     \            : "memory");                                                \        break;                                                          \    }                                                                   \    _rc;                                                                \})static inline void atomic_write64(uint64_t *p, uint64_t v){    uint64_t w = *p, x;    while ( (x = __cmpxchg8b(p, w, v)) != w )        w = x;}#define mb()                    \    asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" )#define __save_flags(x)         \    asm volatile ( "pushfl ; popl %0" : "=g" (x) : )#define __restore_flags(x)      \    asm volatile ( "pushl %0 ; popfl" : : "g" (x) : "memory", "cc" )#define local_irq_save(x)       \    asm volatile ( "pushfl ; popl %0 ; cli" : "=g" (x) : : "memory" )#define local_irq_restore(x)    \    __restore_flags(x)#endif /* __X86_32_SYSTEM_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -