linux/arch/x86/include/asm/asm.h
<<
>>
Prefs
   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/*
  50 * Macros to generate condition code outputs from inline assembly,
  51 * The output operand must be type "bool".
  52 */
  53#ifdef __GCC_ASM_FLAG_OUTPUTS__
  54# define CC_SET(c) "\n\t/* output condition code " #c "*/\n"
  55# define CC_OUT(c) "=@cc" #c
  56#else
  57# define CC_SET(c) "\n\tset" #c " %[_cc_" #c "]\n"
  58# define CC_OUT(c) [_cc_ ## c] "=qm"
  59#endif
  60
  61/* Exception table entry */
  62#ifdef __ASSEMBLY__
  63# define _ASM_EXTABLE_HANDLE(from, to, handler)                 \
  64        .pushsection "__ex_table","a" ;                         \
  65        .balign 4 ;                                             \
  66        .long (from) - . ;                                      \
  67        .long (to) - . ;                                        \
  68        .long (handler) - . ;                                   \
  69        .popsection
  70
  71# define _ASM_EXTABLE(from, to)                                 \
  72        _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
  73
  74# define _ASM_EXTABLE_FAULT(from, to)                           \
  75        _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
  76
  77# define _ASM_EXTABLE_EX(from, to)                              \
  78        _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext)
  79
  80# define _ASM_EXTABLE_REFCOUNT(from, to)                        \
  81        _ASM_EXTABLE_HANDLE(from, to, ex_handler_refcount)
  82
  83# define _ASM_NOKPROBE(entry)                                   \
  84        .pushsection "_kprobe_blacklist","aw" ;                 \
  85        _ASM_ALIGN ;                                            \
  86        _ASM_PTR (entry);                                       \
  87        .popsection
  88
  89.macro ALIGN_DESTINATION
  90        /* check for bad alignment of destination */
  91        movl %edi,%ecx
  92        andl $7,%ecx
  93        jz 102f                         /* already aligned */
  94        subl $8,%ecx
  95        negl %ecx
  96        subl %ecx,%edx
  97100:    movb (%rsi),%al
  98101:    movb %al,(%rdi)
  99        incq %rsi
 100        incq %rdi
 101        decl %ecx
 102        jnz 100b
 103102:
 104        .section .fixup,"ax"
 105103:    addl %ecx,%edx                  /* ecx is zerorest also */
 106        jmp copy_user_handle_tail
 107        .previous
 108
 109        _ASM_EXTABLE(100b,103b)
 110        _ASM_EXTABLE(101b,103b)
 111        .endm
 112
 113#else
 114# define _EXPAND_EXTABLE_HANDLE(x) #x
 115# define _ASM_EXTABLE_HANDLE(from, to, handler)                 \
 116        " .pushsection \"__ex_table\",\"a\"\n"                  \
 117        " .balign 4\n"                                          \
 118        " .long (" #from ") - .\n"                              \
 119        " .long (" #to ") - .\n"                                \
 120        " .long (" _EXPAND_EXTABLE_HANDLE(handler) ") - .\n"    \
 121        " .popsection\n"
 122
 123# define _ASM_EXTABLE(from, to)                                 \
 124        _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
 125
 126# define _ASM_EXTABLE_FAULT(from, to)                           \
 127        _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
 128
 129# define _ASM_EXTABLE_EX(from, to)                              \
 130        _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext)
 131
 132# define _ASM_EXTABLE_REFCOUNT(from, to)                        \
 133        _ASM_EXTABLE_HANDLE(from, to, ex_handler_refcount)
 134
 135/* For C file, we already have NOKPROBE_SYMBOL macro */
 136#endif
 137
 138#ifndef __ASSEMBLY__
 139#ifndef __BPF__
 140/*
 141 * This output constraint should be used for any inline asm which has a "call"
 142 * instruction.  Otherwise the asm may be inserted before the frame pointer
 143 * gets set up by the containing function.  If you forget to do this, objtool
 144 * may print a "call without frame pointer save/setup" warning.
 145 */
 146register unsigned long current_stack_pointer asm(_ASM_SP);
 147#define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
 148#endif
 149#endif
 150
 151#endif /* _ASM_X86_ASM_H */
 152