Blame view

kernel/linux-rt-4.4.41/arch/x86/include/asm/asm.h 2.56 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  #ifndef _ASM_X86_ASM_H
  #define _ASM_X86_ASM_H
  
  #ifdef __ASSEMBLY__
  # define __ASM_FORM(x)	x
  # define __ASM_FORM_RAW(x)     x
  # define __ASM_FORM_COMMA(x) x,
  #else
  # define __ASM_FORM(x)	" " #x " "
  # define __ASM_FORM_RAW(x)     #x
  # define __ASM_FORM_COMMA(x) " " #x ","
  #endif
  
  #ifdef CONFIG_X86_32
  # define __ASM_SEL(a,b) __ASM_FORM(a)
  # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
  #else
  # define __ASM_SEL(a,b) __ASM_FORM(b)
  # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(b)
  #endif
  
  #define __ASM_SIZE(inst, ...)	__ASM_SEL(inst##l##__VA_ARGS__, \
  					  inst##q##__VA_ARGS__)
  #define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
  
  #define _ASM_PTR	__ASM_SEL(.long, .quad)
  #define _ASM_ALIGN	__ASM_SEL(.balign 4, .balign 8)
  
  #define _ASM_MOV	__ASM_SIZE(mov)
  #define _ASM_INC	__ASM_SIZE(inc)
  #define _ASM_DEC	__ASM_SIZE(dec)
  #define _ASM_ADD	__ASM_SIZE(add)
  #define _ASM_SUB	__ASM_SIZE(sub)
  #define _ASM_XADD	__ASM_SIZE(xadd)
  
  #define _ASM_AX		__ASM_REG(ax)
  #define _ASM_BX		__ASM_REG(bx)
  #define _ASM_CX		__ASM_REG(cx)
  #define _ASM_DX		__ASM_REG(dx)
  #define _ASM_SP		__ASM_REG(sp)
  #define _ASM_BP		__ASM_REG(bp)
  #define _ASM_SI		__ASM_REG(si)
  #define _ASM_DI		__ASM_REG(di)
  
  /* Exception table entry */
  #ifdef __ASSEMBLY__
  # define _ASM_EXTABLE(from,to)					\
  	.pushsection "__ex_table","a" ;				\
  	.balign 8 ;						\
  	.long (from) - . ;					\
  	.long (to) - . ;					\
  	.popsection
  
  # define _ASM_EXTABLE_EX(from,to)				\
  	.pushsection "__ex_table","a" ;				\
  	.balign 8 ;						\
  	.long (from) - . ;					\
  	.long (to) - . + 0x7ffffff0 ;				\
  	.popsection
  
  # define _ASM_NOKPROBE(entry)					\
  	.pushsection "_kprobe_blacklist","aw" ;			\
  	_ASM_ALIGN ;						\
  	_ASM_PTR (entry);					\
  	.popsection
  
  .macro ALIGN_DESTINATION
  	/* check for bad alignment of destination */
  	movl %edi,%ecx
  	andl $7,%ecx
  	jz 102f				/* already aligned */
  	subl $8,%ecx
  	negl %ecx
  	subl %ecx,%edx
  100:	movb (%rsi),%al
  101:	movb %al,(%rdi)
  	incq %rsi
  	incq %rdi
  	decl %ecx
  	jnz 100b
  102:
  	.section .fixup,"ax"
  103:	addl %ecx,%edx			/* ecx is zerorest also */
  	jmp copy_user_handle_tail
  	.previous
  
  	_ASM_EXTABLE(100b,103b)
  	_ASM_EXTABLE(101b,103b)
  	.endm
  
  #else
  # define _ASM_EXTABLE(from,to)					\
  	" .pushsection \"__ex_table\",\"a\"
  "			\
  	" .balign 8
  "						\
  	" .long (" #from ") - .
  "				\
  	" .long (" #to ") - .
  "				\
  	" .popsection
  "
  
  # define _ASM_EXTABLE_EX(from,to)				\
  	" .pushsection \"__ex_table\",\"a\"
  "			\
  	" .balign 8
  "						\
  	" .long (" #from ") - .
  "				\
  	" .long (" #to ") - . + 0x7ffffff0
  "			\
  	" .popsection
  "
  /* For C file, we already have NOKPROBE_SYMBOL macro */
  #endif
  
  #endif /* _ASM_X86_ASM_H */