root/arch/x86/include/asm/asm.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */