0001
0002 #ifndef __ASM_QSPINLOCK_PARAVIRT_H
0003 #define __ASM_QSPINLOCK_PARAVIRT_H
0004
0005 #include <asm/ibt.h>
0006
0007
0008
0009
0010
0011
0012
0013 #ifdef CONFIG_64BIT
0014
0015 PV_CALLEE_SAVE_REGS_THUNK(__pv_queued_spin_unlock_slowpath);
0016 #define __pv_queued_spin_unlock __pv_queued_spin_unlock
0017 #define PV_UNLOCK "__raw_callee_save___pv_queued_spin_unlock"
0018 #define PV_UNLOCK_SLOWPATH "__raw_callee_save___pv_queued_spin_unlock_slowpath"
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 asm (".pushsection .text;"
0040 ".globl " PV_UNLOCK ";"
0041 ".type " PV_UNLOCK ", @function;"
0042 ".align 4,0x90;"
0043 PV_UNLOCK ": "
0044 ASM_ENDBR
0045 FRAME_BEGIN
0046 "push %rdx;"
0047 "mov $0x1,%eax;"
0048 "xor %edx,%edx;"
0049 LOCK_PREFIX "cmpxchg %dl,(%rdi);"
0050 "cmp $0x1,%al;"
0051 "jne .slowpath;"
0052 "pop %rdx;"
0053 FRAME_END
0054 ASM_RET
0055 ".slowpath: "
0056 "push %rsi;"
0057 "movzbl %al,%esi;"
0058 "call " PV_UNLOCK_SLOWPATH ";"
0059 "pop %rsi;"
0060 "pop %rdx;"
0061 FRAME_END
0062 ASM_RET
0063 ".size " PV_UNLOCK ", .-" PV_UNLOCK ";"
0064 ".popsection");
0065
0066 #else
0067
0068 extern void __pv_queued_spin_unlock(struct qspinlock *lock);
0069 PV_CALLEE_SAVE_REGS_THUNK(__pv_queued_spin_unlock);
0070
0071 #endif
0072 #endif