linux/arch/x86/include/asm/asm.h
<<
>>
Prefs
   1#ifndef _ASM_X86_ASM_H
   2#define _ASM_X86_ASM_H
   3
   4#ifdef __ASSEMBLY__
   5# define __ASM_FORM(x)  x
   6# define __ASM_FORM_RAW(x)     x
   7# define __ASM_FORM_COMMA(x) x,
   8#else
   9# define __ASM_FORM(x)  " " #x " "
  10# define __ASM_FORM_RAW(x)     #x
  11# define __ASM_FORM_COMMA(x) " " #x ","
  12#endif
  13
  14#ifdef CONFIG_X86_32
  15# define __ASM_SEL(a,b) __ASM_FORM(a)
  16# define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
  17#else
  18# define __ASM_SEL(a,b) __ASM_FORM(b)
  19# define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(b)
  20#endif
  21
  22#define __ASM_SIZE(inst, ...)   __ASM_SEL(inst##l##__VA_ARGS__, \
  23                                          inst##q##__VA_ARGS__)
  24#define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
  25
  26#define _ASM_PTR        __ASM_SEL(.long, .quad)
  27#define _ASM_ALIGN      __ASM_SEL(.balign 4, .balign 8)
  28
  29#define _ASM_MOV        __ASM_SIZE(mov)
  30#define _ASM_INC        __ASM_SIZE(inc)
  31#define _ASM_DEC        __ASM_SIZE(dec)
  32#define _ASM_ADD        __ASM_SIZE(add)
  33#define _ASM_SUB        __ASM_SIZE(sub)
  34#define _ASM_XADD       __ASM_SIZE(xadd)
  35
  36#define _ASM_AX         __ASM_REG(ax)
  37#define _ASM_BX         __ASM_REG(bx)
  38#define _ASM_CX         __ASM_REG(cx)
  39#define _ASM_DX         __ASM_REG(dx)
  40#define _ASM_SP         __ASM_REG(sp)
  41#define _ASM_BP         __ASM_REG(bp)
  42#define _ASM_SI         __ASM_REG(si)
  43#define _ASM_DI         __ASM_REG(di)
  44
  45/*
  46 * Macros to generate condition code outputs from inline assembly,
  47 * The output operand must be type "bool".
  48 */
  49#ifdef __GCC_ASM_FLAG_OUTPUTS__
  50# define CC_SET(c) "\n\t/* output condition code " #c "*/\n"
  51# define CC_OUT(c) "=@cc" #c
  52#else
  53# define CC_SET(c) "\n\tset" #c " %[_cc_" #c "]\n"
  54# define CC_OUT(c) [_cc_ ## c] "=qm"
  55#endif
  56
  57/* Exception table entry */
  58#ifdef __ASSEMBLY__
  59# define _ASM_EXTABLE_HANDLE(from, to, handler)                 \
  60        .pushsection "__ex_table","a" ;                         \
  61        .balign 4 ;                                             \
  62        .long (from) - . ;                                      \
  63        .long (to) - . ;                                        \
  64        .long (handler) - . ;                                   \
  65        .popsection
  66
  67# define _ASM_EXTABLE(from, to)                                 \
  68        _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
  69
  70# define _ASM_EXTABLE_FAULT(from, to)                           \
  71        _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
  72
  73# define _ASM_EXTABLE_EX(from, to)                              \
  74        _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext)
  75
  76# define _ASM_NOKPROBE(entry)                                   \
  77        .pushsection "_kprobe_blacklist","aw" ;                 \
  78        _ASM_ALIGN ;                                            \
  79        _ASM_PTR (entry);                                       \
  80        .popsection
  81
  82.macro ALIGN_DESTINATION
  83        /* check for bad alignment of destination */
  84        movl %edi,%ecx
  85        andl $7,%ecx
  86        jz 102f                         /* already aligned */
  87        subl $8,%ecx
  88        negl %ecx
  89        subl %ecx,%edx
  90100:    movb (%rsi),%al
  91101:    movb %al,(%rdi)
  92        incq %rsi
  93        incq %rdi
  94        decl %ecx
  95        jnz 100b
  96102:
  97        .section .fixup,"ax"
  98103:    addl %ecx,%edx                  /* ecx is zerorest also */
  99        jmp copy_user_handle_tail
 100        .previous
 101
 102        _ASM_EXTABLE(100b,103b)
 103        _ASM_EXTABLE(101b,103b)
 104        .endm
 105
 106#else
 107# define _EXPAND_EXTABLE_HANDLE(x) #x
 108# define _ASM_EXTABLE_HANDLE(from, to, handler)                 \
 109        " .pushsection \"__ex_table\",\"a\"\n"                  \
 110        " .balign 4\n"                                          \
 111        " .long (" #from ") - .\n"                              \
 112        " .long (" #to ") - .\n"                                \
 113        " .long (" _EXPAND_EXTABLE_HANDLE(handler) ") - .\n"    \
 114        " .popsection\n"
 115
 116# define _ASM_EXTABLE(from, to)                                 \
 117        _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
 118
 119# define _ASM_EXTABLE_FAULT(from, to)                           \
 120        _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
 121
 122# define _ASM_EXTABLE_EX(from, to)                              \
 123        _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext)
 124
 125/* For C file, we already have NOKPROBE_SYMBOL macro */
 126#endif
 127
 128#endif /* _ASM_X86_ASM_H */
 129