^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _ASM_X86_ASM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _ASM_X86_ASM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #ifdef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) # define __ASM_FORM(x) x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) # define __ASM_FORM_RAW(x) x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) # define __ASM_FORM_COMMA(x) x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/stringify.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) # define __ASM_FORM(x) " " __stringify(x) " "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) # define __ASM_FORM_RAW(x) __stringify(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) # define __ASM_FORM_COMMA(x) " " __stringify(x) ","
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #ifndef __x86_64__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) /* 32 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) # define __ASM_SEL(a,b) __ASM_FORM(a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* 64 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) # define __ASM_SEL(a,b) __ASM_FORM(b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define __ASM_SIZE(inst, ...) __ASM_SEL(inst##l##__VA_ARGS__, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) inst##q##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define __ASM_REG(reg) __ASM_SEL_RAW(e##reg, r##reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define _ASM_PTR __ASM_SEL(.long, .quad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define _ASM_MOV __ASM_SIZE(mov)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define _ASM_INC __ASM_SIZE(inc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define _ASM_DEC __ASM_SIZE(dec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define _ASM_ADD __ASM_SIZE(add)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define _ASM_SUB __ASM_SIZE(sub)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define _ASM_XADD __ASM_SIZE(xadd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define _ASM_MUL __ASM_SIZE(mul)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define _ASM_AX __ASM_REG(ax)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define _ASM_BX __ASM_REG(bx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define _ASM_CX __ASM_REG(cx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define _ASM_DX __ASM_REG(dx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define _ASM_SP __ASM_REG(sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define _ASM_BP __ASM_REG(bp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define _ASM_SI __ASM_REG(si)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define _ASM_DI __ASM_REG(di)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #ifndef __x86_64__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /* 32 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define _ASM_ARG1 _ASM_AX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define _ASM_ARG2 _ASM_DX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define _ASM_ARG3 _ASM_CX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define _ASM_ARG1L eax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define _ASM_ARG2L edx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define _ASM_ARG3L ecx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define _ASM_ARG1W ax
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define _ASM_ARG2W dx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define _ASM_ARG3W cx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define _ASM_ARG1B al
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define _ASM_ARG2B dl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define _ASM_ARG3B cl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) /* 64 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define _ASM_ARG1 _ASM_DI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define _ASM_ARG2 _ASM_SI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define _ASM_ARG3 _ASM_DX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define _ASM_ARG4 _ASM_CX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define _ASM_ARG5 r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define _ASM_ARG6 r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define _ASM_ARG1Q rdi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define _ASM_ARG2Q rsi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define _ASM_ARG3Q rdx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define _ASM_ARG4Q rcx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define _ASM_ARG5Q r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define _ASM_ARG6Q r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define _ASM_ARG1L edi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define _ASM_ARG2L esi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define _ASM_ARG3L edx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define _ASM_ARG4L ecx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define _ASM_ARG5L r8d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define _ASM_ARG6L r9d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define _ASM_ARG1W di
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define _ASM_ARG2W si
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define _ASM_ARG3W dx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define _ASM_ARG4W cx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define _ASM_ARG5W r8w
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define _ASM_ARG6W r9w
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define _ASM_ARG1B dil
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define _ASM_ARG2B sil
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define _ASM_ARG3B dl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define _ASM_ARG4B cl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define _ASM_ARG5B r8b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define _ASM_ARG6B r9b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * Macros to generate condition code outputs from inline assembly,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * The output operand must be type "bool".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #ifdef __GCC_ASM_FLAG_OUTPUTS__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) # define CC_SET(c) "\n\t/* output condition code " #c "*/\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) # define CC_OUT(c) "=@cc" #c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) # define CC_SET(c) "\n\tset" #c " %[_cc_" #c "]\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) # define CC_OUT(c) [_cc_ ## c] "=qm"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /* Exception table entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #ifdef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) # define _ASM_EXTABLE_HANDLE(from, to, handler) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .pushsection "__ex_table","a" ; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .balign 4 ; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) .long (from) - . ; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) .long (to) - . ; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .long (handler) - . ; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .popsection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) # define _ASM_EXTABLE(from, to) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) # define _ASM_EXTABLE_UA(from, to) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) _ASM_EXTABLE_HANDLE(from, to, ex_handler_uaccess)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) # define _ASM_EXTABLE_CPY(from, to) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) _ASM_EXTABLE_HANDLE(from, to, ex_handler_copy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) # define _ASM_EXTABLE_FAULT(from, to) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) # ifdef CONFIG_KPROBES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) # define _ASM_NOKPROBE(entry) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .pushsection "_kprobe_blacklist","aw" ; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) _ASM_ALIGN ; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) _ASM_PTR (entry); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .popsection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) # else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) # define _ASM_NOKPROBE(entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) # endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #else /* ! __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) # define _EXPAND_EXTABLE_HANDLE(x) #x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) # define _ASM_EXTABLE_HANDLE(from, to, handler) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) " .pushsection \"__ex_table\",\"a\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) " .balign 4\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) " .long (" #from ") - .\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) " .long (" #to ") - .\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) " .long (" _EXPAND_EXTABLE_HANDLE(handler) ") - .\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) " .popsection\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) # define _ASM_EXTABLE(from, to) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) # define _ASM_EXTABLE_UA(from, to) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) _ASM_EXTABLE_HANDLE(from, to, ex_handler_uaccess)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) # define _ASM_EXTABLE_CPY(from, to) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) _ASM_EXTABLE_HANDLE(from, to, ex_handler_copy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) # define _ASM_EXTABLE_FAULT(from, to) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) /* For C file, we already have NOKPROBE_SYMBOL macro */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) * This output constraint should be used for any inline asm which has a "call"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) * instruction. Otherwise the asm may be inserted before the frame pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) * gets set up by the containing function. If you forget to do this, objtool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) * may print a "call without frame pointer save/setup" warning.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) register unsigned long current_stack_pointer asm(_ASM_SP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #endif /* _ASM_X86_ASM_H */