Subversion Repositories Kolibri OS

Rev

Rev 6934 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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. /* Exception table entry */
  46. #ifdef __ASSEMBLY__
  47. # define _ASM_EXTABLE_HANDLE(from, to, handler)                 \
  48.         .pushsection "__ex_table","a" ;                         \
  49.         .balign 4 ;                                             \
  50.         .long (from) - . ;                                      \
  51.         .long (to) - . ;                                        \
  52.         .long (handler) - . ;                                   \
  53.         .popsection
  54.  
  55. # define _ASM_EXTABLE(from, to)                                 \
  56.         _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
  57.  
  58. # define _ASM_EXTABLE_FAULT(from, to)                           \
  59.         _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
  60.  
  61. # define _ASM_EXTABLE_EX(from, to)                              \
  62.         _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext)
  63.  
  64. # define _ASM_NOKPROBE(entry)                                   \
  65.         .pushsection "_kprobe_blacklist","aw" ;                 \
  66.         _ASM_ALIGN ;                                            \
  67.         _ASM_PTR (entry);                                       \
  68.         .popsection
  69.  
  70. .macro ALIGN_DESTINATION
  71.         /* check for bad alignment of destination */
  72.         movl %edi,%ecx
  73.         andl $7,%ecx
  74.         jz 102f                         /* already aligned */
  75.         subl $8,%ecx
  76.         negl %ecx
  77.         subl %ecx,%edx
  78. 100:    movb (%rsi),%al
  79. 101:    movb %al,(%rdi)
  80.         incq %rsi
  81.         incq %rdi
  82.         decl %ecx
  83.         jnz 100b
  84. 102:
  85.         .section .fixup,"ax"
  86. 103:    addl %ecx,%edx                  /* ecx is zerorest also */
  87.         jmp copy_user_handle_tail
  88.         .previous
  89.  
  90.         _ASM_EXTABLE(100b,103b)
  91.         _ASM_EXTABLE(101b,103b)
  92.         .endm
  93.  
  94. #else
  95. # define _EXPAND_EXTABLE_HANDLE(x) #x
  96. # define _ASM_EXTABLE_HANDLE(from, to, handler)                 \
  97.         " .pushsection \"__ex_table\",\"a\"\n"                  \
  98.         " .balign 4\n"                                          \
  99.         " .long (" #from ") - .\n"                              \
  100.         " .long (" #to ") - .\n"                                \
  101.         " .long (" _EXPAND_EXTABLE_HANDLE(handler) ") - .\n"    \
  102.         " .popsection\n"
  103.  
  104. # define _ASM_EXTABLE(from, to)                                 \
  105.         _ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
  106.  
  107. # define _ASM_EXTABLE_FAULT(from, to)                           \
  108.         _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
  109.  
  110. # define _ASM_EXTABLE_EX(from, to)                              \
  111.         _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext)
  112.  
  113. /* For C file, we already have NOKPROBE_SYMBOL macro */
  114. #endif
  115.  
  116. #endif /* _ASM_X86_ASM_H */
  117.