aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/lib
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /arch/x86/lib
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'arch/x86/lib')
-rw-r--r--arch/x86/lib/Makefile1
-rw-r--r--arch/x86/lib/atomic64_32.c59
-rw-r--r--arch/x86/lib/atomic64_386_32.S6
-rw-r--r--arch/x86/lib/atomic64_cx8_32.S29
-rw-r--r--arch/x86/lib/checksum_32.S9
-rw-r--r--arch/x86/lib/copy_page_64.S128
-rw-r--r--arch/x86/lib/copy_user_64.S70
-rw-r--r--arch/x86/lib/copy_user_nocache_64.S53
-rw-r--r--arch/x86/lib/csum-copy_64.S16
-rw-r--r--arch/x86/lib/csum-wrappers_64.c2
-rw-r--r--arch/x86/lib/delay.c6
-rw-r--r--arch/x86/lib/getuser.S19
-rw-r--r--arch/x86/lib/inat.c45
-rw-r--r--arch/x86/lib/insn.c114
-rw-r--r--arch/x86/lib/memcpy_64.S44
-rw-r--r--arch/x86/lib/memset_64.S33
-rw-r--r--arch/x86/lib/msr-reg-export.c4
-rw-r--r--arch/x86/lib/msr-reg.S10
-rw-r--r--arch/x86/lib/putuser.S20
-rw-r--r--arch/x86/lib/string_32.c8
-rw-r--r--arch/x86/lib/usercopy.c6
-rw-r--r--arch/x86/lib/usercopy_32.c428
-rw-r--r--arch/x86/lib/usercopy_64.c100
-rw-r--r--arch/x86/lib/x86-opcode-map.txt612
24 files changed, 1026 insertions, 796 deletions
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index 96b2c6697c9..b00f6785da7 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -32,6 +32,7 @@ ifeq ($(CONFIG_X86_32),y)
32 lib-y += checksum_32.o 32 lib-y += checksum_32.o
33 lib-y += strstr_32.o 33 lib-y += strstr_32.o
34 lib-y += string_32.o 34 lib-y += string_32.o
35 lib-y += cmpxchg.o
35ifneq ($(CONFIG_X86_CMPXCHG64),y) 36ifneq ($(CONFIG_X86_CMPXCHG64),y)
36 lib-y += cmpxchg8b_emu.o atomic64_386_32.o 37 lib-y += cmpxchg8b_emu.o atomic64_386_32.o
37endif 38endif
diff --git a/arch/x86/lib/atomic64_32.c b/arch/x86/lib/atomic64_32.c
index a0b4a350daa..042f6826bf5 100644
--- a/arch/x86/lib/atomic64_32.c
+++ b/arch/x86/lib/atomic64_32.c
@@ -1,4 +1,59 @@
1#define ATOMIC64_EXPORT EXPORT_SYMBOL 1#include <linux/compiler.h>
2#include <linux/module.h>
3#include <linux/types.h>
2 4
3#include <linux/export.h> 5#include <asm/processor.h>
6#include <asm/cmpxchg.h>
4#include <linux/atomic.h> 7#include <linux/atomic.h>
8
9long long atomic64_read_cx8(long long, const atomic64_t *v);
10EXPORT_SYMBOL(atomic64_read_cx8);
11long long atomic64_set_cx8(long long, const atomic64_t *v);
12EXPORT_SYMBOL(atomic64_set_cx8);
13long long atomic64_xchg_cx8(long long, unsigned high);
14EXPORT_SYMBOL(atomic64_xchg_cx8);
15long long atomic64_add_return_cx8(long long a, atomic64_t *v);
16EXPORT_SYMBOL(atomic64_add_return_cx8);
17long long atomic64_sub_return_cx8(long long a, atomic64_t *v);
18EXPORT_SYMBOL(atomic64_sub_return_cx8);
19long long atomic64_inc_return_cx8(long long a, atomic64_t *v);
20EXPORT_SYMBOL(atomic64_inc_return_cx8);
21long long atomic64_dec_return_cx8(long long a, atomic64_t *v);
22EXPORT_SYMBOL(atomic64_dec_return_cx8);
23long long atomic64_dec_if_positive_cx8(atomic64_t *v);
24EXPORT_SYMBOL(atomic64_dec_if_positive_cx8);
25int atomic64_inc_not_zero_cx8(atomic64_t *v);
26EXPORT_SYMBOL(atomic64_inc_not_zero_cx8);
27int atomic64_add_unless_cx8(atomic64_t *v, long long a, long long u);
28EXPORT_SYMBOL(atomic64_add_unless_cx8);
29
30#ifndef CONFIG_X86_CMPXCHG64
31long long atomic64_read_386(long long, const atomic64_t *v);
32EXPORT_SYMBOL(atomic64_read_386);
33long long atomic64_set_386(long long, const atomic64_t *v);
34EXPORT_SYMBOL(atomic64_set_386);
35long long atomic64_xchg_386(long long, unsigned high);
36EXPORT_SYMBOL(atomic64_xchg_386);
37long long atomic64_add_return_386(long long a, atomic64_t *v);
38EXPORT_SYMBOL(atomic64_add_return_386);
39long long atomic64_sub_return_386(long long a, atomic64_t *v);
40EXPORT_SYMBOL(atomic64_sub_return_386);
41long long atomic64_inc_return_386(long long a, atomic64_t *v);
42EXPORT_SYMBOL(atomic64_inc_return_386);
43long long atomic64_dec_return_386(long long a, atomic64_t *v);
44EXPORT_SYMBOL(atomic64_dec_return_386);
45long long atomic64_add_386(long long a, atomic64_t *v);
46EXPORT_SYMBOL(atomic64_add_386);
47long long atomic64_sub_386(long long a, atomic64_t *v);
48EXPORT_SYMBOL(atomic64_sub_386);
49long long atomic64_inc_386(long long a, atomic64_t *v);
50EXPORT_SYMBOL(atomic64_inc_386);
51long long atomic64_dec_386(long long a, atomic64_t *v);
52EXPORT_SYMBOL(atomic64_dec_386);
53long long atomic64_dec_if_positive_386(atomic64_t *v);
54EXPORT_SYMBOL(atomic64_dec_if_positive_386);
55int atomic64_inc_not_zero_386(atomic64_t *v);
56EXPORT_SYMBOL(atomic64_inc_not_zero_386);
57int atomic64_add_unless_386(atomic64_t *v, long long a, long long u);
58EXPORT_SYMBOL(atomic64_add_unless_386);
59#endif
diff --git a/arch/x86/lib/atomic64_386_32.S b/arch/x86/lib/atomic64_386_32.S
index 00933d5e992..e8e7e0d06f4 100644
--- a/arch/x86/lib/atomic64_386_32.S
+++ b/arch/x86/lib/atomic64_386_32.S
@@ -137,13 +137,13 @@ BEGIN(dec_return)
137RET_ENDP 137RET_ENDP
138#undef v 138#undef v
139 139
140#define v %esi 140#define v %ecx
141BEGIN(add_unless) 141BEGIN(add_unless)
142 addl %eax, %ecx 142 addl %eax, %esi
143 adcl %edx, %edi 143 adcl %edx, %edi
144 addl (v), %eax 144 addl (v), %eax
145 adcl 4(v), %edx 145 adcl 4(v), %edx
146 cmpl %eax, %ecx 146 cmpl %eax, %esi
147 je 3f 147 je 3f
1481: 1481:
149 movl %eax, (v) 149 movl %eax, (v)
diff --git a/arch/x86/lib/atomic64_cx8_32.S b/arch/x86/lib/atomic64_cx8_32.S
index f5cc9eb1d51..391a083674b 100644
--- a/arch/x86/lib/atomic64_cx8_32.S
+++ b/arch/x86/lib/atomic64_cx8_32.S
@@ -55,6 +55,8 @@ ENDPROC(atomic64_set_cx8)
55ENTRY(atomic64_xchg_cx8) 55ENTRY(atomic64_xchg_cx8)
56 CFI_STARTPROC 56 CFI_STARTPROC
57 57
58 movl %ebx, %eax
59 movl %ecx, %edx
581: 601:
59 LOCK_PREFIX 61 LOCK_PREFIX
60 cmpxchg8b (%esi) 62 cmpxchg8b (%esi)
@@ -76,7 +78,7 @@ ENTRY(atomic64_\func\()_return_cx8)
76 movl %edx, %edi 78 movl %edx, %edi
77 movl %ecx, %ebp 79 movl %ecx, %ebp
78 80
79 read64 %ecx 81 read64 %ebp
801: 821:
81 movl %eax, %ebx 83 movl %eax, %ebx
82 movl %edx, %ecx 84 movl %edx, %ecx
@@ -157,22 +159,23 @@ ENTRY(atomic64_add_unless_cx8)
157 SAVE ebx 159 SAVE ebx
158/* these just push these two parameters on the stack */ 160/* these just push these two parameters on the stack */
159 SAVE edi 161 SAVE edi
160 SAVE ecx 162 SAVE esi
161 163
162 movl %eax, %ebp 164 movl %ecx, %ebp
165 movl %eax, %esi
163 movl %edx, %edi 166 movl %edx, %edi
164 167
165 read64 %esi 168 read64 %ebp
1661: 1691:
167 cmpl %eax, 0(%esp) 170 cmpl %eax, 0(%esp)
168 je 4f 171 je 4f
1692: 1722:
170 movl %eax, %ebx 173 movl %eax, %ebx
171 movl %edx, %ecx 174 movl %edx, %ecx
172 addl %ebp, %ebx 175 addl %esi, %ebx
173 adcl %edi, %ecx 176 adcl %edi, %ecx
174 LOCK_PREFIX 177 LOCK_PREFIX
175 cmpxchg8b (%esi) 178 cmpxchg8b (%ebp)
176 jne 1b 179 jne 1b
177 180
178 movl $1, %eax 181 movl $1, %eax
@@ -196,13 +199,13 @@ ENTRY(atomic64_inc_not_zero_cx8)
196 199
197 read64 %esi 200 read64 %esi
1981: 2011:
199 movl %eax, %ecx 202 testl %eax, %eax
200 orl %edx, %ecx 203 je 4f
201 jz 3f 2042:
202 movl %eax, %ebx 205 movl %eax, %ebx
203 xorl %ecx, %ecx 206 movl %edx, %ecx
204 addl $1, %ebx 207 addl $1, %ebx
205 adcl %edx, %ecx 208 adcl $0, %ecx
206 LOCK_PREFIX 209 LOCK_PREFIX
207 cmpxchg8b (%esi) 210 cmpxchg8b (%esi)
208 jne 1b 211 jne 1b
@@ -211,5 +214,9 @@ ENTRY(atomic64_inc_not_zero_cx8)
2113: 2143:
212 RESTORE ebx 215 RESTORE ebx
213 ret 216 ret
2174:
218 testl %edx, %edx
219 jne 2b
220 jmp 3b
214 CFI_ENDPROC 221 CFI_ENDPROC
215ENDPROC(atomic64_inc_not_zero_cx8) 222ENDPROC(atomic64_inc_not_zero_cx8)
diff --git a/arch/x86/lib/checksum_32.S b/arch/x86/lib/checksum_32.S
index 2af5df3ade7..78d16a554db 100644
--- a/arch/x86/lib/checksum_32.S
+++ b/arch/x86/lib/checksum_32.S
@@ -28,7 +28,6 @@
28#include <linux/linkage.h> 28#include <linux/linkage.h>
29#include <asm/dwarf2.h> 29#include <asm/dwarf2.h>
30#include <asm/errno.h> 30#include <asm/errno.h>
31#include <asm/asm.h>
32 31
33/* 32/*
34 * computes a partial checksum, e.g. for TCP/UDP fragments 33 * computes a partial checksum, e.g. for TCP/UDP fragments
@@ -283,11 +282,15 @@ unsigned int csum_partial_copy_generic (const char *src, char *dst,
283 282
284#define SRC(y...) \ 283#define SRC(y...) \
285 9999: y; \ 284 9999: y; \
286 _ASM_EXTABLE(9999b, 6001f) 285 .section __ex_table, "a"; \
286 .long 9999b, 6001f ; \
287 .previous
287 288
288#define DST(y...) \ 289#define DST(y...) \
289 9999: y; \ 290 9999: y; \
290 _ASM_EXTABLE(9999b, 6002f) 291 .section __ex_table, "a"; \
292 .long 9999b, 6002f ; \
293 .previous
291 294
292#ifndef CONFIG_X86_USE_PPRO_CHECKSUM 295#ifndef CONFIG_X86_USE_PPRO_CHECKSUM
293 296
diff --git a/arch/x86/lib/copy_page_64.S b/arch/x86/lib/copy_page_64.S
index 176cca67212..01c805ba535 100644
--- a/arch/x86/lib/copy_page_64.S
+++ b/arch/x86/lib/copy_page_64.S
@@ -5,90 +5,96 @@
5#include <asm/alternative-asm.h> 5#include <asm/alternative-asm.h>
6 6
7 ALIGN 7 ALIGN
8copy_page_rep: 8copy_page_c:
9 CFI_STARTPROC 9 CFI_STARTPROC
10 movl $4096/8, %ecx 10 movl $4096/8,%ecx
11 rep movsq 11 rep movsq
12 ret 12 ret
13 CFI_ENDPROC 13 CFI_ENDPROC
14ENDPROC(copy_page_rep) 14ENDPROC(copy_page_c)
15 15
16/* 16/* Don't use streaming store because it's better when the target
17 * Don't use streaming copy unless the CPU indicates X86_FEATURE_REP_GOOD. 17 ends up in cache. */
18 * Could vary the prefetch distance based on SMP/UP. 18
19*/ 19/* Could vary the prefetch distance based on SMP/UP */
20 20
21ENTRY(copy_page) 21ENTRY(copy_page)
22 CFI_STARTPROC 22 CFI_STARTPROC
23 subq $2*8, %rsp 23 subq $3*8,%rsp
24 CFI_ADJUST_CFA_OFFSET 2*8 24 CFI_ADJUST_CFA_OFFSET 3*8
25 movq %rbx, (%rsp) 25 movq %rbx,(%rsp)
26 CFI_REL_OFFSET rbx, 0 26 CFI_REL_OFFSET rbx, 0
27 movq %r12, 1*8(%rsp) 27 movq %r12,1*8(%rsp)
28 CFI_REL_OFFSET r12, 1*8 28 CFI_REL_OFFSET r12, 1*8
29 movq %r13,2*8(%rsp)
30 CFI_REL_OFFSET r13, 2*8
29 31
30 movl $(4096/64)-5, %ecx 32 movl $(4096/64)-5,%ecx
31 .p2align 4 33 .p2align 4
32.Loop64: 34.Loop64:
33 dec %rcx 35 dec %rcx
34 movq 0x8*0(%rsi), %rax 36
35 movq 0x8*1(%rsi), %rbx 37 movq (%rsi), %rax
36 movq 0x8*2(%rsi), %rdx 38 movq 8 (%rsi), %rbx
37 movq 0x8*3(%rsi), %r8 39 movq 16 (%rsi), %rdx
38 movq 0x8*4(%rsi), %r9 40 movq 24 (%rsi), %r8
39 movq 0x8*5(%rsi), %r10 41 movq 32 (%rsi), %r9
40 movq 0x8*6(%rsi), %r11 42 movq 40 (%rsi), %r10
41 movq 0x8*7(%rsi), %r12 43 movq 48 (%rsi), %r11
44 movq 56 (%rsi), %r12
42 45
43 prefetcht0 5*64(%rsi) 46 prefetcht0 5*64(%rsi)
44 47
45 movq %rax, 0x8*0(%rdi) 48 movq %rax, (%rdi)
46 movq %rbx, 0x8*1(%rdi) 49 movq %rbx, 8 (%rdi)
47 movq %rdx, 0x8*2(%rdi) 50 movq %rdx, 16 (%rdi)
48 movq %r8, 0x8*3(%rdi) 51 movq %r8, 24 (%rdi)
49 movq %r9, 0x8*4(%rdi) 52 movq %r9, 32 (%rdi)
50 movq %r10, 0x8*5(%rdi) 53 movq %r10, 40 (%rdi)
51 movq %r11, 0x8*6(%rdi) 54 movq %r11, 48 (%rdi)
52 movq %r12, 0x8*7(%rdi) 55 movq %r12, 56 (%rdi)
53 56
54 leaq 64 (%rsi), %rsi 57 leaq 64 (%rsi), %rsi
55 leaq 64 (%rdi), %rdi 58 leaq 64 (%rdi), %rdi
56 59
57 jnz .Loop64 60 jnz .Loop64
58 61
59 movl $5, %ecx 62 movl $5,%ecx
60 .p2align 4 63 .p2align 4
61.Loop2: 64.Loop2:
62 decl %ecx 65 decl %ecx
63 66
64 movq 0x8*0(%rsi), %rax 67 movq (%rsi), %rax
65 movq 0x8*1(%rsi), %rbx 68 movq 8 (%rsi), %rbx
66 movq 0x8*2(%rsi), %rdx 69 movq 16 (%rsi), %rdx
67 movq 0x8*3(%rsi), %r8 70 movq 24 (%rsi), %r8
68 movq 0x8*4(%rsi), %r9 71 movq 32 (%rsi), %r9
69 movq 0x8*5(%rsi), %r10 72 movq 40 (%rsi), %r10
70 movq 0x8*6(%rsi), %r11 73 movq 48 (%rsi), %r11
71 movq 0x8*7(%rsi), %r12 74 movq 56 (%rsi), %r12
72 75
73 movq %rax, 0x8*0(%rdi) 76 movq %rax, (%rdi)
74 movq %rbx, 0x8*1(%rdi) 77 movq %rbx, 8 (%rdi)
75 movq %rdx, 0x8*2(%rdi) 78 movq %rdx, 16 (%rdi)
76 movq %r8, 0x8*3(%rdi) 79 movq %r8, 24 (%rdi)
77 movq %r9, 0x8*4(%rdi) 80 movq %r9, 32 (%rdi)
78 movq %r10, 0x8*5(%rdi) 81 movq %r10, 40 (%rdi)
79 movq %r11, 0x8*6(%rdi) 82 movq %r11, 48 (%rdi)
80 movq %r12, 0x8*7(%rdi) 83 movq %r12, 56 (%rdi)
81 84
82 leaq 64(%rdi), %rdi 85 leaq 64(%rdi),%rdi
83 leaq 64(%rsi), %rsi 86 leaq 64(%rsi),%rsi
87
84 jnz .Loop2 88 jnz .Loop2
85 89
86 movq (%rsp), %rbx 90 movq (%rsp),%rbx
87 CFI_RESTORE rbx 91 CFI_RESTORE rbx
88 movq 1*8(%rsp), %r12 92 movq 1*8(%rsp),%r12
89 CFI_RESTORE r12 93 CFI_RESTORE r12
90 addq $2*8, %rsp 94 movq 2*8(%rsp),%r13
91 CFI_ADJUST_CFA_OFFSET -2*8 95 CFI_RESTORE r13
96 addq $3*8,%rsp
97 CFI_ADJUST_CFA_OFFSET -3*8
92 ret 98 ret
93.Lcopy_page_end: 99.Lcopy_page_end:
94 CFI_ENDPROC 100 CFI_ENDPROC
@@ -101,7 +107,7 @@ ENDPROC(copy_page)
101 107
102 .section .altinstr_replacement,"ax" 108 .section .altinstr_replacement,"ax"
1031: .byte 0xeb /* jmp <disp8> */ 1091: .byte 0xeb /* jmp <disp8> */
104 .byte (copy_page_rep - copy_page) - (2f - 1b) /* offset */ 110 .byte (copy_page_c - copy_page) - (2f - 1b) /* offset */
1052: 1112:
106 .previous 112 .previous
107 .section .altinstructions,"a" 113 .section .altinstructions,"a"
diff --git a/arch/x86/lib/copy_user_64.S b/arch/x86/lib/copy_user_64.S
index a30ca15be21..024840266ba 100644
--- a/arch/x86/lib/copy_user_64.S
+++ b/arch/x86/lib/copy_user_64.S
@@ -16,8 +16,6 @@
16#include <asm/thread_info.h> 16#include <asm/thread_info.h>
17#include <asm/cpufeature.h> 17#include <asm/cpufeature.h>
18#include <asm/alternative-asm.h> 18#include <asm/alternative-asm.h>
19#include <asm/asm.h>
20#include <asm/smap.h>
21 19
22/* 20/*
23 * By placing feature2 after feature1 in altinstructions section, we logically 21 * By placing feature2 after feature1 in altinstructions section, we logically
@@ -65,8 +63,11 @@
65 jmp copy_user_handle_tail 63 jmp copy_user_handle_tail
66 .previous 64 .previous
67 65
68 _ASM_EXTABLE(100b,103b) 66 .section __ex_table,"a"
69 _ASM_EXTABLE(101b,103b) 67 .align 8
68 .quad 100b,103b
69 .quad 101b,103b
70 .previous
70#endif 71#endif
71 .endm 72 .endm
72 73
@@ -131,7 +132,6 @@ ENDPROC(bad_from_user)
131 */ 132 */
132ENTRY(copy_user_generic_unrolled) 133ENTRY(copy_user_generic_unrolled)
133 CFI_STARTPROC 134 CFI_STARTPROC
134 ASM_STAC
135 cmpl $8,%edx 135 cmpl $8,%edx
136 jb 20f /* less then 8 bytes, go to byte copy loop */ 136 jb 20f /* less then 8 bytes, go to byte copy loop */
137 ALIGN_DESTINATION 137 ALIGN_DESTINATION
@@ -179,7 +179,6 @@ ENTRY(copy_user_generic_unrolled)
179 decl %ecx 179 decl %ecx
180 jnz 21b 180 jnz 21b
18123: xor %eax,%eax 18123: xor %eax,%eax
182 ASM_CLAC
183 ret 182 ret
184 183
185 .section .fixup,"ax" 184 .section .fixup,"ax"
@@ -192,26 +191,29 @@ ENTRY(copy_user_generic_unrolled)
19260: jmp copy_user_handle_tail /* ecx is zerorest also */ 19160: jmp copy_user_handle_tail /* ecx is zerorest also */
193 .previous 192 .previous
194 193
195 _ASM_EXTABLE(1b,30b) 194 .section __ex_table,"a"
196 _ASM_EXTABLE(2b,30b) 195 .align 8
197 _ASM_EXTABLE(3b,30b) 196 .quad 1b,30b
198 _ASM_EXTABLE(4b,30b) 197 .quad 2b,30b
199 _ASM_EXTABLE(5b,30b) 198 .quad 3b,30b
200 _ASM_EXTABLE(6b,30b) 199 .quad 4b,30b
201 _ASM_EXTABLE(7b,30b) 200 .quad 5b,30b
202 _ASM_EXTABLE(8b,30b) 201 .quad 6b,30b
203 _ASM_EXTABLE(9b,30b) 202 .quad 7b,30b
204 _ASM_EXTABLE(10b,30b) 203 .quad 8b,30b
205 _ASM_EXTABLE(11b,30b) 204 .quad 9b,30b
206 _ASM_EXTABLE(12b,30b) 205 .quad 10b,30b
207 _ASM_EXTABLE(13b,30b) 206 .quad 11b,30b
208 _ASM_EXTABLE(14b,30b) 207 .quad 12b,30b
209 _ASM_EXTABLE(15b,30b) 208 .quad 13b,30b
210 _ASM_EXTABLE(16b,30b) 209 .quad 14b,30b
211 _ASM_EXTABLE(18b,40b) 210 .quad 15b,30b
212 _ASM_EXTABLE(19b,40b) 211 .quad 16b,30b
213 _ASM_EXTABLE(21b,50b) 212 .quad 18b,40b
214 _ASM_EXTABLE(22b,50b) 213 .quad 19b,40b
214 .quad 21b,50b
215 .quad 22b,50b
216 .previous
215 CFI_ENDPROC 217 CFI_ENDPROC
216ENDPROC(copy_user_generic_unrolled) 218ENDPROC(copy_user_generic_unrolled)
217 219
@@ -235,7 +237,6 @@ ENDPROC(copy_user_generic_unrolled)
235 */ 237 */
236ENTRY(copy_user_generic_string) 238ENTRY(copy_user_generic_string)
237 CFI_STARTPROC 239 CFI_STARTPROC
238 ASM_STAC
239 andl %edx,%edx 240 andl %edx,%edx
240 jz 4f 241 jz 4f
241 cmpl $8,%edx 242 cmpl $8,%edx
@@ -250,7 +251,6 @@ ENTRY(copy_user_generic_string)
2503: rep 2513: rep
251 movsb 252 movsb
2524: xorl %eax,%eax 2534: xorl %eax,%eax
253 ASM_CLAC
254 ret 254 ret
255 255
256 .section .fixup,"ax" 256 .section .fixup,"ax"
@@ -259,8 +259,11 @@ ENTRY(copy_user_generic_string)
259 jmp copy_user_handle_tail 259 jmp copy_user_handle_tail
260 .previous 260 .previous
261 261
262 _ASM_EXTABLE(1b,11b) 262 .section __ex_table,"a"
263 _ASM_EXTABLE(3b,12b) 263 .align 8
264 .quad 1b,11b
265 .quad 3b,12b
266 .previous
264 CFI_ENDPROC 267 CFI_ENDPROC
265ENDPROC(copy_user_generic_string) 268ENDPROC(copy_user_generic_string)
266 269
@@ -278,14 +281,12 @@ ENDPROC(copy_user_generic_string)
278 */ 281 */
279ENTRY(copy_user_enhanced_fast_string) 282ENTRY(copy_user_enhanced_fast_string)
280 CFI_STARTPROC 283 CFI_STARTPROC
281 ASM_STAC
282 andl %edx,%edx 284 andl %edx,%edx
283 jz 2f 285 jz 2f
284 movl %edx,%ecx 286 movl %edx,%ecx
2851: rep 2871: rep
286 movsb 288 movsb
2872: xorl %eax,%eax 2892: xorl %eax,%eax
288 ASM_CLAC
289 ret 290 ret
290 291
291 .section .fixup,"ax" 292 .section .fixup,"ax"
@@ -293,6 +294,9 @@ ENTRY(copy_user_enhanced_fast_string)
293 jmp copy_user_handle_tail 294 jmp copy_user_handle_tail
294 .previous 295 .previous
295 296
296 _ASM_EXTABLE(1b,12b) 297 .section __ex_table,"a"
298 .align 8
299 .quad 1b,12b
300 .previous
297 CFI_ENDPROC 301 CFI_ENDPROC
298ENDPROC(copy_user_enhanced_fast_string) 302ENDPROC(copy_user_enhanced_fast_string)
diff --git a/arch/x86/lib/copy_user_nocache_64.S b/arch/x86/lib/copy_user_nocache_64.S
index 6a4f43c2d9e..cb0c112386f 100644
--- a/arch/x86/lib/copy_user_nocache_64.S
+++ b/arch/x86/lib/copy_user_nocache_64.S
@@ -14,8 +14,6 @@
14#include <asm/current.h> 14#include <asm/current.h>
15#include <asm/asm-offsets.h> 15#include <asm/asm-offsets.h>
16#include <asm/thread_info.h> 16#include <asm/thread_info.h>
17#include <asm/asm.h>
18#include <asm/smap.h>
19 17
20 .macro ALIGN_DESTINATION 18 .macro ALIGN_DESTINATION
21#ifdef FIX_ALIGNMENT 19#ifdef FIX_ALIGNMENT
@@ -38,8 +36,11 @@
38 jmp copy_user_handle_tail 36 jmp copy_user_handle_tail
39 .previous 37 .previous
40 38
41 _ASM_EXTABLE(100b,103b) 39 .section __ex_table,"a"
42 _ASM_EXTABLE(101b,103b) 40 .align 8
41 .quad 100b,103b
42 .quad 101b,103b
43 .previous
43#endif 44#endif
44 .endm 45 .endm
45 46
@@ -49,7 +50,6 @@
49 */ 50 */
50ENTRY(__copy_user_nocache) 51ENTRY(__copy_user_nocache)
51 CFI_STARTPROC 52 CFI_STARTPROC
52 ASM_STAC
53 cmpl $8,%edx 53 cmpl $8,%edx
54 jb 20f /* less then 8 bytes, go to byte copy loop */ 54 jb 20f /* less then 8 bytes, go to byte copy loop */
55 ALIGN_DESTINATION 55 ALIGN_DESTINATION
@@ -97,7 +97,6 @@ ENTRY(__copy_user_nocache)
97 decl %ecx 97 decl %ecx
98 jnz 21b 98 jnz 21b
9923: xorl %eax,%eax 9923: xorl %eax,%eax
100 ASM_CLAC
101 sfence 100 sfence
102 ret 101 ret
103 102
@@ -112,25 +111,27 @@ ENTRY(__copy_user_nocache)
112 jmp copy_user_handle_tail 111 jmp copy_user_handle_tail
113 .previous 112 .previous
114 113
115 _ASM_EXTABLE(1b,30b) 114 .section __ex_table,"a"
116 _ASM_EXTABLE(2b,30b) 115 .quad 1b,30b
117 _ASM_EXTABLE(3b,30b) 116 .quad 2b,30b
118 _ASM_EXTABLE(4b,30b) 117 .quad 3b,30b
119 _ASM_EXTABLE(5b,30b) 118 .quad 4b,30b
120 _ASM_EXTABLE(6b,30b) 119 .quad 5b,30b
121 _ASM_EXTABLE(7b,30b) 120 .quad 6b,30b
122 _ASM_EXTABLE(8b,30b) 121 .quad 7b,30b
123 _ASM_EXTABLE(9b,30b) 122 .quad 8b,30b
124 _ASM_EXTABLE(10b,30b) 123 .quad 9b,30b
125 _ASM_EXTABLE(11b,30b) 124 .quad 10b,30b
126 _ASM_EXTABLE(12b,30b) 125 .quad 11b,30b
127 _ASM_EXTABLE(13b,30b) 126 .quad 12b,30b
128 _ASM_EXTABLE(14b,30b) 127 .quad 13b,30b
129 _ASM_EXTABLE(15b,30b) 128 .quad 14b,30b
130 _ASM_EXTABLE(16b,30b) 129 .quad 15b,30b
131 _ASM_EXTABLE(18b,40b) 130 .quad 16b,30b
132 _ASM_EXTABLE(19b,40b) 131 .quad 18b,40b
133 _ASM_EXTABLE(21b,50b) 132 .quad 19b,40b
134 _ASM_EXTABLE(22b,50b) 133 .quad 21b,50b
134 .quad 22b,50b
135 .previous
135 CFI_ENDPROC 136 CFI_ENDPROC
136ENDPROC(__copy_user_nocache) 137ENDPROC(__copy_user_nocache)
diff --git a/arch/x86/lib/csum-copy_64.S b/arch/x86/lib/csum-copy_64.S
index 2419d5fefae..fb903b758da 100644
--- a/arch/x86/lib/csum-copy_64.S
+++ b/arch/x86/lib/csum-copy_64.S
@@ -8,7 +8,6 @@
8#include <linux/linkage.h> 8#include <linux/linkage.h>
9#include <asm/dwarf2.h> 9#include <asm/dwarf2.h>
10#include <asm/errno.h> 10#include <asm/errno.h>
11#include <asm/asm.h>
12 11
13/* 12/*
14 * Checksum copy with exception handling. 13 * Checksum copy with exception handling.
@@ -32,17 +31,26 @@
32 31
33 .macro source 32 .macro source
3410: 3310:
35 _ASM_EXTABLE(10b, .Lbad_source) 34 .section __ex_table, "a"
35 .align 8
36 .quad 10b, .Lbad_source
37 .previous
36 .endm 38 .endm
37 39
38 .macro dest 40 .macro dest
3920: 4120:
40 _ASM_EXTABLE(20b, .Lbad_dest) 42 .section __ex_table, "a"
43 .align 8
44 .quad 20b, .Lbad_dest
45 .previous
41 .endm 46 .endm
42 47
43 .macro ignore L=.Lignore 48 .macro ignore L=.Lignore
4430: 4930:
45 _ASM_EXTABLE(30b, \L) 50 .section __ex_table, "a"
51 .align 8
52 .quad 30b, \L
53 .previous
46 .endm 54 .endm
47 55
48 56
diff --git a/arch/x86/lib/csum-wrappers_64.c b/arch/x86/lib/csum-wrappers_64.c
index 25b7ae8d058..459b58a8a15 100644
--- a/arch/x86/lib/csum-wrappers_64.c
+++ b/arch/x86/lib/csum-wrappers_64.c
@@ -115,7 +115,7 @@ EXPORT_SYMBOL(csum_partial_copy_to_user);
115 * @src: source address 115 * @src: source address
116 * @dst: destination address 116 * @dst: destination address
117 * @len: number of bytes to be copied. 117 * @len: number of bytes to be copied.
118 * @sum: initial sum that is added into the result (32bit unfolded) 118 * @isum: initial sum that is added into the result (32bit unfolded)
119 * 119 *
120 * Returns an 32bit unfolded checksum of the buffer. 120 * Returns an 32bit unfolded checksum of the buffer.
121 */ 121 */
diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c
index 7c3bee636e2..fc45ba887d0 100644
--- a/arch/x86/lib/delay.c
+++ b/arch/x86/lib/delay.c
@@ -48,9 +48,9 @@ static void delay_loop(unsigned long loops)
48} 48}
49 49
50/* TSC based delay: */ 50/* TSC based delay: */
51static void delay_tsc(unsigned long __loops) 51static void delay_tsc(unsigned long loops)
52{ 52{
53 u32 bclock, now, loops = __loops; 53 unsigned long bclock, now;
54 int cpu; 54 int cpu;
55 55
56 preempt_disable(); 56 preempt_disable();
@@ -98,7 +98,7 @@ void use_tsc_delay(void)
98 delay_fn = delay_tsc; 98 delay_fn = delay_tsc;
99} 99}
100 100
101int read_current_timer(unsigned long *timer_val) 101int __devinit read_current_timer(unsigned long *timer_val)
102{ 102{
103 if (delay_fn == delay_tsc) { 103 if (delay_fn == delay_tsc) {
104 rdtscll(*timer_val); 104 rdtscll(*timer_val);
diff --git a/arch/x86/lib/getuser.S b/arch/x86/lib/getuser.S
index 156b9c80467..51f1504cddd 100644
--- a/arch/x86/lib/getuser.S
+++ b/arch/x86/lib/getuser.S
@@ -33,7 +33,6 @@
33#include <asm/asm-offsets.h> 33#include <asm/asm-offsets.h>
34#include <asm/thread_info.h> 34#include <asm/thread_info.h>
35#include <asm/asm.h> 35#include <asm/asm.h>
36#include <asm/smap.h>
37 36
38 .text 37 .text
39ENTRY(__get_user_1) 38ENTRY(__get_user_1)
@@ -41,10 +40,8 @@ ENTRY(__get_user_1)
41 GET_THREAD_INFO(%_ASM_DX) 40 GET_THREAD_INFO(%_ASM_DX)
42 cmp TI_addr_limit(%_ASM_DX),%_ASM_AX 41 cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
43 jae bad_get_user 42 jae bad_get_user
44 ASM_STAC
451: movzb (%_ASM_AX),%edx 431: movzb (%_ASM_AX),%edx
46 xor %eax,%eax 44 xor %eax,%eax
47 ASM_CLAC
48 ret 45 ret
49 CFI_ENDPROC 46 CFI_ENDPROC
50ENDPROC(__get_user_1) 47ENDPROC(__get_user_1)
@@ -56,10 +53,8 @@ ENTRY(__get_user_2)
56 GET_THREAD_INFO(%_ASM_DX) 53 GET_THREAD_INFO(%_ASM_DX)
57 cmp TI_addr_limit(%_ASM_DX),%_ASM_AX 54 cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
58 jae bad_get_user 55 jae bad_get_user
59 ASM_STAC
602: movzwl -1(%_ASM_AX),%edx 562: movzwl -1(%_ASM_AX),%edx
61 xor %eax,%eax 57 xor %eax,%eax
62 ASM_CLAC
63 ret 58 ret
64 CFI_ENDPROC 59 CFI_ENDPROC
65ENDPROC(__get_user_2) 60ENDPROC(__get_user_2)
@@ -71,10 +66,8 @@ ENTRY(__get_user_4)
71 GET_THREAD_INFO(%_ASM_DX) 66 GET_THREAD_INFO(%_ASM_DX)
72 cmp TI_addr_limit(%_ASM_DX),%_ASM_AX 67 cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
73 jae bad_get_user 68 jae bad_get_user
74 ASM_STAC
753: mov -3(%_ASM_AX),%edx 693: mov -3(%_ASM_AX),%edx
76 xor %eax,%eax 70 xor %eax,%eax
77 ASM_CLAC
78 ret 71 ret
79 CFI_ENDPROC 72 CFI_ENDPROC
80ENDPROC(__get_user_4) 73ENDPROC(__get_user_4)
@@ -87,10 +80,8 @@ ENTRY(__get_user_8)
87 GET_THREAD_INFO(%_ASM_DX) 80 GET_THREAD_INFO(%_ASM_DX)
88 cmp TI_addr_limit(%_ASM_DX),%_ASM_AX 81 cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
89 jae bad_get_user 82 jae bad_get_user
90 ASM_STAC
914: movq -7(%_ASM_AX),%_ASM_DX 834: movq -7(%_ASM_AX),%_ASM_DX
92 xor %eax,%eax 84 xor %eax,%eax
93 ASM_CLAC
94 ret 85 ret
95 CFI_ENDPROC 86 CFI_ENDPROC
96ENDPROC(__get_user_8) 87ENDPROC(__get_user_8)
@@ -100,14 +91,14 @@ bad_get_user:
100 CFI_STARTPROC 91 CFI_STARTPROC
101 xor %edx,%edx 92 xor %edx,%edx
102 mov $(-EFAULT),%_ASM_AX 93 mov $(-EFAULT),%_ASM_AX
103 ASM_CLAC
104 ret 94 ret
105 CFI_ENDPROC 95 CFI_ENDPROC
106END(bad_get_user) 96END(bad_get_user)
107 97
108 _ASM_EXTABLE(1b,bad_get_user) 98.section __ex_table,"a"
109 _ASM_EXTABLE(2b,bad_get_user) 99 _ASM_PTR 1b,bad_get_user
110 _ASM_EXTABLE(3b,bad_get_user) 100 _ASM_PTR 2b,bad_get_user
101 _ASM_PTR 3b,bad_get_user
111#ifdef CONFIG_X86_64 102#ifdef CONFIG_X86_64
112 _ASM_EXTABLE(4b,bad_get_user) 103 _ASM_PTR 4b,bad_get_user
113#endif 104#endif
diff --git a/arch/x86/lib/inat.c b/arch/x86/lib/inat.c
index c1f01a8e9f6..46fc4ee09fc 100644
--- a/arch/x86/lib/inat.c
+++ b/arch/x86/lib/inat.c
@@ -29,46 +29,46 @@ insn_attr_t inat_get_opcode_attribute(insn_byte_t opcode)
29 return inat_primary_table[opcode]; 29 return inat_primary_table[opcode];
30} 30}
31 31
32int inat_get_last_prefix_id(insn_byte_t last_pfx) 32insn_attr_t inat_get_escape_attribute(insn_byte_t opcode, insn_byte_t last_pfx,
33{
34 insn_attr_t lpfx_attr;
35
36 lpfx_attr = inat_get_opcode_attribute(last_pfx);
37 return inat_last_prefix_id(lpfx_attr);
38}
39
40insn_attr_t inat_get_escape_attribute(insn_byte_t opcode, int lpfx_id,
41 insn_attr_t esc_attr) 33 insn_attr_t esc_attr)
42{ 34{
43 const insn_attr_t *table; 35 const insn_attr_t *table;
44 int n; 36 insn_attr_t lpfx_attr;
37 int n, m = 0;
45 38
46 n = inat_escape_id(esc_attr); 39 n = inat_escape_id(esc_attr);
47 40 if (last_pfx) {
41 lpfx_attr = inat_get_opcode_attribute(last_pfx);
42 m = inat_last_prefix_id(lpfx_attr);
43 }
48 table = inat_escape_tables[n][0]; 44 table = inat_escape_tables[n][0];
49 if (!table) 45 if (!table)
50 return 0; 46 return 0;
51 if (inat_has_variant(table[opcode]) && lpfx_id) { 47 if (inat_has_variant(table[opcode]) && m) {
52 table = inat_escape_tables[n][lpfx_id]; 48 table = inat_escape_tables[n][m];
53 if (!table) 49 if (!table)
54 return 0; 50 return 0;
55 } 51 }
56 return table[opcode]; 52 return table[opcode];
57} 53}
58 54
59insn_attr_t inat_get_group_attribute(insn_byte_t modrm, int lpfx_id, 55insn_attr_t inat_get_group_attribute(insn_byte_t modrm, insn_byte_t last_pfx,
60 insn_attr_t grp_attr) 56 insn_attr_t grp_attr)
61{ 57{
62 const insn_attr_t *table; 58 const insn_attr_t *table;
63 int n; 59 insn_attr_t lpfx_attr;
60 int n, m = 0;
64 61
65 n = inat_group_id(grp_attr); 62 n = inat_group_id(grp_attr);
66 63 if (last_pfx) {
64 lpfx_attr = inat_get_opcode_attribute(last_pfx);
65 m = inat_last_prefix_id(lpfx_attr);
66 }
67 table = inat_group_tables[n][0]; 67 table = inat_group_tables[n][0];
68 if (!table) 68 if (!table)
69 return inat_group_common_attribute(grp_attr); 69 return inat_group_common_attribute(grp_attr);
70 if (inat_has_variant(table[X86_MODRM_REG(modrm)]) && lpfx_id) { 70 if (inat_has_variant(table[X86_MODRM_REG(modrm)]) && m) {
71 table = inat_group_tables[n][lpfx_id]; 71 table = inat_group_tables[n][m];
72 if (!table) 72 if (!table)
73 return inat_group_common_attribute(grp_attr); 73 return inat_group_common_attribute(grp_attr);
74 } 74 }
@@ -82,16 +82,9 @@ insn_attr_t inat_get_avx_attribute(insn_byte_t opcode, insn_byte_t vex_m,
82 const insn_attr_t *table; 82 const insn_attr_t *table;
83 if (vex_m > X86_VEX_M_MAX || vex_p > INAT_LSTPFX_MAX) 83 if (vex_m > X86_VEX_M_MAX || vex_p > INAT_LSTPFX_MAX)
84 return 0; 84 return 0;
85 /* At first, this checks the master table */ 85 table = inat_avx_tables[vex_m][vex_p];
86 table = inat_avx_tables[vex_m][0];
87 if (!table) 86 if (!table)
88 return 0; 87 return 0;
89 if (!inat_is_group(table[opcode]) && vex_p) {
90 /* If this is not a group, get attribute directly */
91 table = inat_avx_tables[vex_m][vex_p];
92 if (!table)
93 return 0;
94 }
95 return table[opcode]; 88 return table[opcode];
96} 89}
97 90
diff --git a/arch/x86/lib/insn.c b/arch/x86/lib/insn.c
index 54fcffed28e..9f33b984d0e 100644
--- a/arch/x86/lib/insn.c
+++ b/arch/x86/lib/insn.c
@@ -18,31 +18,18 @@
18 * Copyright (C) IBM Corporation, 2002, 2004, 2009 18 * Copyright (C) IBM Corporation, 2002, 2004, 2009
19 */ 19 */
20 20
21#ifdef __KERNEL__
22#include <linux/string.h> 21#include <linux/string.h>
23#else
24#include <string.h>
25#endif
26#include <asm/inat.h> 22#include <asm/inat.h>
27#include <asm/insn.h> 23#include <asm/insn.h>
28 24
29/* Verify next sizeof(t) bytes can be on the same instruction */
30#define validate_next(t, insn, n) \
31 ((insn)->next_byte + sizeof(t) + n - (insn)->kaddr <= MAX_INSN_SIZE)
32
33#define __get_next(t, insn) \
34 ({ t r = *(t*)insn->next_byte; insn->next_byte += sizeof(t); r; })
35
36#define __peek_nbyte_next(t, insn, n) \
37 ({ t r = *(t*)((insn)->next_byte + n); r; })
38
39#define get_next(t, insn) \ 25#define get_next(t, insn) \
40 ({ if (unlikely(!validate_next(t, insn, 0))) goto err_out; __get_next(t, insn); }) 26 ({t r; r = *(t*)insn->next_byte; insn->next_byte += sizeof(t); r; })
41 27
42#define peek_nbyte_next(t, insn, n) \ 28#define peek_next(t, insn) \
43 ({ if (unlikely(!validate_next(t, insn, n))) goto err_out; __peek_nbyte_next(t, insn, n); }) 29 ({t r; r = *(t*)insn->next_byte; r; })
44 30
45#define peek_next(t, insn) peek_nbyte_next(t, insn, 0) 31#define peek_nbyte_next(t, insn, n) \
32 ({t r; r = *(t*)((insn)->next_byte + n); r; })
46 33
47/** 34/**
48 * insn_init() - initialize struct insn 35 * insn_init() - initialize struct insn
@@ -171,8 +158,6 @@ vex_end:
171 insn->vex_prefix.got = 1; 158 insn->vex_prefix.got = 1;
172 159
173 prefixes->got = 1; 160 prefixes->got = 1;
174
175err_out:
176 return; 161 return;
177} 162}
178 163
@@ -189,8 +174,7 @@ err_out:
189void insn_get_opcode(struct insn *insn) 174void insn_get_opcode(struct insn *insn)
190{ 175{
191 struct insn_field *opcode = &insn->opcode; 176 struct insn_field *opcode = &insn->opcode;
192 insn_byte_t op; 177 insn_byte_t op, pfx;
193 int pfx_id;
194 if (opcode->got) 178 if (opcode->got)
195 return; 179 return;
196 if (!insn->prefixes.got) 180 if (!insn->prefixes.got)
@@ -207,7 +191,7 @@ void insn_get_opcode(struct insn *insn)
207 m = insn_vex_m_bits(insn); 191 m = insn_vex_m_bits(insn);
208 p = insn_vex_p_bits(insn); 192 p = insn_vex_p_bits(insn);
209 insn->attr = inat_get_avx_attribute(op, m, p); 193 insn->attr = inat_get_avx_attribute(op, m, p);
210 if (!inat_accept_vex(insn->attr) && !inat_is_group(insn->attr)) 194 if (!inat_accept_vex(insn->attr))
211 insn->attr = 0; /* This instruction is bad */ 195 insn->attr = 0; /* This instruction is bad */
212 goto end; /* VEX has only 1 byte for opcode */ 196 goto end; /* VEX has only 1 byte for opcode */
213 } 197 }
@@ -217,16 +201,13 @@ void insn_get_opcode(struct insn *insn)
217 /* Get escaped opcode */ 201 /* Get escaped opcode */
218 op = get_next(insn_byte_t, insn); 202 op = get_next(insn_byte_t, insn);
219 opcode->bytes[opcode->nbytes++] = op; 203 opcode->bytes[opcode->nbytes++] = op;
220 pfx_id = insn_last_prefix_id(insn); 204 pfx = insn_last_prefix(insn);
221 insn->attr = inat_get_escape_attribute(op, pfx_id, insn->attr); 205 insn->attr = inat_get_escape_attribute(op, pfx, insn->attr);
222 } 206 }
223 if (inat_must_vex(insn->attr)) 207 if (inat_must_vex(insn->attr))
224 insn->attr = 0; /* This instruction is bad */ 208 insn->attr = 0; /* This instruction is bad */
225end: 209end:
226 opcode->got = 1; 210 opcode->got = 1;
227
228err_out:
229 return;
230} 211}
231 212
232/** 213/**
@@ -240,7 +221,7 @@ err_out:
240void insn_get_modrm(struct insn *insn) 221void insn_get_modrm(struct insn *insn)
241{ 222{
242 struct insn_field *modrm = &insn->modrm; 223 struct insn_field *modrm = &insn->modrm;
243 insn_byte_t pfx_id, mod; 224 insn_byte_t pfx, mod;
244 if (modrm->got) 225 if (modrm->got)
245 return; 226 return;
246 if (!insn->opcode.got) 227 if (!insn->opcode.got)
@@ -251,20 +232,15 @@ void insn_get_modrm(struct insn *insn)
251 modrm->value = mod; 232 modrm->value = mod;
252 modrm->nbytes = 1; 233 modrm->nbytes = 1;
253 if (inat_is_group(insn->attr)) { 234 if (inat_is_group(insn->attr)) {
254 pfx_id = insn_last_prefix_id(insn); 235 pfx = insn_last_prefix(insn);
255 insn->attr = inat_get_group_attribute(mod, pfx_id, 236 insn->attr = inat_get_group_attribute(mod, pfx,
256 insn->attr); 237 insn->attr);
257 if (insn_is_avx(insn) && !inat_accept_vex(insn->attr))
258 insn->attr = 0; /* This is bad */
259 } 238 }
260 } 239 }
261 240
262 if (insn->x86_64 && inat_is_force64(insn->attr)) 241 if (insn->x86_64 && inat_is_force64(insn->attr))
263 insn->opnd_bytes = 8; 242 insn->opnd_bytes = 8;
264 modrm->got = 1; 243 modrm->got = 1;
265
266err_out:
267 return;
268} 244}
269 245
270 246
@@ -314,9 +290,6 @@ void insn_get_sib(struct insn *insn)
314 } 290 }
315 } 291 }
316 insn->sib.got = 1; 292 insn->sib.got = 1;
317
318err_out:
319 return;
320} 293}
321 294
322 295
@@ -378,13 +351,10 @@ void insn_get_displacement(struct insn *insn)
378 } 351 }
379out: 352out:
380 insn->displacement.got = 1; 353 insn->displacement.got = 1;
381
382err_out:
383 return;
384} 354}
385 355
386/* Decode moffset16/32/64. Return 0 if failed */ 356/* Decode moffset16/32/64 */
387static int __get_moffset(struct insn *insn) 357static void __get_moffset(struct insn *insn)
388{ 358{
389 switch (insn->addr_bytes) { 359 switch (insn->addr_bytes) {
390 case 2: 360 case 2:
@@ -401,19 +371,12 @@ static int __get_moffset(struct insn *insn)
401 insn->moffset2.value = get_next(int, insn); 371 insn->moffset2.value = get_next(int, insn);
402 insn->moffset2.nbytes = 4; 372 insn->moffset2.nbytes = 4;
403 break; 373 break;
404 default: /* opnd_bytes must be modified manually */
405 goto err_out;
406 } 374 }
407 insn->moffset1.got = insn->moffset2.got = 1; 375 insn->moffset1.got = insn->moffset2.got = 1;
408
409 return 1;
410
411err_out:
412 return 0;
413} 376}
414 377
415/* Decode imm v32(Iz). Return 0 if failed */ 378/* Decode imm v32(Iz) */
416static int __get_immv32(struct insn *insn) 379static void __get_immv32(struct insn *insn)
417{ 380{
418 switch (insn->opnd_bytes) { 381 switch (insn->opnd_bytes) {
419 case 2: 382 case 2:
@@ -425,18 +388,11 @@ static int __get_immv32(struct insn *insn)
425 insn->immediate.value = get_next(int, insn); 388 insn->immediate.value = get_next(int, insn);
426 insn->immediate.nbytes = 4; 389 insn->immediate.nbytes = 4;
427 break; 390 break;
428 default: /* opnd_bytes must be modified manually */
429 goto err_out;
430 } 391 }
431
432 return 1;
433
434err_out:
435 return 0;
436} 392}
437 393
438/* Decode imm v64(Iv/Ov), Return 0 if failed */ 394/* Decode imm v64(Iv/Ov) */
439static int __get_immv(struct insn *insn) 395static void __get_immv(struct insn *insn)
440{ 396{
441 switch (insn->opnd_bytes) { 397 switch (insn->opnd_bytes) {
442 case 2: 398 case 2:
@@ -453,18 +409,12 @@ static int __get_immv(struct insn *insn)
453 insn->immediate2.value = get_next(int, insn); 409 insn->immediate2.value = get_next(int, insn);
454 insn->immediate2.nbytes = 4; 410 insn->immediate2.nbytes = 4;
455 break; 411 break;
456 default: /* opnd_bytes must be modified manually */
457 goto err_out;
458 } 412 }
459 insn->immediate1.got = insn->immediate2.got = 1; 413 insn->immediate1.got = insn->immediate2.got = 1;
460
461 return 1;
462err_out:
463 return 0;
464} 414}
465 415
466/* Decode ptr16:16/32(Ap) */ 416/* Decode ptr16:16/32(Ap) */
467static int __get_immptr(struct insn *insn) 417static void __get_immptr(struct insn *insn)
468{ 418{
469 switch (insn->opnd_bytes) { 419 switch (insn->opnd_bytes) {
470 case 2: 420 case 2:
@@ -477,17 +427,11 @@ static int __get_immptr(struct insn *insn)
477 break; 427 break;
478 case 8: 428 case 8:
479 /* ptr16:64 is not exist (no segment) */ 429 /* ptr16:64 is not exist (no segment) */
480 return 0; 430 return;
481 default: /* opnd_bytes must be modified manually */
482 goto err_out;
483 } 431 }
484 insn->immediate2.value = get_next(unsigned short, insn); 432 insn->immediate2.value = get_next(unsigned short, insn);
485 insn->immediate2.nbytes = 2; 433 insn->immediate2.nbytes = 2;
486 insn->immediate1.got = insn->immediate2.got = 1; 434 insn->immediate1.got = insn->immediate2.got = 1;
487
488 return 1;
489err_out:
490 return 0;
491} 435}
492 436
493/** 437/**
@@ -507,8 +451,7 @@ void insn_get_immediate(struct insn *insn)
507 insn_get_displacement(insn); 451 insn_get_displacement(insn);
508 452
509 if (inat_has_moffset(insn->attr)) { 453 if (inat_has_moffset(insn->attr)) {
510 if (!__get_moffset(insn)) 454 __get_moffset(insn);
511 goto err_out;
512 goto done; 455 goto done;
513 } 456 }
514 457
@@ -536,20 +479,16 @@ void insn_get_immediate(struct insn *insn)
536 insn->immediate2.nbytes = 4; 479 insn->immediate2.nbytes = 4;
537 break; 480 break;
538 case INAT_IMM_PTR: 481 case INAT_IMM_PTR:
539 if (!__get_immptr(insn)) 482 __get_immptr(insn);
540 goto err_out;
541 break; 483 break;
542 case INAT_IMM_VWORD32: 484 case INAT_IMM_VWORD32:
543 if (!__get_immv32(insn)) 485 __get_immv32(insn);
544 goto err_out;
545 break; 486 break;
546 case INAT_IMM_VWORD: 487 case INAT_IMM_VWORD:
547 if (!__get_immv(insn)) 488 __get_immv(insn);
548 goto err_out;
549 break; 489 break;
550 default: 490 default:
551 /* Here, insn must have an immediate, but failed */ 491 break;
552 goto err_out;
553 } 492 }
554 if (inat_has_second_immediate(insn->attr)) { 493 if (inat_has_second_immediate(insn->attr)) {
555 insn->immediate2.value = get_next(char, insn); 494 insn->immediate2.value = get_next(char, insn);
@@ -557,9 +496,6 @@ void insn_get_immediate(struct insn *insn)
557 } 496 }
558done: 497done:
559 insn->immediate.got = 1; 498 insn->immediate.got = 1;
560
561err_out:
562 return;
563} 499}
564 500
565/** 501/**
diff --git a/arch/x86/lib/memcpy_64.S b/arch/x86/lib/memcpy_64.S
index 1c273be7c97..efbf2a0ecde 100644
--- a/arch/x86/lib/memcpy_64.S
+++ b/arch/x86/lib/memcpy_64.S
@@ -27,8 +27,9 @@
27 .section .altinstr_replacement, "ax", @progbits 27 .section .altinstr_replacement, "ax", @progbits
28.Lmemcpy_c: 28.Lmemcpy_c:
29 movq %rdi, %rax 29 movq %rdi, %rax
30 movq %rdx, %rcx 30
31 shrq $3, %rcx 31 movl %edx, %ecx
32 shrl $3, %ecx
32 andl $7, %edx 33 andl $7, %edx
33 rep movsq 34 rep movsq
34 movl %edx, %ecx 35 movl %edx, %ecx
@@ -47,7 +48,8 @@
47 .section .altinstr_replacement, "ax", @progbits 48 .section .altinstr_replacement, "ax", @progbits
48.Lmemcpy_c_e: 49.Lmemcpy_c_e:
49 movq %rdi, %rax 50 movq %rdi, %rax
50 movq %rdx, %rcx 51
52 movl %edx, %ecx
51 rep movsb 53 rep movsb
52 ret 54 ret
53.Lmemcpy_e_e: 55.Lmemcpy_e_e:
@@ -58,7 +60,10 @@ ENTRY(memcpy)
58 CFI_STARTPROC 60 CFI_STARTPROC
59 movq %rdi, %rax 61 movq %rdi, %rax
60 62
61 cmpq $0x20, %rdx 63 /*
64 * Use 32bit CMP here to avoid long NOP padding.
65 */
66 cmp $0x20, %edx
62 jb .Lhandle_tail 67 jb .Lhandle_tail
63 68
64 /* 69 /*
@@ -67,7 +72,7 @@ ENTRY(memcpy)
67 */ 72 */
68 cmp %dil, %sil 73 cmp %dil, %sil
69 jl .Lcopy_backward 74 jl .Lcopy_backward
70 subq $0x20, %rdx 75 subl $0x20, %edx
71.Lcopy_forward_loop: 76.Lcopy_forward_loop:
72 subq $0x20, %rdx 77 subq $0x20, %rdx
73 78
@@ -86,7 +91,7 @@ ENTRY(memcpy)
86 movq %r11, 3*8(%rdi) 91 movq %r11, 3*8(%rdi)
87 leaq 4*8(%rdi), %rdi 92 leaq 4*8(%rdi), %rdi
88 jae .Lcopy_forward_loop 93 jae .Lcopy_forward_loop
89 addl $0x20, %edx 94 addq $0x20, %rdx
90 jmp .Lhandle_tail 95 jmp .Lhandle_tail
91 96
92.Lcopy_backward: 97.Lcopy_backward:
@@ -118,11 +123,11 @@ ENTRY(memcpy)
118 /* 123 /*
119 * Calculate copy position to head. 124 * Calculate copy position to head.
120 */ 125 */
121 addl $0x20, %edx 126 addq $0x20, %rdx
122 subq %rdx, %rsi 127 subq %rdx, %rsi
123 subq %rdx, %rdi 128 subq %rdx, %rdi
124.Lhandle_tail: 129.Lhandle_tail:
125 cmpl $16, %edx 130 cmpq $16, %rdx
126 jb .Lless_16bytes 131 jb .Lless_16bytes
127 132
128 /* 133 /*
@@ -139,7 +144,7 @@ ENTRY(memcpy)
139 retq 144 retq
140 .p2align 4 145 .p2align 4
141.Lless_16bytes: 146.Lless_16bytes:
142 cmpl $8, %edx 147 cmpq $8, %rdx
143 jb .Lless_8bytes 148 jb .Lless_8bytes
144 /* 149 /*
145 * Move data from 8 bytes to 15 bytes. 150 * Move data from 8 bytes to 15 bytes.
@@ -151,7 +156,7 @@ ENTRY(memcpy)
151 retq 156 retq
152 .p2align 4 157 .p2align 4
153.Lless_8bytes: 158.Lless_8bytes:
154 cmpl $4, %edx 159 cmpq $4, %rdx
155 jb .Lless_3bytes 160 jb .Lless_3bytes
156 161
157 /* 162 /*
@@ -164,19 +169,18 @@ ENTRY(memcpy)
164 retq 169 retq
165 .p2align 4 170 .p2align 4
166.Lless_3bytes: 171.Lless_3bytes:
167 subl $1, %edx 172 cmpl $0, %edx
168 jb .Lend 173 je .Lend
169 /* 174 /*
170 * Move data from 1 bytes to 3 bytes. 175 * Move data from 1 bytes to 3 bytes.
171 */ 176 */
172 movzbl (%rsi), %ecx 177.Lloop_1:
173 jz .Lstore_1byte 178 movb (%rsi), %r8b
174 movzbq 1(%rsi), %r8 179 movb %r8b, (%rdi)
175 movzbq (%rsi, %rdx), %r9 180 incq %rdi
176 movb %r8b, 1(%rdi) 181 incq %rsi
177 movb %r9b, (%rdi, %rdx) 182 decl %edx
178.Lstore_1byte: 183 jnz .Lloop_1
179 movb %cl, (%rdi)
180 184
181.Lend: 185.Lend:
182 retq 186 retq
diff --git a/arch/x86/lib/memset_64.S b/arch/x86/lib/memset_64.S
index 2dcb3808cbd..79bd454b78a 100644
--- a/arch/x86/lib/memset_64.S
+++ b/arch/x86/lib/memset_64.S
@@ -19,15 +19,16 @@
19 .section .altinstr_replacement, "ax", @progbits 19 .section .altinstr_replacement, "ax", @progbits
20.Lmemset_c: 20.Lmemset_c:
21 movq %rdi,%r9 21 movq %rdi,%r9
22 movq %rdx,%rcx 22 movl %edx,%r8d
23 andl $7,%edx 23 andl $7,%r8d
24 shrq $3,%rcx 24 movl %edx,%ecx
25 shrl $3,%ecx
25 /* expand byte value */ 26 /* expand byte value */
26 movzbl %sil,%esi 27 movzbl %sil,%esi
27 movabs $0x0101010101010101,%rax 28 movabs $0x0101010101010101,%rax
28 imulq %rsi,%rax 29 mulq %rsi /* with rax, clobbers rdx */
29 rep stosq 30 rep stosq
30 movl %edx,%ecx 31 movl %r8d,%ecx
31 rep stosb 32 rep stosb
32 movq %r9,%rax 33 movq %r9,%rax
33 ret 34 ret
@@ -49,7 +50,7 @@
49.Lmemset_c_e: 50.Lmemset_c_e:
50 movq %rdi,%r9 51 movq %rdi,%r9
51 movb %sil,%al 52 movb %sil,%al
52 movq %rdx,%rcx 53 movl %edx,%ecx
53 rep stosb 54 rep stosb
54 movq %r9,%rax 55 movq %r9,%rax
55 ret 56 ret
@@ -60,11 +61,12 @@ ENTRY(memset)
60ENTRY(__memset) 61ENTRY(__memset)
61 CFI_STARTPROC 62 CFI_STARTPROC
62 movq %rdi,%r10 63 movq %rdi,%r10
64 movq %rdx,%r11
63 65
64 /* expand byte value */ 66 /* expand byte value */
65 movzbl %sil,%ecx 67 movzbl %sil,%ecx
66 movabs $0x0101010101010101,%rax 68 movabs $0x0101010101010101,%rax
67 imulq %rcx,%rax 69 mul %rcx /* with rax, clobbers rdx */
68 70
69 /* align dst */ 71 /* align dst */
70 movl %edi,%r9d 72 movl %edi,%r9d
@@ -73,13 +75,13 @@ ENTRY(__memset)
73 CFI_REMEMBER_STATE 75 CFI_REMEMBER_STATE
74.Lafter_bad_alignment: 76.Lafter_bad_alignment:
75 77
76 movq %rdx,%rcx 78 movl %r11d,%ecx
77 shrq $6,%rcx 79 shrl $6,%ecx
78 jz .Lhandle_tail 80 jz .Lhandle_tail
79 81
80 .p2align 4 82 .p2align 4
81.Lloop_64: 83.Lloop_64:
82 decq %rcx 84 decl %ecx
83 movq %rax,(%rdi) 85 movq %rax,(%rdi)
84 movq %rax,8(%rdi) 86 movq %rax,8(%rdi)
85 movq %rax,16(%rdi) 87 movq %rax,16(%rdi)
@@ -95,7 +97,7 @@ ENTRY(__memset)
95 to predict jump tables. */ 97 to predict jump tables. */
96 .p2align 4 98 .p2align 4
97.Lhandle_tail: 99.Lhandle_tail:
98 movl %edx,%ecx 100 movl %r11d,%ecx
99 andl $63&(~7),%ecx 101 andl $63&(~7),%ecx
100 jz .Lhandle_7 102 jz .Lhandle_7
101 shrl $3,%ecx 103 shrl $3,%ecx
@@ -107,11 +109,12 @@ ENTRY(__memset)
107 jnz .Lloop_8 109 jnz .Lloop_8
108 110
109.Lhandle_7: 111.Lhandle_7:
110 andl $7,%edx 112 movl %r11d,%ecx
113 andl $7,%ecx
111 jz .Lende 114 jz .Lende
112 .p2align 4 115 .p2align 4
113.Lloop_1: 116.Lloop_1:
114 decl %edx 117 decl %ecx
115 movb %al,(%rdi) 118 movb %al,(%rdi)
116 leaq 1(%rdi),%rdi 119 leaq 1(%rdi),%rdi
117 jnz .Lloop_1 120 jnz .Lloop_1
@@ -122,13 +125,13 @@ ENTRY(__memset)
122 125
123 CFI_RESTORE_STATE 126 CFI_RESTORE_STATE
124.Lbad_alignment: 127.Lbad_alignment:
125 cmpq $7,%rdx 128 cmpq $7,%r11
126 jbe .Lhandle_7 129 jbe .Lhandle_7
127 movq %rax,(%rdi) /* unaligned store */ 130 movq %rax,(%rdi) /* unaligned store */
128 movq $8,%r8 131 movq $8,%r8
129 subq %r9,%r8 132 subq %r9,%r8
130 addq %r8,%rdi 133 addq %r8,%rdi
131 subq %r8,%rdx 134 subq %r8,%r11
132 jmp .Lafter_bad_alignment 135 jmp .Lafter_bad_alignment
133.Lfinal: 136.Lfinal:
134 CFI_ENDPROC 137 CFI_ENDPROC
diff --git a/arch/x86/lib/msr-reg-export.c b/arch/x86/lib/msr-reg-export.c
index 8d6ef78b5d0..a311cc59b65 100644
--- a/arch/x86/lib/msr-reg-export.c
+++ b/arch/x86/lib/msr-reg-export.c
@@ -1,5 +1,5 @@
1#include <linux/module.h> 1#include <linux/module.h>
2#include <asm/msr.h> 2#include <asm/msr.h>
3 3
4EXPORT_SYMBOL(rdmsr_safe_regs); 4EXPORT_SYMBOL(native_rdmsr_safe_regs);
5EXPORT_SYMBOL(wrmsr_safe_regs); 5EXPORT_SYMBOL(native_wrmsr_safe_regs);
diff --git a/arch/x86/lib/msr-reg.S b/arch/x86/lib/msr-reg.S
index f6d13eefad1..69fa10623f2 100644
--- a/arch/x86/lib/msr-reg.S
+++ b/arch/x86/lib/msr-reg.S
@@ -6,13 +6,13 @@
6 6
7#ifdef CONFIG_X86_64 7#ifdef CONFIG_X86_64
8/* 8/*
9 * int {rdmsr,wrmsr}_safe_regs(u32 gprs[8]); 9 * int native_{rdmsr,wrmsr}_safe_regs(u32 gprs[8]);
10 * 10 *
11 * reg layout: u32 gprs[eax, ecx, edx, ebx, esp, ebp, esi, edi] 11 * reg layout: u32 gprs[eax, ecx, edx, ebx, esp, ebp, esi, edi]
12 * 12 *
13 */ 13 */
14.macro op_safe_regs op 14.macro op_safe_regs op
15ENTRY(\op\()_safe_regs) 15ENTRY(native_\op\()_safe_regs)
16 CFI_STARTPROC 16 CFI_STARTPROC
17 pushq_cfi %rbx 17 pushq_cfi %rbx
18 pushq_cfi %rbp 18 pushq_cfi %rbp
@@ -45,13 +45,13 @@ ENTRY(\op\()_safe_regs)
45 45
46 _ASM_EXTABLE(1b, 3b) 46 _ASM_EXTABLE(1b, 3b)
47 CFI_ENDPROC 47 CFI_ENDPROC
48ENDPROC(\op\()_safe_regs) 48ENDPROC(native_\op\()_safe_regs)
49.endm 49.endm
50 50
51#else /* X86_32 */ 51#else /* X86_32 */
52 52
53.macro op_safe_regs op 53.macro op_safe_regs op
54ENTRY(\op\()_safe_regs) 54ENTRY(native_\op\()_safe_regs)
55 CFI_STARTPROC 55 CFI_STARTPROC
56 pushl_cfi %ebx 56 pushl_cfi %ebx
57 pushl_cfi %ebp 57 pushl_cfi %ebp
@@ -92,7 +92,7 @@ ENTRY(\op\()_safe_regs)
92 92
93 _ASM_EXTABLE(1b, 3b) 93 _ASM_EXTABLE(1b, 3b)
94 CFI_ENDPROC 94 CFI_ENDPROC
95ENDPROC(\op\()_safe_regs) 95ENDPROC(native_\op\()_safe_regs)
96.endm 96.endm
97 97
98#endif 98#endif
diff --git a/arch/x86/lib/putuser.S b/arch/x86/lib/putuser.S
index fc6ba17a7ee..36b0d15ae6e 100644
--- a/arch/x86/lib/putuser.S
+++ b/arch/x86/lib/putuser.S
@@ -15,7 +15,6 @@
15#include <asm/thread_info.h> 15#include <asm/thread_info.h>
16#include <asm/errno.h> 16#include <asm/errno.h>
17#include <asm/asm.h> 17#include <asm/asm.h>
18#include <asm/smap.h>
19 18
20 19
21/* 20/*
@@ -32,8 +31,7 @@
32 31
33#define ENTER CFI_STARTPROC ; \ 32#define ENTER CFI_STARTPROC ; \
34 GET_THREAD_INFO(%_ASM_BX) 33 GET_THREAD_INFO(%_ASM_BX)
35#define EXIT ASM_CLAC ; \ 34#define EXIT ret ; \
36 ret ; \
37 CFI_ENDPROC 35 CFI_ENDPROC
38 36
39.text 37.text
@@ -41,7 +39,6 @@ ENTRY(__put_user_1)
41 ENTER 39 ENTER
42 cmp TI_addr_limit(%_ASM_BX),%_ASM_CX 40 cmp TI_addr_limit(%_ASM_BX),%_ASM_CX
43 jae bad_put_user 41 jae bad_put_user
44 ASM_STAC
451: movb %al,(%_ASM_CX) 421: movb %al,(%_ASM_CX)
46 xor %eax,%eax 43 xor %eax,%eax
47 EXIT 44 EXIT
@@ -53,7 +50,6 @@ ENTRY(__put_user_2)
53 sub $1,%_ASM_BX 50 sub $1,%_ASM_BX
54 cmp %_ASM_BX,%_ASM_CX 51 cmp %_ASM_BX,%_ASM_CX
55 jae bad_put_user 52 jae bad_put_user
56 ASM_STAC
572: movw %ax,(%_ASM_CX) 532: movw %ax,(%_ASM_CX)
58 xor %eax,%eax 54 xor %eax,%eax
59 EXIT 55 EXIT
@@ -65,7 +61,6 @@ ENTRY(__put_user_4)
65 sub $3,%_ASM_BX 61 sub $3,%_ASM_BX
66 cmp %_ASM_BX,%_ASM_CX 62 cmp %_ASM_BX,%_ASM_CX
67 jae bad_put_user 63 jae bad_put_user
68 ASM_STAC
693: movl %eax,(%_ASM_CX) 643: movl %eax,(%_ASM_CX)
70 xor %eax,%eax 65 xor %eax,%eax
71 EXIT 66 EXIT
@@ -77,7 +72,6 @@ ENTRY(__put_user_8)
77 sub $7,%_ASM_BX 72 sub $7,%_ASM_BX
78 cmp %_ASM_BX,%_ASM_CX 73 cmp %_ASM_BX,%_ASM_CX
79 jae bad_put_user 74 jae bad_put_user
80 ASM_STAC
814: mov %_ASM_AX,(%_ASM_CX) 754: mov %_ASM_AX,(%_ASM_CX)
82#ifdef CONFIG_X86_32 76#ifdef CONFIG_X86_32
835: movl %edx,4(%_ASM_CX) 775: movl %edx,4(%_ASM_CX)
@@ -92,10 +86,12 @@ bad_put_user:
92 EXIT 86 EXIT
93END(bad_put_user) 87END(bad_put_user)
94 88
95 _ASM_EXTABLE(1b,bad_put_user) 89.section __ex_table,"a"
96 _ASM_EXTABLE(2b,bad_put_user) 90 _ASM_PTR 1b,bad_put_user
97 _ASM_EXTABLE(3b,bad_put_user) 91 _ASM_PTR 2b,bad_put_user
98 _ASM_EXTABLE(4b,bad_put_user) 92 _ASM_PTR 3b,bad_put_user
93 _ASM_PTR 4b,bad_put_user
99#ifdef CONFIG_X86_32 94#ifdef CONFIG_X86_32
100 _ASM_EXTABLE(5b,bad_put_user) 95 _ASM_PTR 5b,bad_put_user
101#endif 96#endif
97.previous
diff --git a/arch/x86/lib/string_32.c b/arch/x86/lib/string_32.c
index bd59090825d..82004d2bf05 100644
--- a/arch/x86/lib/string_32.c
+++ b/arch/x86/lib/string_32.c
@@ -164,13 +164,15 @@ EXPORT_SYMBOL(strchr);
164size_t strlen(const char *s) 164size_t strlen(const char *s)
165{ 165{
166 int d0; 166 int d0;
167 size_t res; 167 int res;
168 asm volatile("repne\n\t" 168 asm volatile("repne\n\t"
169 "scasb" 169 "scasb\n\t"
170 "notl %0\n\t"
171 "decl %0"
170 : "=c" (res), "=&D" (d0) 172 : "=c" (res), "=&D" (d0)
171 : "1" (s), "a" (0), "0" (0xffffffffu) 173 : "1" (s), "a" (0), "0" (0xffffffffu)
172 : "memory"); 174 : "memory");
173 return ~res - 1; 175 return res;
174} 176}
175EXPORT_SYMBOL(strlen); 177EXPORT_SYMBOL(strlen);
176#endif 178#endif
diff --git a/arch/x86/lib/usercopy.c b/arch/x86/lib/usercopy.c
index 4f74d94c8d9..97be9cb5448 100644
--- a/arch/x86/lib/usercopy.c
+++ b/arch/x86/lib/usercopy.c
@@ -7,9 +7,6 @@
7#include <linux/highmem.h> 7#include <linux/highmem.h>
8#include <linux/module.h> 8#include <linux/module.h>
9 9
10#include <asm/word-at-a-time.h>
11#include <linux/sched.h>
12
13/* 10/*
14 * best effort, GUP based copy_from_user() that is NMI-safe 11 * best effort, GUP based copy_from_user() that is NMI-safe
15 */ 12 */
@@ -22,9 +19,6 @@ copy_from_user_nmi(void *to, const void __user *from, unsigned long n)
22 void *map; 19 void *map;
23 int ret; 20 int ret;
24 21
25 if (__range_not_ok(from, n, TASK_SIZE))
26 return len;
27
28 do { 22 do {
29 ret = __get_user_pages_fast(addr, 1, 0, &page); 23 ret = __get_user_pages_fast(addr, 1, 0, &page);
30 if (!ret) 24 if (!ret)
diff --git a/arch/x86/lib/usercopy_32.c b/arch/x86/lib/usercopy_32.c
index f0312d74640..e218d5df85f 100644
--- a/arch/x86/lib/usercopy_32.c
+++ b/arch/x86/lib/usercopy_32.c
@@ -13,7 +13,6 @@
13#include <linux/interrupt.h> 13#include <linux/interrupt.h>
14#include <asm/uaccess.h> 14#include <asm/uaccess.h>
15#include <asm/mmx.h> 15#include <asm/mmx.h>
16#include <asm/asm.h>
17 16
18#ifdef CONFIG_X86_INTEL_USERCOPY 17#ifdef CONFIG_X86_INTEL_USERCOPY
19/* 18/*
@@ -34,6 +33,93 @@ static inline int __movsl_is_ok(unsigned long a1, unsigned long a2, unsigned lon
34 __movsl_is_ok((unsigned long)(a1), (unsigned long)(a2), (n)) 33 __movsl_is_ok((unsigned long)(a1), (unsigned long)(a2), (n))
35 34
36/* 35/*
36 * Copy a null terminated string from userspace.
37 */
38
39#define __do_strncpy_from_user(dst, src, count, res) \
40do { \
41 int __d0, __d1, __d2; \
42 might_fault(); \
43 __asm__ __volatile__( \
44 " testl %1,%1\n" \
45 " jz 2f\n" \
46 "0: lodsb\n" \
47 " stosb\n" \
48 " testb %%al,%%al\n" \
49 " jz 1f\n" \
50 " decl %1\n" \
51 " jnz 0b\n" \
52 "1: subl %1,%0\n" \
53 "2:\n" \
54 ".section .fixup,\"ax\"\n" \
55 "3: movl %5,%0\n" \
56 " jmp 2b\n" \
57 ".previous\n" \
58 _ASM_EXTABLE(0b,3b) \
59 : "=&d"(res), "=&c"(count), "=&a" (__d0), "=&S" (__d1), \
60 "=&D" (__d2) \
61 : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
62 : "memory"); \
63} while (0)
64
65/**
66 * __strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking.
67 * @dst: Destination address, in kernel space. This buffer must be at
68 * least @count bytes long.
69 * @src: Source address, in user space.
70 * @count: Maximum number of bytes to copy, including the trailing NUL.
71 *
72 * Copies a NUL-terminated string from userspace to kernel space.
73 * Caller must check the specified block with access_ok() before calling
74 * this function.
75 *
76 * On success, returns the length of the string (not including the trailing
77 * NUL).
78 *
79 * If access to userspace fails, returns -EFAULT (some data may have been
80 * copied).
81 *
82 * If @count is smaller than the length of the string, copies @count bytes
83 * and returns @count.
84 */
85long
86__strncpy_from_user(char *dst, const char __user *src, long count)
87{
88 long res;
89 __do_strncpy_from_user(dst, src, count, res);
90 return res;
91}
92EXPORT_SYMBOL(__strncpy_from_user);
93
94/**
95 * strncpy_from_user: - Copy a NUL terminated string from userspace.
96 * @dst: Destination address, in kernel space. This buffer must be at
97 * least @count bytes long.
98 * @src: Source address, in user space.
99 * @count: Maximum number of bytes to copy, including the trailing NUL.
100 *
101 * Copies a NUL-terminated string from userspace to kernel space.
102 *
103 * On success, returns the length of the string (not including the trailing
104 * NUL).
105 *
106 * If access to userspace fails, returns -EFAULT (some data may have been
107 * copied).
108 *
109 * If @count is smaller than the length of the string, copies @count bytes
110 * and returns @count.
111 */
112long
113strncpy_from_user(char *dst, const char __user *src, long count)
114{
115 long res = -EFAULT;
116 if (access_ok(VERIFY_READ, src, 1))
117 __do_strncpy_from_user(dst, src, count, res);
118 return res;
119}
120EXPORT_SYMBOL(strncpy_from_user);
121
122/*
37 * Zero Userspace 123 * Zero Userspace
38 */ 124 */
39 125
@@ -42,11 +128,10 @@ do { \
42 int __d0; \ 128 int __d0; \
43 might_fault(); \ 129 might_fault(); \
44 __asm__ __volatile__( \ 130 __asm__ __volatile__( \
45 ASM_STAC "\n" \
46 "0: rep; stosl\n" \ 131 "0: rep; stosl\n" \
47 " movl %2,%0\n" \ 132 " movl %2,%0\n" \
48 "1: rep; stosb\n" \ 133 "1: rep; stosb\n" \
49 "2: " ASM_CLAC "\n" \ 134 "2:\n" \
50 ".section .fixup,\"ax\"\n" \ 135 ".section .fixup,\"ax\"\n" \
51 "3: lea 0(%2,%0,4),%0\n" \ 136 "3: lea 0(%2,%0,4),%0\n" \
52 " jmp 2b\n" \ 137 " jmp 2b\n" \
@@ -96,6 +181,50 @@ __clear_user(void __user *to, unsigned long n)
96} 181}
97EXPORT_SYMBOL(__clear_user); 182EXPORT_SYMBOL(__clear_user);
98 183
184/**
185 * strnlen_user: - Get the size of a string in user space.
186 * @s: The string to measure.
187 * @n: The maximum valid length
188 *
189 * Get the size of a NUL-terminated string in user space.
190 *
191 * Returns the size of the string INCLUDING the terminating NUL.
192 * On exception, returns 0.
193 * If the string is too long, returns a value greater than @n.
194 */
195long strnlen_user(const char __user *s, long n)
196{
197 unsigned long mask = -__addr_ok(s);
198 unsigned long res, tmp;
199
200 might_fault();
201
202 __asm__ __volatile__(
203 " testl %0, %0\n"
204 " jz 3f\n"
205 " andl %0,%%ecx\n"
206 "0: repne; scasb\n"
207 " setne %%al\n"
208 " subl %%ecx,%0\n"
209 " addl %0,%%eax\n"
210 "1:\n"
211 ".section .fixup,\"ax\"\n"
212 "2: xorl %%eax,%%eax\n"
213 " jmp 1b\n"
214 "3: movb $1,%%al\n"
215 " jmp 1b\n"
216 ".previous\n"
217 ".section __ex_table,\"a\"\n"
218 " .align 4\n"
219 " .long 0b,2b\n"
220 ".previous"
221 :"=&r" (n), "=&D" (s), "=&a" (res), "=&c" (tmp)
222 :"0" (n), "1" (s), "2" (0), "3" (mask)
223 :"cc");
224 return res & mask;
225}
226EXPORT_SYMBOL(strnlen_user);
227
99#ifdef CONFIG_X86_INTEL_USERCOPY 228#ifdef CONFIG_X86_INTEL_USERCOPY
100static unsigned long 229static unsigned long
101__copy_user_intel(void __user *to, const void *from, unsigned long size) 230__copy_user_intel(void __user *to, const void *from, unsigned long size)
@@ -157,44 +286,47 @@ __copy_user_intel(void __user *to, const void *from, unsigned long size)
157 "101: lea 0(%%eax,%0,4),%0\n" 286 "101: lea 0(%%eax,%0,4),%0\n"
158 " jmp 100b\n" 287 " jmp 100b\n"
159 ".previous\n" 288 ".previous\n"
160 _ASM_EXTABLE(1b,100b) 289 ".section __ex_table,\"a\"\n"
161 _ASM_EXTABLE(2b,100b) 290 " .align 4\n"
162 _ASM_EXTABLE(3b,100b) 291 " .long 1b,100b\n"
163 _ASM_EXTABLE(4b,100b) 292 " .long 2b,100b\n"
164 _ASM_EXTABLE(5b,100b) 293 " .long 3b,100b\n"
165 _ASM_EXTABLE(6b,100b) 294 " .long 4b,100b\n"
166 _ASM_EXTABLE(7b,100b) 295 " .long 5b,100b\n"
167 _ASM_EXTABLE(8b,100b) 296 " .long 6b,100b\n"
168 _ASM_EXTABLE(9b,100b) 297 " .long 7b,100b\n"
169 _ASM_EXTABLE(10b,100b) 298 " .long 8b,100b\n"
170 _ASM_EXTABLE(11b,100b) 299 " .long 9b,100b\n"
171 _ASM_EXTABLE(12b,100b) 300 " .long 10b,100b\n"
172 _ASM_EXTABLE(13b,100b) 301 " .long 11b,100b\n"
173 _ASM_EXTABLE(14b,100b) 302 " .long 12b,100b\n"
174 _ASM_EXTABLE(15b,100b) 303 " .long 13b,100b\n"
175 _ASM_EXTABLE(16b,100b) 304 " .long 14b,100b\n"
176 _ASM_EXTABLE(17b,100b) 305 " .long 15b,100b\n"
177 _ASM_EXTABLE(18b,100b) 306 " .long 16b,100b\n"
178 _ASM_EXTABLE(19b,100b) 307 " .long 17b,100b\n"
179 _ASM_EXTABLE(20b,100b) 308 " .long 18b,100b\n"
180 _ASM_EXTABLE(21b,100b) 309 " .long 19b,100b\n"
181 _ASM_EXTABLE(22b,100b) 310 " .long 20b,100b\n"
182 _ASM_EXTABLE(23b,100b) 311 " .long 21b,100b\n"
183 _ASM_EXTABLE(24b,100b) 312 " .long 22b,100b\n"
184 _ASM_EXTABLE(25b,100b) 313 " .long 23b,100b\n"
185 _ASM_EXTABLE(26b,100b) 314 " .long 24b,100b\n"
186 _ASM_EXTABLE(27b,100b) 315 " .long 25b,100b\n"
187 _ASM_EXTABLE(28b,100b) 316 " .long 26b,100b\n"
188 _ASM_EXTABLE(29b,100b) 317 " .long 27b,100b\n"
189 _ASM_EXTABLE(30b,100b) 318 " .long 28b,100b\n"
190 _ASM_EXTABLE(31b,100b) 319 " .long 29b,100b\n"
191 _ASM_EXTABLE(32b,100b) 320 " .long 30b,100b\n"
192 _ASM_EXTABLE(33b,100b) 321 " .long 31b,100b\n"
193 _ASM_EXTABLE(34b,100b) 322 " .long 32b,100b\n"
194 _ASM_EXTABLE(35b,100b) 323 " .long 33b,100b\n"
195 _ASM_EXTABLE(36b,100b) 324 " .long 34b,100b\n"
196 _ASM_EXTABLE(37b,100b) 325 " .long 35b,100b\n"
197 _ASM_EXTABLE(99b,101b) 326 " .long 36b,100b\n"
327 " .long 37b,100b\n"
328 " .long 99b,101b\n"
329 ".previous"
198 : "=&c"(size), "=&D" (d0), "=&S" (d1) 330 : "=&c"(size), "=&D" (d0), "=&S" (d1)
199 : "1"(to), "2"(from), "0"(size) 331 : "1"(to), "2"(from), "0"(size)
200 : "eax", "edx", "memory"); 332 : "eax", "edx", "memory");
@@ -267,26 +399,29 @@ __copy_user_zeroing_intel(void *to, const void __user *from, unsigned long size)
267 " popl %0\n" 399 " popl %0\n"
268 " jmp 8b\n" 400 " jmp 8b\n"
269 ".previous\n" 401 ".previous\n"
270 _ASM_EXTABLE(0b,16b) 402 ".section __ex_table,\"a\"\n"
271 _ASM_EXTABLE(1b,16b) 403 " .align 4\n"
272 _ASM_EXTABLE(2b,16b) 404 " .long 0b,16b\n"
273 _ASM_EXTABLE(21b,16b) 405 " .long 1b,16b\n"
274 _ASM_EXTABLE(3b,16b) 406 " .long 2b,16b\n"
275 _ASM_EXTABLE(31b,16b) 407 " .long 21b,16b\n"
276 _ASM_EXTABLE(4b,16b) 408 " .long 3b,16b\n"
277 _ASM_EXTABLE(41b,16b) 409 " .long 31b,16b\n"
278 _ASM_EXTABLE(10b,16b) 410 " .long 4b,16b\n"
279 _ASM_EXTABLE(51b,16b) 411 " .long 41b,16b\n"
280 _ASM_EXTABLE(11b,16b) 412 " .long 10b,16b\n"
281 _ASM_EXTABLE(61b,16b) 413 " .long 51b,16b\n"
282 _ASM_EXTABLE(12b,16b) 414 " .long 11b,16b\n"
283 _ASM_EXTABLE(71b,16b) 415 " .long 61b,16b\n"
284 _ASM_EXTABLE(13b,16b) 416 " .long 12b,16b\n"
285 _ASM_EXTABLE(81b,16b) 417 " .long 71b,16b\n"
286 _ASM_EXTABLE(14b,16b) 418 " .long 13b,16b\n"
287 _ASM_EXTABLE(91b,16b) 419 " .long 81b,16b\n"
288 _ASM_EXTABLE(6b,9b) 420 " .long 14b,16b\n"
289 _ASM_EXTABLE(7b,16b) 421 " .long 91b,16b\n"
422 " .long 6b,9b\n"
423 " .long 7b,16b\n"
424 ".previous"
290 : "=&c"(size), "=&D" (d0), "=&S" (d1) 425 : "=&c"(size), "=&D" (d0), "=&S" (d1)
291 : "1"(to), "2"(from), "0"(size) 426 : "1"(to), "2"(from), "0"(size)
292 : "eax", "edx", "memory"); 427 : "eax", "edx", "memory");
@@ -366,26 +501,29 @@ static unsigned long __copy_user_zeroing_intel_nocache(void *to,
366 " popl %0\n" 501 " popl %0\n"
367 " jmp 8b\n" 502 " jmp 8b\n"
368 ".previous\n" 503 ".previous\n"
369 _ASM_EXTABLE(0b,16b) 504 ".section __ex_table,\"a\"\n"
370 _ASM_EXTABLE(1b,16b) 505 " .align 4\n"
371 _ASM_EXTABLE(2b,16b) 506 " .long 0b,16b\n"
372 _ASM_EXTABLE(21b,16b) 507 " .long 1b,16b\n"
373 _ASM_EXTABLE(3b,16b) 508 " .long 2b,16b\n"
374 _ASM_EXTABLE(31b,16b) 509 " .long 21b,16b\n"
375 _ASM_EXTABLE(4b,16b) 510 " .long 3b,16b\n"
376 _ASM_EXTABLE(41b,16b) 511 " .long 31b,16b\n"
377 _ASM_EXTABLE(10b,16b) 512 " .long 4b,16b\n"
378 _ASM_EXTABLE(51b,16b) 513 " .long 41b,16b\n"
379 _ASM_EXTABLE(11b,16b) 514 " .long 10b,16b\n"
380 _ASM_EXTABLE(61b,16b) 515 " .long 51b,16b\n"
381 _ASM_EXTABLE(12b,16b) 516 " .long 11b,16b\n"
382 _ASM_EXTABLE(71b,16b) 517 " .long 61b,16b\n"
383 _ASM_EXTABLE(13b,16b) 518 " .long 12b,16b\n"
384 _ASM_EXTABLE(81b,16b) 519 " .long 71b,16b\n"
385 _ASM_EXTABLE(14b,16b) 520 " .long 13b,16b\n"
386 _ASM_EXTABLE(91b,16b) 521 " .long 81b,16b\n"
387 _ASM_EXTABLE(6b,9b) 522 " .long 14b,16b\n"
388 _ASM_EXTABLE(7b,16b) 523 " .long 91b,16b\n"
524 " .long 6b,9b\n"
525 " .long 7b,16b\n"
526 ".previous"
389 : "=&c"(size), "=&D" (d0), "=&S" (d1) 527 : "=&c"(size), "=&D" (d0), "=&S" (d1)
390 : "1"(to), "2"(from), "0"(size) 528 : "1"(to), "2"(from), "0"(size)
391 : "eax", "edx", "memory"); 529 : "eax", "edx", "memory");
@@ -454,26 +592,29 @@ static unsigned long __copy_user_intel_nocache(void *to,
454 "9: lea 0(%%eax,%0,4),%0\n" 592 "9: lea 0(%%eax,%0,4),%0\n"
455 "16: jmp 8b\n" 593 "16: jmp 8b\n"
456 ".previous\n" 594 ".previous\n"
457 _ASM_EXTABLE(0b,16b) 595 ".section __ex_table,\"a\"\n"
458 _ASM_EXTABLE(1b,16b) 596 " .align 4\n"
459 _ASM_EXTABLE(2b,16b) 597 " .long 0b,16b\n"
460 _ASM_EXTABLE(21b,16b) 598 " .long 1b,16b\n"
461 _ASM_EXTABLE(3b,16b) 599 " .long 2b,16b\n"
462 _ASM_EXTABLE(31b,16b) 600 " .long 21b,16b\n"
463 _ASM_EXTABLE(4b,16b) 601 " .long 3b,16b\n"
464 _ASM_EXTABLE(41b,16b) 602 " .long 31b,16b\n"
465 _ASM_EXTABLE(10b,16b) 603 " .long 4b,16b\n"
466 _ASM_EXTABLE(51b,16b) 604 " .long 41b,16b\n"
467 _ASM_EXTABLE(11b,16b) 605 " .long 10b,16b\n"
468 _ASM_EXTABLE(61b,16b) 606 " .long 51b,16b\n"
469 _ASM_EXTABLE(12b,16b) 607 " .long 11b,16b\n"
470 _ASM_EXTABLE(71b,16b) 608 " .long 61b,16b\n"
471 _ASM_EXTABLE(13b,16b) 609 " .long 12b,16b\n"
472 _ASM_EXTABLE(81b,16b) 610 " .long 71b,16b\n"
473 _ASM_EXTABLE(14b,16b) 611 " .long 13b,16b\n"
474 _ASM_EXTABLE(91b,16b) 612 " .long 81b,16b\n"
475 _ASM_EXTABLE(6b,9b) 613 " .long 14b,16b\n"
476 _ASM_EXTABLE(7b,16b) 614 " .long 91b,16b\n"
615 " .long 6b,9b\n"
616 " .long 7b,16b\n"
617 ".previous"
477 : "=&c"(size), "=&D" (d0), "=&S" (d1) 618 : "=&c"(size), "=&D" (d0), "=&S" (d1)
478 : "1"(to), "2"(from), "0"(size) 619 : "1"(to), "2"(from), "0"(size)
479 : "eax", "edx", "memory"); 620 : "eax", "edx", "memory");
@@ -520,9 +661,12 @@ do { \
520 "3: lea 0(%3,%0,4),%0\n" \ 661 "3: lea 0(%3,%0,4),%0\n" \
521 " jmp 2b\n" \ 662 " jmp 2b\n" \
522 ".previous\n" \ 663 ".previous\n" \
523 _ASM_EXTABLE(4b,5b) \ 664 ".section __ex_table,\"a\"\n" \
524 _ASM_EXTABLE(0b,3b) \ 665 " .align 4\n" \
525 _ASM_EXTABLE(1b,2b) \ 666 " .long 4b,5b\n" \
667 " .long 0b,3b\n" \
668 " .long 1b,2b\n" \
669 ".previous" \
526 : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2) \ 670 : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2) \
527 : "3"(size), "0"(size), "1"(to), "2"(from) \ 671 : "3"(size), "0"(size), "1"(to), "2"(from) \
528 : "memory"); \ 672 : "memory"); \
@@ -559,9 +703,12 @@ do { \
559 " popl %0\n" \ 703 " popl %0\n" \
560 " jmp 2b\n" \ 704 " jmp 2b\n" \
561 ".previous\n" \ 705 ".previous\n" \
562 _ASM_EXTABLE(4b,5b) \ 706 ".section __ex_table,\"a\"\n" \
563 _ASM_EXTABLE(0b,3b) \ 707 " .align 4\n" \
564 _ASM_EXTABLE(1b,6b) \ 708 " .long 4b,5b\n" \
709 " .long 0b,3b\n" \
710 " .long 1b,6b\n" \
711 ".previous" \
565 : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2) \ 712 : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2) \
566 : "3"(size), "0"(size), "1"(to), "2"(from) \ 713 : "3"(size), "0"(size), "1"(to), "2"(from) \
567 : "memory"); \ 714 : "memory"); \
@@ -570,12 +717,67 @@ do { \
570unsigned long __copy_to_user_ll(void __user *to, const void *from, 717unsigned long __copy_to_user_ll(void __user *to, const void *from,
571 unsigned long n) 718 unsigned long n)
572{ 719{
573 stac(); 720#ifndef CONFIG_X86_WP_WORKS_OK
721 if (unlikely(boot_cpu_data.wp_works_ok == 0) &&
722 ((unsigned long)to) < TASK_SIZE) {
723 /*
724 * When we are in an atomic section (see
725 * mm/filemap.c:file_read_actor), return the full
726 * length to take the slow path.
727 */
728 if (in_atomic())
729 return n;
730
731 /*
732 * CPU does not honor the WP bit when writing
733 * from supervisory mode, and due to preemption or SMP,
734 * the page tables can change at any time.
735 * Do it manually. Manfred <manfred@colorfullife.com>
736 */
737 while (n) {
738 unsigned long offset = ((unsigned long)to)%PAGE_SIZE;
739 unsigned long len = PAGE_SIZE - offset;
740 int retval;
741 struct page *pg;
742 void *maddr;
743
744 if (len > n)
745 len = n;
746
747survive:
748 down_read(&current->mm->mmap_sem);
749 retval = get_user_pages(current, current->mm,
750 (unsigned long)to, 1, 1, 0, &pg, NULL);
751
752 if (retval == -ENOMEM && is_global_init(current)) {
753 up_read(&current->mm->mmap_sem);
754 congestion_wait(BLK_RW_ASYNC, HZ/50);
755 goto survive;
756 }
757
758 if (retval != 1) {
759 up_read(&current->mm->mmap_sem);
760 break;
761 }
762
763 maddr = kmap_atomic(pg, KM_USER0);
764 memcpy(maddr + offset, from, len);
765 kunmap_atomic(maddr, KM_USER0);
766 set_page_dirty_lock(pg);
767 put_page(pg);
768 up_read(&current->mm->mmap_sem);
769
770 from += len;
771 to += len;
772 n -= len;
773 }
774 return n;
775 }
776#endif
574 if (movsl_is_ok(to, from, n)) 777 if (movsl_is_ok(to, from, n))
575 __copy_user(to, from, n); 778 __copy_user(to, from, n);
576 else 779 else
577 n = __copy_user_intel(to, from, n); 780 n = __copy_user_intel(to, from, n);
578 clac();
579 return n; 781 return n;
580} 782}
581EXPORT_SYMBOL(__copy_to_user_ll); 783EXPORT_SYMBOL(__copy_to_user_ll);
@@ -583,12 +785,10 @@ EXPORT_SYMBOL(__copy_to_user_ll);
583unsigned long __copy_from_user_ll(void *to, const void __user *from, 785unsigned long __copy_from_user_ll(void *to, const void __user *from,
584 unsigned long n) 786 unsigned long n)
585{ 787{
586 stac();
587 if (movsl_is_ok(to, from, n)) 788 if (movsl_is_ok(to, from, n))
588 __copy_user_zeroing(to, from, n); 789 __copy_user_zeroing(to, from, n);
589 else 790 else
590 n = __copy_user_zeroing_intel(to, from, n); 791 n = __copy_user_zeroing_intel(to, from, n);
591 clac();
592 return n; 792 return n;
593} 793}
594EXPORT_SYMBOL(__copy_from_user_ll); 794EXPORT_SYMBOL(__copy_from_user_ll);
@@ -596,13 +796,11 @@ EXPORT_SYMBOL(__copy_from_user_ll);
596unsigned long __copy_from_user_ll_nozero(void *to, const void __user *from, 796unsigned long __copy_from_user_ll_nozero(void *to, const void __user *from,
597 unsigned long n) 797 unsigned long n)
598{ 798{
599 stac();
600 if (movsl_is_ok(to, from, n)) 799 if (movsl_is_ok(to, from, n))
601 __copy_user(to, from, n); 800 __copy_user(to, from, n);
602 else 801 else
603 n = __copy_user_intel((void __user *)to, 802 n = __copy_user_intel((void __user *)to,
604 (const void *)from, n); 803 (const void *)from, n);
605 clac();
606 return n; 804 return n;
607} 805}
608EXPORT_SYMBOL(__copy_from_user_ll_nozero); 806EXPORT_SYMBOL(__copy_from_user_ll_nozero);
@@ -610,7 +808,6 @@ EXPORT_SYMBOL(__copy_from_user_ll_nozero);
610unsigned long __copy_from_user_ll_nocache(void *to, const void __user *from, 808unsigned long __copy_from_user_ll_nocache(void *to, const void __user *from,
611 unsigned long n) 809 unsigned long n)
612{ 810{
613 stac();
614#ifdef CONFIG_X86_INTEL_USERCOPY 811#ifdef CONFIG_X86_INTEL_USERCOPY
615 if (n > 64 && cpu_has_xmm2) 812 if (n > 64 && cpu_has_xmm2)
616 n = __copy_user_zeroing_intel_nocache(to, from, n); 813 n = __copy_user_zeroing_intel_nocache(to, from, n);
@@ -619,7 +816,6 @@ unsigned long __copy_from_user_ll_nocache(void *to, const void __user *from,
619#else 816#else
620 __copy_user_zeroing(to, from, n); 817 __copy_user_zeroing(to, from, n);
621#endif 818#endif
622 clac();
623 return n; 819 return n;
624} 820}
625EXPORT_SYMBOL(__copy_from_user_ll_nocache); 821EXPORT_SYMBOL(__copy_from_user_ll_nocache);
@@ -627,7 +823,6 @@ EXPORT_SYMBOL(__copy_from_user_ll_nocache);
627unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *from, 823unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *from,
628 unsigned long n) 824 unsigned long n)
629{ 825{
630 stac();
631#ifdef CONFIG_X86_INTEL_USERCOPY 826#ifdef CONFIG_X86_INTEL_USERCOPY
632 if (n > 64 && cpu_has_xmm2) 827 if (n > 64 && cpu_has_xmm2)
633 n = __copy_user_intel_nocache(to, from, n); 828 n = __copy_user_intel_nocache(to, from, n);
@@ -636,7 +831,6 @@ unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *fr
636#else 831#else
637 __copy_user(to, from, n); 832 __copy_user(to, from, n);
638#endif 833#endif
639 clac();
640 return n; 834 return n;
641} 835}
642EXPORT_SYMBOL(__copy_from_user_ll_nocache_nozero); 836EXPORT_SYMBOL(__copy_from_user_ll_nocache_nozero);
diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c
index 05928aae911..b7c2849ffb6 100644
--- a/arch/x86/lib/usercopy_64.c
+++ b/arch/x86/lib/usercopy_64.c
@@ -9,6 +9,55 @@
9#include <asm/uaccess.h> 9#include <asm/uaccess.h>
10 10
11/* 11/*
12 * Copy a null terminated string from userspace.
13 */
14
15#define __do_strncpy_from_user(dst,src,count,res) \
16do { \
17 long __d0, __d1, __d2; \
18 might_fault(); \
19 __asm__ __volatile__( \
20 " testq %1,%1\n" \
21 " jz 2f\n" \
22 "0: lodsb\n" \
23 " stosb\n" \
24 " testb %%al,%%al\n" \
25 " jz 1f\n" \
26 " decq %1\n" \
27 " jnz 0b\n" \
28 "1: subq %1,%0\n" \
29 "2:\n" \
30 ".section .fixup,\"ax\"\n" \
31 "3: movq %5,%0\n" \
32 " jmp 2b\n" \
33 ".previous\n" \
34 _ASM_EXTABLE(0b,3b) \
35 : "=&r"(res), "=&c"(count), "=&a" (__d0), "=&S" (__d1), \
36 "=&D" (__d2) \
37 : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
38 : "memory"); \
39} while (0)
40
41long
42__strncpy_from_user(char *dst, const char __user *src, long count)
43{
44 long res;
45 __do_strncpy_from_user(dst, src, count, res);
46 return res;
47}
48EXPORT_SYMBOL(__strncpy_from_user);
49
50long
51strncpy_from_user(char *dst, const char __user *src, long count)
52{
53 long res = -EFAULT;
54 if (access_ok(VERIFY_READ, src, 1))
55 return __strncpy_from_user(dst, src, count);
56 return res;
57}
58EXPORT_SYMBOL(strncpy_from_user);
59
60/*
12 * Zero Userspace 61 * Zero Userspace
13 */ 62 */
14 63
@@ -18,7 +67,6 @@ unsigned long __clear_user(void __user *addr, unsigned long size)
18 might_fault(); 67 might_fault();
19 /* no memory constraint because it doesn't change any memory gcc knows 68 /* no memory constraint because it doesn't change any memory gcc knows
20 about */ 69 about */
21 stac();
22 asm volatile( 70 asm volatile(
23 " testq %[size8],%[size8]\n" 71 " testq %[size8],%[size8]\n"
24 " jz 4f\n" 72 " jz 4f\n"
@@ -41,7 +89,6 @@ unsigned long __clear_user(void __user *addr, unsigned long size)
41 : [size8] "=&c"(size), [dst] "=&D" (__d0) 89 : [size8] "=&c"(size), [dst] "=&D" (__d0)
42 : [size1] "r"(size & 7), "[size8]" (size / 8), "[dst]"(addr), 90 : [size1] "r"(size & 7), "[size8]" (size / 8), "[dst]"(addr),
43 [zero] "r" (0UL), [eight] "r" (8UL)); 91 [zero] "r" (0UL), [eight] "r" (8UL));
44 clac();
45 return size; 92 return size;
46} 93}
47EXPORT_SYMBOL(__clear_user); 94EXPORT_SYMBOL(__clear_user);
@@ -54,6 +101,54 @@ unsigned long clear_user(void __user *to, unsigned long n)
54} 101}
55EXPORT_SYMBOL(clear_user); 102EXPORT_SYMBOL(clear_user);
56 103
104/*
105 * Return the size of a string (including the ending 0)
106 *
107 * Return 0 on exception, a value greater than N if too long
108 */
109
110long __strnlen_user(const char __user *s, long n)
111{
112 long res = 0;
113 char c;
114
115 while (1) {
116 if (res>n)
117 return n+1;
118 if (__get_user(c, s))
119 return 0;
120 if (!c)
121 return res+1;
122 res++;
123 s++;
124 }
125}
126EXPORT_SYMBOL(__strnlen_user);
127
128long strnlen_user(const char __user *s, long n)
129{
130 if (!access_ok(VERIFY_READ, s, 1))
131 return 0;
132 return __strnlen_user(s, n);
133}
134EXPORT_SYMBOL(strnlen_user);
135
136long strlen_user(const char __user *s)
137{
138 long res = 0;
139 char c;
140
141 for (;;) {
142 if (get_user(c, s))
143 return 0;
144 if (!c)
145 return res+1;
146 res++;
147 s++;
148 }
149}
150EXPORT_SYMBOL(strlen_user);
151
57unsigned long copy_in_user(void __user *to, const void __user *from, unsigned len) 152unsigned long copy_in_user(void __user *to, const void __user *from, unsigned len)
58{ 153{
59 if (access_ok(VERIFY_WRITE, to, len) && access_ok(VERIFY_READ, from, len)) { 154 if (access_ok(VERIFY_WRITE, to, len) && access_ok(VERIFY_READ, from, len)) {
@@ -84,6 +179,5 @@ copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest)
84 for (c = 0, zero_len = len; zerorest && zero_len; --zero_len) 179 for (c = 0, zero_len = len; zerorest && zero_len; --zero_len)
85 if (__put_user_nocheck(c, to++, sizeof(char))) 180 if (__put_user_nocheck(c, to++, sizeof(char)))
86 break; 181 break;
87 clac();
88 return len; 182 return len;
89} 183}
diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt
index 5d7e51f3fd2..a793da5e560 100644
--- a/arch/x86/lib/x86-opcode-map.txt
+++ b/arch/x86/lib/x86-opcode-map.txt
@@ -1,11 +1,5 @@
1# x86 Opcode Maps 1# x86 Opcode Maps
2# 2#
3# This is (mostly) based on following documentations.
4# - Intel(R) 64 and IA-32 Architectures Software Developer's Manual Vol.2
5# (#325383-040US, October 2011)
6# - Intel(R) Advanced Vector Extensions Programming Reference
7# (#319433-011,JUNE 2011).
8#
9#<Opcode maps> 3#<Opcode maps>
10# Table: table-name 4# Table: table-name
11# Referrer: escaped-name 5# Referrer: escaped-name
@@ -21,14 +15,11 @@
21# EndTable 15# EndTable
22# 16#
23# AVX Superscripts 17# AVX Superscripts
24# (v): this opcode requires VEX prefix. 18# (VEX): this opcode can accept VEX prefix.
25# (v1): this opcode only supports 128bit VEX. 19# (oVEX): this opcode requires VEX prefix.
20# (o128): this opcode only supports 128bit VEX.
21# (o256): this opcode only supports 256bit VEX.
26# 22#
27# Last Prefix Superscripts
28# - (66): the last prefix is 0x66
29# - (F3): the last prefix is 0xF3
30# - (F2): the last prefix is 0xF2
31# - (!F3) : the last prefix is not 0xF3 (including non-last prefix case)
32 23
33Table: one byte opcode 24Table: one byte opcode
34Referrer: 25Referrer:
@@ -208,8 +199,8 @@ a0: MOV AL,Ob
208a1: MOV rAX,Ov 199a1: MOV rAX,Ov
209a2: MOV Ob,AL 200a2: MOV Ob,AL
210a3: MOV Ov,rAX 201a3: MOV Ov,rAX
211a4: MOVS/B Yb,Xb 202a4: MOVS/B Xb,Yb
212a5: MOVS/W/D/Q Yv,Xv 203a5: MOVS/W/D/Q Xv,Yv
213a6: CMPS/B Xb,Yb 204a6: CMPS/B Xb,Yb
214a7: CMPS/W/D Xv,Yv 205a7: CMPS/W/D Xv,Yv
215a8: TEST AL,Ib 206a8: TEST AL,Ib
@@ -219,9 +210,7 @@ ab: STOS/W/D/Q Yv,rAX
219ac: LODS/B AL,Xb 210ac: LODS/B AL,Xb
220ad: LODS/W/D/Q rAX,Xv 211ad: LODS/W/D/Q rAX,Xv
221ae: SCAS/B AL,Yb 212ae: SCAS/B AL,Yb
222# Note: The May 2011 Intel manual shows Xv for the second parameter of the 213af: SCAS/W/D/Q rAX,Xv
223# next instruction but Yv is correct
224af: SCAS/W/D/Q rAX,Yv
225# 0xb0 - 0xbf 214# 0xb0 - 0xbf
226b0: MOV AL/R8L,Ib 215b0: MOV AL/R8L,Ib
227b1: MOV CL/R9L,Ib 216b1: MOV CL/R9L,Ib
@@ -244,8 +233,8 @@ c0: Grp2 Eb,Ib (1A)
244c1: Grp2 Ev,Ib (1A) 233c1: Grp2 Ev,Ib (1A)
245c2: RETN Iw (f64) 234c2: RETN Iw (f64)
246c3: RETN 235c3: RETN
247c4: LES Gz,Mp (i64) | VEX+2byte (Prefix) 236c4: LES Gz,Mp (i64) | 3bytes-VEX (Prefix)
248c5: LDS Gz,Mp (i64) | VEX+1byte (Prefix) 237c5: LDS Gz,Mp (i64) | 2bytes-VEX (Prefix)
249c6: Grp11 Eb,Ib (1A) 238c6: Grp11 Eb,Ib (1A)
250c7: Grp11 Ev,Iz (1A) 239c7: Grp11 Ev,Iz (1A)
251c8: ENTER Iw,Ib 240c8: ENTER Iw,Ib
@@ -331,19 +320,14 @@ AVXcode: 1
331# 3DNow! uses the last imm byte as opcode extension. 320# 3DNow! uses the last imm byte as opcode extension.
3320f: 3DNow! Pq,Qq,Ib 3210f: 3DNow! Pq,Qq,Ib
333# 0x0f 0x10-0x1f 322# 0x0f 0x10-0x1f
334# NOTE: According to Intel SDM opcode map, vmovups and vmovupd has no operands 32310: movups Vps,Wps (VEX) | movss Vss,Wss (F3),(VEX),(o128) | movupd Vpd,Wpd (66),(VEX) | movsd Vsd,Wsd (F2),(VEX),(o128)
335# but it actually has operands. And also, vmovss and vmovsd only accept 128bit. 32411: movups Wps,Vps (VEX) | movss Wss,Vss (F3),(VEX),(o128) | movupd Wpd,Vpd (66),(VEX) | movsd Wsd,Vsd (F2),(VEX),(o128)
336# MOVSS/MOVSD has too many forms(3) on SDM. This map just shows a typical form. 32512: movlps Vq,Mq (VEX),(o128) | movlpd Vq,Mq (66),(VEX),(o128) | movhlps Vq,Uq (VEX),(o128) | movddup Vq,Wq (F2),(VEX) | movsldup Vq,Wq (F3),(VEX)
337# Many AVX instructions lack v1 superscript, according to Intel AVX-Prgramming 32613: mpvlps Mq,Vq (VEX),(o128) | movlpd Mq,Vq (66),(VEX),(o128)
338# Reference A.1 32714: unpcklps Vps,Wq (VEX) | unpcklpd Vpd,Wq (66),(VEX)
33910: vmovups Vps,Wps | vmovupd Vpd,Wpd (66) | vmovss Vx,Hx,Wss (F3),(v1) | vmovsd Vx,Hx,Wsd (F2),(v1) 32815: unpckhps Vps,Wq (VEX) | unpckhpd Vpd,Wq (66),(VEX)
34011: vmovups Wps,Vps | vmovupd Wpd,Vpd (66) | vmovss Wss,Hx,Vss (F3),(v1) | vmovsd Wsd,Hx,Vsd (F2),(v1) 32916: movhps Vq,Mq (VEX),(o128) | movhpd Vq,Mq (66),(VEX),(o128) | movlsps Vq,Uq (VEX),(o128) | movshdup Vq,Wq (F3),(VEX)
34112: vmovlps Vq,Hq,Mq (v1) | vmovhlps Vq,Hq,Uq (v1) | vmovlpd Vq,Hq,Mq (66),(v1) | vmovsldup Vx,Wx (F3) | vmovddup Vx,Wx (F2) 33017: movhps Mq,Vq (VEX),(o128) | movhpd Mq,Vq (66),(VEX),(o128)
34213: vmovlps Mq,Vq (v1) | vmovlpd Mq,Vq (66),(v1)
34314: vunpcklps Vx,Hx,Wx | vunpcklpd Vx,Hx,Wx (66)
34415: vunpckhps Vx,Hx,Wx | vunpckhpd Vx,Hx,Wx (66)
34516: vmovhps Vdq,Hq,Mq (v1) | vmovlhps Vdq,Hq,Uq (v1) | vmovhpd Vdq,Hq,Mq (66),(v1) | vmovshdup Vx,Wx (F3)
34617: vmovhps Mq,Vq (v1) | vmovhpd Mq,Vq (66),(v1)
34718: Grp16 (1A) 33118: Grp16 (1A)
34819: 33219:
3491a: 3331a:
@@ -361,14 +345,14 @@ AVXcode: 1
36125: 34525:
36226: 34626:
36327: 34727:
36428: vmovaps Vps,Wps | vmovapd Vpd,Wpd (66) 34828: movaps Vps,Wps (VEX) | movapd Vpd,Wpd (66),(VEX)
36529: vmovaps Wps,Vps | vmovapd Wpd,Vpd (66) 34929: movaps Wps,Vps (VEX) | movapd Wpd,Vpd (66),(VEX)
3662a: cvtpi2ps Vps,Qpi | cvtpi2pd Vpd,Qpi (66) | vcvtsi2ss Vss,Hss,Ey (F3),(v1) | vcvtsi2sd Vsd,Hsd,Ey (F2),(v1) 3502a: cvtpi2ps Vps,Qpi | cvtsi2ss Vss,Ed/q (F3),(VEX),(o128) | cvtpi2pd Vpd,Qpi (66) | cvtsi2sd Vsd,Ed/q (F2),(VEX),(o128)
3672b: vmovntps Mps,Vps | vmovntpd Mpd,Vpd (66) 3512b: movntps Mps,Vps (VEX) | movntpd Mpd,Vpd (66),(VEX)
3682c: cvttps2pi Ppi,Wps | cvttpd2pi Ppi,Wpd (66) | vcvttss2si Gy,Wss (F3),(v1) | vcvttsd2si Gy,Wsd (F2),(v1) 3522c: cvttps2pi Ppi,Wps | cvttss2si Gd/q,Wss (F3),(VEX),(o128) | cvttpd2pi Ppi,Wpd (66) | cvttsd2si Gd/q,Wsd (F2),(VEX),(o128)
3692d: cvtps2pi Ppi,Wps | cvtpd2pi Qpi,Wpd (66) | vcvtss2si Gy,Wss (F3),(v1) | vcvtsd2si Gy,Wsd (F2),(v1) 3532d: cvtps2pi Ppi,Wps | cvtss2si Gd/q,Wss (F3),(VEX),(o128) | cvtpd2pi Qpi,Wpd (66) | cvtsd2si Gd/q,Wsd (F2),(VEX),(o128)
3702e: vucomiss Vss,Wss (v1) | vucomisd Vsd,Wsd (66),(v1) 3542e: ucomiss Vss,Wss (VEX),(o128) | ucomisd Vsd,Wsd (66),(VEX),(o128)
3712f: vcomiss Vss,Wss (v1) | vcomisd Vsd,Wsd (66),(v1) 3552f: comiss Vss,Wss (VEX),(o128) | comisd Vsd,Wsd (66),(VEX),(o128)
372# 0x0f 0x30-0x3f 356# 0x0f 0x30-0x3f
37330: WRMSR 35730: WRMSR
37431: RDTSC 35831: RDTSC
@@ -404,66 +388,65 @@ AVXcode: 1
4044e: CMOVLE/NG Gv,Ev 3884e: CMOVLE/NG Gv,Ev
4054f: CMOVNLE/G Gv,Ev 3894f: CMOVNLE/G Gv,Ev
406# 0x0f 0x50-0x5f 390# 0x0f 0x50-0x5f
40750: vmovmskps Gy,Ups | vmovmskpd Gy,Upd (66) 39150: movmskps Gd/q,Ups (VEX) | movmskpd Gd/q,Upd (66),(VEX)
40851: vsqrtps Vps,Wps | vsqrtpd Vpd,Wpd (66) | vsqrtss Vss,Hss,Wss (F3),(v1) | vsqrtsd Vsd,Hsd,Wsd (F2),(v1) 39251: sqrtps Vps,Wps (VEX) | sqrtss Vss,Wss (F3),(VEX),(o128) | sqrtpd Vpd,Wpd (66),(VEX) | sqrtsd Vsd,Wsd (F2),(VEX),(o128)
40952: vrsqrtps Vps,Wps | vrsqrtss Vss,Hss,Wss (F3),(v1) 39352: rsqrtps Vps,Wps (VEX) | rsqrtss Vss,Wss (F3),(VEX),(o128)
41053: vrcpps Vps,Wps | vrcpss Vss,Hss,Wss (F3),(v1) 39453: rcpps Vps,Wps (VEX) | rcpss Vss,Wss (F3),(VEX),(o128)
41154: vandps Vps,Hps,Wps | vandpd Vpd,Hpd,Wpd (66) 39554: andps Vps,Wps (VEX) | andpd Vpd,Wpd (66),(VEX)
41255: vandnps Vps,Hps,Wps | vandnpd Vpd,Hpd,Wpd (66) 39655: andnps Vps,Wps (VEX) | andnpd Vpd,Wpd (66),(VEX)
41356: vorps Vps,Hps,Wps | vorpd Vpd,Hpd,Wpd (66) 39756: orps Vps,Wps (VEX) | orpd Vpd,Wpd (66),(VEX)
41457: vxorps Vps,Hps,Wps | vxorpd Vpd,Hpd,Wpd (66) 39857: xorps Vps,Wps (VEX) | xorpd Vpd,Wpd (66),(VEX)
41558: vaddps Vps,Hps,Wps | vaddpd Vpd,Hpd,Wpd (66) | vaddss Vss,Hss,Wss (F3),(v1) | vaddsd Vsd,Hsd,Wsd (F2),(v1) 39958: addps Vps,Wps (VEX) | addss Vss,Wss (F3),(VEX),(o128) | addpd Vpd,Wpd (66),(VEX) | addsd Vsd,Wsd (F2),(VEX),(o128)
41659: vmulps Vps,Hps,Wps | vmulpd Vpd,Hpd,Wpd (66) | vmulss Vss,Hss,Wss (F3),(v1) | vmulsd Vsd,Hsd,Wsd (F2),(v1) 40059: mulps Vps,Wps (VEX) | mulss Vss,Wss (F3),(VEX),(o128) | mulpd Vpd,Wpd (66),(VEX) | mulsd Vsd,Wsd (F2),(VEX),(o128)
4175a: vcvtps2pd Vpd,Wps | vcvtpd2ps Vps,Wpd (66) | vcvtss2sd Vsd,Hx,Wss (F3),(v1) | vcvtsd2ss Vss,Hx,Wsd (F2),(v1) 4015a: cvtps2pd Vpd,Wps (VEX) | cvtss2sd Vsd,Wss (F3),(VEX),(o128) | cvtpd2ps Vps,Wpd (66),(VEX) | cvtsd2ss Vsd,Wsd (F2),(VEX),(o128)
4185b: vcvtdq2ps Vps,Wdq | vcvtps2dq Vdq,Wps (66) | vcvttps2dq Vdq,Wps (F3) 4025b: cvtdq2ps Vps,Wdq (VEX) | cvtps2dq Vdq,Wps (66),(VEX) | cvttps2dq Vdq,Wps (F3),(VEX)
4195c: vsubps Vps,Hps,Wps | vsubpd Vpd,Hpd,Wpd (66) | vsubss Vss,Hss,Wss (F3),(v1) | vsubsd Vsd,Hsd,Wsd (F2),(v1) 4035c: subps Vps,Wps (VEX) | subss Vss,Wss (F3),(VEX),(o128) | subpd Vpd,Wpd (66),(VEX) | subsd Vsd,Wsd (F2),(VEX),(o128)
4205d: vminps Vps,Hps,Wps | vminpd Vpd,Hpd,Wpd (66) | vminss Vss,Hss,Wss (F3),(v1) | vminsd Vsd,Hsd,Wsd (F2),(v1) 4045d: minps Vps,Wps (VEX) | minss Vss,Wss (F3),(VEX),(o128) | minpd Vpd,Wpd (66),(VEX) | minsd Vsd,Wsd (F2),(VEX),(o128)
4215e: vdivps Vps,Hps,Wps | vdivpd Vpd,Hpd,Wpd (66) | vdivss Vss,Hss,Wss (F3),(v1) | vdivsd Vsd,Hsd,Wsd (F2),(v1) 4055e: divps Vps,Wps (VEX) | divss Vss,Wss (F3),(VEX),(o128) | divpd Vpd,Wpd (66),(VEX) | divsd Vsd,Wsd (F2),(VEX),(o128)
4225f: vmaxps Vps,Hps,Wps | vmaxpd Vpd,Hpd,Wpd (66) | vmaxss Vss,Hss,Wss (F3),(v1) | vmaxsd Vsd,Hsd,Wsd (F2),(v1) 4065f: maxps Vps,Wps (VEX) | maxss Vss,Wss (F3),(VEX),(o128) | maxpd Vpd,Wpd (66),(VEX) | maxsd Vsd,Wsd (F2),(VEX),(o128)
423# 0x0f 0x60-0x6f 407# 0x0f 0x60-0x6f
42460: punpcklbw Pq,Qd | vpunpcklbw Vx,Hx,Wx (66),(v1) 40860: punpcklbw Pq,Qd | punpcklbw Vdq,Wdq (66),(VEX),(o128)
42561: punpcklwd Pq,Qd | vpunpcklwd Vx,Hx,Wx (66),(v1) 40961: punpcklwd Pq,Qd | punpcklwd Vdq,Wdq (66),(VEX),(o128)
42662: punpckldq Pq,Qd | vpunpckldq Vx,Hx,Wx (66),(v1) 41062: punpckldq Pq,Qd | punpckldq Vdq,Wdq (66),(VEX),(o128)
42763: packsswb Pq,Qq | vpacksswb Vx,Hx,Wx (66),(v1) 41163: packsswb Pq,Qq | packsswb Vdq,Wdq (66),(VEX),(o128)
42864: pcmpgtb Pq,Qq | vpcmpgtb Vx,Hx,Wx (66),(v1) 41264: pcmpgtb Pq,Qq | pcmpgtb Vdq,Wdq (66),(VEX),(o128)
42965: pcmpgtw Pq,Qq | vpcmpgtw Vx,Hx,Wx (66),(v1) 41365: pcmpgtw Pq,Qq | pcmpgtw Vdq,Wdq (66),(VEX),(o128)
43066: pcmpgtd Pq,Qq | vpcmpgtd Vx,Hx,Wx (66),(v1) 41466: pcmpgtd Pq,Qq | pcmpgtd Vdq,Wdq (66),(VEX),(o128)
43167: packuswb Pq,Qq | vpackuswb Vx,Hx,Wx (66),(v1) 41567: packuswb Pq,Qq | packuswb Vdq,Wdq (66),(VEX),(o128)
43268: punpckhbw Pq,Qd | vpunpckhbw Vx,Hx,Wx (66),(v1) 41668: punpckhbw Pq,Qd | punpckhbw Vdq,Wdq (66),(VEX),(o128)
43369: punpckhwd Pq,Qd | vpunpckhwd Vx,Hx,Wx (66),(v1) 41769: punpckhwd Pq,Qd | punpckhwd Vdq,Wdq (66),(VEX),(o128)
4346a: punpckhdq Pq,Qd | vpunpckhdq Vx,Hx,Wx (66),(v1) 4186a: punpckhdq Pq,Qd | punpckhdq Vdq,Wdq (66),(VEX),(o128)
4356b: packssdw Pq,Qd | vpackssdw Vx,Hx,Wx (66),(v1) 4196b: packssdw Pq,Qd | packssdw Vdq,Wdq (66),(VEX),(o128)
4366c: vpunpcklqdq Vx,Hx,Wx (66),(v1) 4206c: punpcklqdq Vdq,Wdq (66),(VEX),(o128)
4376d: vpunpckhqdq Vx,Hx,Wx (66),(v1) 4216d: punpckhqdq Vdq,Wdq (66),(VEX),(o128)
4386e: movd/q Pd,Ey | vmovd/q Vy,Ey (66),(v1) 4226e: movd/q/ Pd,Ed/q | movd/q Vdq,Ed/q (66),(VEX),(o128)
4396f: movq Pq,Qq | vmovdqa Vx,Wx (66) | vmovdqu Vx,Wx (F3) 4236f: movq Pq,Qq | movdqa Vdq,Wdq (66),(VEX) | movdqu Vdq,Wdq (F3),(VEX)
440# 0x0f 0x70-0x7f 424# 0x0f 0x70-0x7f
44170: pshufw Pq,Qq,Ib | vpshufd Vx,Wx,Ib (66),(v1) | vpshufhw Vx,Wx,Ib (F3),(v1) | vpshuflw Vx,Wx,Ib (F2),(v1) 42570: pshufw Pq,Qq,Ib | pshufd Vdq,Wdq,Ib (66),(VEX),(o128) | pshufhw Vdq,Wdq,Ib (F3),(VEX),(o128) | pshuflw VdqWdq,Ib (F2),(VEX),(o128)
44271: Grp12 (1A) 42671: Grp12 (1A)
44372: Grp13 (1A) 42772: Grp13 (1A)
44473: Grp14 (1A) 42873: Grp14 (1A)
44574: pcmpeqb Pq,Qq | vpcmpeqb Vx,Hx,Wx (66),(v1) 42974: pcmpeqb Pq,Qq | pcmpeqb Vdq,Wdq (66),(VEX),(o128)
44675: pcmpeqw Pq,Qq | vpcmpeqw Vx,Hx,Wx (66),(v1) 43075: pcmpeqw Pq,Qq | pcmpeqw Vdq,Wdq (66),(VEX),(o128)
44776: pcmpeqd Pq,Qq | vpcmpeqd Vx,Hx,Wx (66),(v1) 43176: pcmpeqd Pq,Qq | pcmpeqd Vdq,Wdq (66),(VEX),(o128)
448# Note: Remove (v), because vzeroall and vzeroupper becomes emms without VEX. 43277: emms/vzeroupper/vzeroall (VEX)
44977: emms | vzeroupper | vzeroall 43378: VMREAD Ed/q,Gd/q
45078: VMREAD Ey,Gy 43479: VMWRITE Gd/q,Ed/q
45179: VMWRITE Gy,Ey
4527a: 4357a:
4537b: 4367b:
4547c: vhaddpd Vpd,Hpd,Wpd (66) | vhaddps Vps,Hps,Wps (F2) 4377c: haddps Vps,Wps (F2),(VEX) | haddpd Vpd,Wpd (66),(VEX)
4557d: vhsubpd Vpd,Hpd,Wpd (66) | vhsubps Vps,Hps,Wps (F2) 4387d: hsubps Vps,Wps (F2),(VEX) | hsubpd Vpd,Wpd (66),(VEX)
4567e: movd/q Ey,Pd | vmovd/q Ey,Vy (66),(v1) | vmovq Vq,Wq (F3),(v1) 4397e: movd/q Ed/q,Pd | movd/q Ed/q,Vdq (66),(VEX),(o128) | movq Vq,Wq (F3),(VEX),(o128)
4577f: movq Qq,Pq | vmovdqa Wx,Vx (66) | vmovdqu Wx,Vx (F3) 4407f: movq Qq,Pq | movdqa Wdq,Vdq (66),(VEX) | movdqu Wdq,Vdq (F3),(VEX)
458# 0x0f 0x80-0x8f 441# 0x0f 0x80-0x8f
45980: JO Jz (f64) 44280: JO Jz (f64)
46081: JNO Jz (f64) 44381: JNO Jz (f64)
46182: JB/JC/JNAE Jz (f64) 44482: JB/JNAE/JC Jz (f64)
46283: JAE/JNB/JNC Jz (f64) 44583: JNB/JAE/JNC Jz (f64)
46384: JE/JZ Jz (f64) 44684: JZ/JE Jz (f64)
46485: JNE/JNZ Jz (f64) 44785: JNZ/JNE Jz (f64)
46586: JBE/JNA Jz (f64) 44886: JBE/JNA Jz (f64)
46687: JA/JNBE Jz (f64) 44987: JNBE/JA Jz (f64)
46788: JS Jz (f64) 45088: JS Jz (f64)
46889: JNS Jz (f64) 45189: JNS Jz (f64)
4698a: JP/JPE Jz (f64) 4528a: JP/JPE Jz (f64)
@@ -515,22 +498,22 @@ b4: LFS Gv,Mp
515b5: LGS Gv,Mp 498b5: LGS Gv,Mp
516b6: MOVZX Gv,Eb 499b6: MOVZX Gv,Eb
517b7: MOVZX Gv,Ew 500b7: MOVZX Gv,Ew
518b8: JMPE (!F3) | POPCNT Gv,Ev (F3) 501b8: JMPE | POPCNT Gv,Ev (F3)
519b9: Grp10 (1A) 502b9: Grp10 (1A)
520ba: Grp8 Ev,Ib (1A) 503ba: Grp8 Ev,Ib (1A)
521bb: BTC Ev,Gv 504bb: BTC Ev,Gv
522bc: BSF Gv,Ev (!F3) | TZCNT Gv,Ev (F3) 505bc: BSF Gv,Ev
523bd: BSR Gv,Ev (!F3) | LZCNT Gv,Ev (F3) 506bd: BSR Gv,Ev
524be: MOVSX Gv,Eb 507be: MOVSX Gv,Eb
525bf: MOVSX Gv,Ew 508bf: MOVSX Gv,Ew
526# 0x0f 0xc0-0xcf 509# 0x0f 0xc0-0xcf
527c0: XADD Eb,Gb 510c0: XADD Eb,Gb
528c1: XADD Ev,Gv 511c1: XADD Ev,Gv
529c2: vcmpps Vps,Hps,Wps,Ib | vcmppd Vpd,Hpd,Wpd,Ib (66) | vcmpss Vss,Hss,Wss,Ib (F3),(v1) | vcmpsd Vsd,Hsd,Wsd,Ib (F2),(v1) 512c2: cmpps Vps,Wps,Ib (VEX) | cmpss Vss,Wss,Ib (F3),(VEX),(o128) | cmppd Vpd,Wpd,Ib (66),(VEX) | cmpsd Vsd,Wsd,Ib (F2),(VEX)
530c3: movnti My,Gy 513c3: movnti Md/q,Gd/q
531c4: pinsrw Pq,Ry/Mw,Ib | vpinsrw Vdq,Hdq,Ry/Mw,Ib (66),(v1) 514c4: pinsrw Pq,Rd/q/Mw,Ib | pinsrw Vdq,Rd/q/Mw,Ib (66),(VEX),(o128)
532c5: pextrw Gd,Nq,Ib | vpextrw Gd,Udq,Ib (66),(v1) 515c5: pextrw Gd,Nq,Ib | pextrw Gd,Udq,Ib (66),(VEX),(o128)
533c6: vshufps Vps,Hps,Wps,Ib | vshufpd Vpd,Hpd,Wpd,Ib (66) 516c6: shufps Vps,Wps,Ib (VEX) | shufpd Vpd,Wpd,Ib (66),(VEX)
534c7: Grp9 (1A) 517c7: Grp9 (1A)
535c8: BSWAP RAX/EAX/R8/R8D 518c8: BSWAP RAX/EAX/R8/R8D
536c9: BSWAP RCX/ECX/R9/R9D 519c9: BSWAP RCX/ECX/R9/R9D
@@ -541,55 +524,55 @@ cd: BSWAP RBP/EBP/R13/R13D
541ce: BSWAP RSI/ESI/R14/R14D 524ce: BSWAP RSI/ESI/R14/R14D
542cf: BSWAP RDI/EDI/R15/R15D 525cf: BSWAP RDI/EDI/R15/R15D
543# 0x0f 0xd0-0xdf 526# 0x0f 0xd0-0xdf
544d0: vaddsubpd Vpd,Hpd,Wpd (66) | vaddsubps Vps,Hps,Wps (F2) 527d0: addsubps Vps,Wps (F2),(VEX) | addsubpd Vpd,Wpd (66),(VEX)
545d1: psrlw Pq,Qq | vpsrlw Vx,Hx,Wx (66),(v1) 528d1: psrlw Pq,Qq | psrlw Vdq,Wdq (66),(VEX),(o128)
546d2: psrld Pq,Qq | vpsrld Vx,Hx,Wx (66),(v1) 529d2: psrld Pq,Qq | psrld Vdq,Wdq (66),(VEX),(o128)
547d3: psrlq Pq,Qq | vpsrlq Vx,Hx,Wx (66),(v1) 530d3: psrlq Pq,Qq | psrlq Vdq,Wdq (66),(VEX),(o128)
548d4: paddq Pq,Qq | vpaddq Vx,Hx,Wx (66),(v1) 531d4: paddq Pq,Qq | paddq Vdq,Wdq (66),(VEX),(o128)
549d5: pmullw Pq,Qq | vpmullw Vx,Hx,Wx (66),(v1) 532d5: pmullw Pq,Qq | pmullw Vdq,Wdq (66),(VEX),(o128)
550d6: vmovq Wq,Vq (66),(v1) | movq2dq Vdq,Nq (F3) | movdq2q Pq,Uq (F2) 533d6: movq Wq,Vq (66),(VEX),(o128) | movq2dq Vdq,Nq (F3) | movdq2q Pq,Uq (F2)
551d7: pmovmskb Gd,Nq | vpmovmskb Gd,Ux (66),(v1) 534d7: pmovmskb Gd,Nq | pmovmskb Gd,Udq (66),(VEX),(o128)
552d8: psubusb Pq,Qq | vpsubusb Vx,Hx,Wx (66),(v1) 535d8: psubusb Pq,Qq | psubusb Vdq,Wdq (66),(VEX),(o128)
553d9: psubusw Pq,Qq | vpsubusw Vx,Hx,Wx (66),(v1) 536d9: psubusw Pq,Qq | psubusw Vdq,Wdq (66),(VEX),(o128)
554da: pminub Pq,Qq | vpminub Vx,Hx,Wx (66),(v1) 537da: pminub Pq,Qq | pminub Vdq,Wdq (66),(VEX),(o128)
555db: pand Pq,Qq | vpand Vx,Hx,Wx (66),(v1) 538db: pand Pq,Qq | pand Vdq,Wdq (66),(VEX),(o128)
556dc: paddusb Pq,Qq | vpaddusb Vx,Hx,Wx (66),(v1) 539dc: paddusb Pq,Qq | paddusb Vdq,Wdq (66),(VEX),(o128)
557dd: paddusw Pq,Qq | vpaddusw Vx,Hx,Wx (66),(v1) 540dd: paddusw Pq,Qq | paddusw Vdq,Wdq (66),(VEX),(o128)
558de: pmaxub Pq,Qq | vpmaxub Vx,Hx,Wx (66),(v1) 541de: pmaxub Pq,Qq | pmaxub Vdq,Wdq (66),(VEX),(o128)
559df: pandn Pq,Qq | vpandn Vx,Hx,Wx (66),(v1) 542df: pandn Pq,Qq | pandn Vdq,Wdq (66),(VEX),(o128)
560# 0x0f 0xe0-0xef 543# 0x0f 0xe0-0xef
561e0: pavgb Pq,Qq | vpavgb Vx,Hx,Wx (66),(v1) 544e0: pavgb Pq,Qq | pavgb Vdq,Wdq (66),(VEX),(o128)
562e1: psraw Pq,Qq | vpsraw Vx,Hx,Wx (66),(v1) 545e1: psraw Pq,Qq | psraw Vdq,Wdq (66),(VEX),(o128)
563e2: psrad Pq,Qq | vpsrad Vx,Hx,Wx (66),(v1) 546e2: psrad Pq,Qq | psrad Vdq,Wdq (66),(VEX),(o128)
564e3: pavgw Pq,Qq | vpavgw Vx,Hx,Wx (66),(v1) 547e3: pavgw Pq,Qq | pavgw Vdq,Wdq (66),(VEX),(o128)
565e4: pmulhuw Pq,Qq | vpmulhuw Vx,Hx,Wx (66),(v1) 548e4: pmulhuw Pq,Qq | pmulhuw Vdq,Wdq (66),(VEX),(o128)
566e5: pmulhw Pq,Qq | vpmulhw Vx,Hx,Wx (66),(v1) 549e5: pmulhw Pq,Qq | pmulhw Vdq,Wdq (66),(VEX),(o128)
567e6: vcvttpd2dq Vx,Wpd (66) | vcvtdq2pd Vx,Wdq (F3) | vcvtpd2dq Vx,Wpd (F2) 550e6: cvtpd2dq Vdq,Wpd (F2),(VEX) | cvttpd2dq Vdq,Wpd (66),(VEX) | cvtdq2pd Vpd,Wdq (F3),(VEX)
568e7: movntq Mq,Pq | vmovntdq Mx,Vx (66) 551e7: movntq Mq,Pq | movntdq Mdq,Vdq (66),(VEX)
569e8: psubsb Pq,Qq | vpsubsb Vx,Hx,Wx (66),(v1) 552e8: psubsb Pq,Qq | psubsb Vdq,Wdq (66),(VEX),(o128)
570e9: psubsw Pq,Qq | vpsubsw Vx,Hx,Wx (66),(v1) 553e9: psubsw Pq,Qq | psubsw Vdq,Wdq (66),(VEX),(o128)
571ea: pminsw Pq,Qq | vpminsw Vx,Hx,Wx (66),(v1) 554ea: pminsw Pq,Qq | pminsw Vdq,Wdq (66),(VEX),(o128)
572eb: por Pq,Qq | vpor Vx,Hx,Wx (66),(v1) 555eb: por Pq,Qq | por Vdq,Wdq (66),(VEX),(o128)
573ec: paddsb Pq,Qq | vpaddsb Vx,Hx,Wx (66),(v1) 556ec: paddsb Pq,Qq | paddsb Vdq,Wdq (66),(VEX),(o128)
574ed: paddsw Pq,Qq | vpaddsw Vx,Hx,Wx (66),(v1) 557ed: paddsw Pq,Qq | paddsw Vdq,Wdq (66),(VEX),(o128)
575ee: pmaxsw Pq,Qq | vpmaxsw Vx,Hx,Wx (66),(v1) 558ee: pmaxsw Pq,Qq | pmaxsw Vdq,Wdq (66),(VEX),(o128)
576ef: pxor Pq,Qq | vpxor Vx,Hx,Wx (66),(v1) 559ef: pxor Pq,Qq | pxor Vdq,Wdq (66),(VEX),(o128)
577# 0x0f 0xf0-0xff 560# 0x0f 0xf0-0xff
578f0: vlddqu Vx,Mx (F2) 561f0: lddqu Vdq,Mdq (F2),(VEX)
579f1: psllw Pq,Qq | vpsllw Vx,Hx,Wx (66),(v1) 562f1: psllw Pq,Qq | psllw Vdq,Wdq (66),(VEX),(o128)
580f2: pslld Pq,Qq | vpslld Vx,Hx,Wx (66),(v1) 563f2: pslld Pq,Qq | pslld Vdq,Wdq (66),(VEX),(o128)
581f3: psllq Pq,Qq | vpsllq Vx,Hx,Wx (66),(v1) 564f3: psllq Pq,Qq | psllq Vdq,Wdq (66),(VEX),(o128)
582f4: pmuludq Pq,Qq | vpmuludq Vx,Hx,Wx (66),(v1) 565f4: pmuludq Pq,Qq | pmuludq Vdq,Wdq (66),(VEX),(o128)
583f5: pmaddwd Pq,Qq | vpmaddwd Vx,Hx,Wx (66),(v1) 566f5: pmaddwd Pq,Qq | pmaddwd Vdq,Wdq (66),(VEX),(o128)
584f6: psadbw Pq,Qq | vpsadbw Vx,Hx,Wx (66),(v1) 567f6: psadbw Pq,Qq | psadbw Vdq,Wdq (66),(VEX),(o128)
585f7: maskmovq Pq,Nq | vmaskmovdqu Vx,Ux (66),(v1) 568f7: maskmovq Pq,Nq | maskmovdqu Vdq,Udq (66),(VEX),(o128)
586f8: psubb Pq,Qq | vpsubb Vx,Hx,Wx (66),(v1) 569f8: psubb Pq,Qq | psubb Vdq,Wdq (66),(VEX),(o128)
587f9: psubw Pq,Qq | vpsubw Vx,Hx,Wx (66),(v1) 570f9: psubw Pq,Qq | psubw Vdq,Wdq (66),(VEX),(o128)
588fa: psubd Pq,Qq | vpsubd Vx,Hx,Wx (66),(v1) 571fa: psubd Pq,Qq | psubd Vdq,Wdq (66),(VEX),(o128)
589fb: psubq Pq,Qq | vpsubq Vx,Hx,Wx (66),(v1) 572fb: psubq Pq,Qq | psubq Vdq,Wdq (66),(VEX),(o128)
590fc: paddb Pq,Qq | vpaddb Vx,Hx,Wx (66),(v1) 573fc: paddb Pq,Qq | paddb Vdq,Wdq (66),(VEX),(o128)
591fd: paddw Pq,Qq | vpaddw Vx,Hx,Wx (66),(v1) 574fd: paddw Pq,Qq | paddw Vdq,Wdq (66),(VEX),(o128)
592fe: paddd Pq,Qq | vpaddd Vx,Hx,Wx (66),(v1) 575fe: paddd Pq,Qq | paddd Vdq,Wdq (66),(VEX),(o128)
593ff: 576ff:
594EndTable 577EndTable
595 578
@@ -597,193 +580,155 @@ Table: 3-byte opcode 1 (0x0f 0x38)
597Referrer: 3-byte escape 1 580Referrer: 3-byte escape 1
598AVXcode: 2 581AVXcode: 2
599# 0x0f 0x38 0x00-0x0f 582# 0x0f 0x38 0x00-0x0f
60000: pshufb Pq,Qq | vpshufb Vx,Hx,Wx (66),(v1) 58300: pshufb Pq,Qq | pshufb Vdq,Wdq (66),(VEX),(o128)
60101: phaddw Pq,Qq | vphaddw Vx,Hx,Wx (66),(v1) 58401: phaddw Pq,Qq | phaddw Vdq,Wdq (66),(VEX),(o128)
60202: phaddd Pq,Qq | vphaddd Vx,Hx,Wx (66),(v1) 58502: phaddd Pq,Qq | phaddd Vdq,Wdq (66),(VEX),(o128)
60303: phaddsw Pq,Qq | vphaddsw Vx,Hx,Wx (66),(v1) 58603: phaddsw Pq,Qq | phaddsw Vdq,Wdq (66),(VEX),(o128)
60404: pmaddubsw Pq,Qq | vpmaddubsw Vx,Hx,Wx (66),(v1) 58704: pmaddubsw Pq,Qq | pmaddubsw Vdq,Wdq (66),(VEX),(o128)
60505: phsubw Pq,Qq | vphsubw Vx,Hx,Wx (66),(v1) 58805: phsubw Pq,Qq | phsubw Vdq,Wdq (66),(VEX),(o128)
60606: phsubd Pq,Qq | vphsubd Vx,Hx,Wx (66),(v1) 58906: phsubd Pq,Qq | phsubd Vdq,Wdq (66),(VEX),(o128)
60707: phsubsw Pq,Qq | vphsubsw Vx,Hx,Wx (66),(v1) 59007: phsubsw Pq,Qq | phsubsw Vdq,Wdq (66),(VEX),(o128)
60808: psignb Pq,Qq | vpsignb Vx,Hx,Wx (66),(v1) 59108: psignb Pq,Qq | psignb Vdq,Wdq (66),(VEX),(o128)
60909: psignw Pq,Qq | vpsignw Vx,Hx,Wx (66),(v1) 59209: psignw Pq,Qq | psignw Vdq,Wdq (66),(VEX),(o128)
6100a: psignd Pq,Qq | vpsignd Vx,Hx,Wx (66),(v1) 5930a: psignd Pq,Qq | psignd Vdq,Wdq (66),(VEX),(o128)
6110b: pmulhrsw Pq,Qq | vpmulhrsw Vx,Hx,Wx (66),(v1) 5940b: pmulhrsw Pq,Qq | pmulhrsw Vdq,Wdq (66),(VEX),(o128)
6120c: vpermilps Vx,Hx,Wx (66),(v) 5950c: Vpermilps /r (66),(oVEX)
6130d: vpermilpd Vx,Hx,Wx (66),(v) 5960d: Vpermilpd /r (66),(oVEX)
6140e: vtestps Vx,Wx (66),(v) 5970e: vtestps /r (66),(oVEX)
6150f: vtestpd Vx,Wx (66),(v) 5980f: vtestpd /r (66),(oVEX)
616# 0x0f 0x38 0x10-0x1f 599# 0x0f 0x38 0x10-0x1f
61710: pblendvb Vdq,Wdq (66) 60010: pblendvb Vdq,Wdq (66)
61811: 60111:
61912: 60212:
62013: vcvtph2ps Vx,Wx,Ib (66),(v) 60313:
62114: blendvps Vdq,Wdq (66) 60414: blendvps Vdq,Wdq (66)
62215: blendvpd Vdq,Wdq (66) 60515: blendvpd Vdq,Wdq (66)
62316: vpermps Vqq,Hqq,Wqq (66),(v) 60616:
62417: vptest Vx,Wx (66) 60717: ptest Vdq,Wdq (66),(VEX)
62518: vbroadcastss Vx,Wd (66),(v) 60818: vbroadcastss /r (66),(oVEX)
62619: vbroadcastsd Vqq,Wq (66),(v) 60919: vbroadcastsd /r (66),(oVEX),(o256)
6271a: vbroadcastf128 Vqq,Mdq (66),(v) 6101a: vbroadcastf128 /r (66),(oVEX),(o256)
6281b: 6111b:
6291c: pabsb Pq,Qq | vpabsb Vx,Wx (66),(v1) 6121c: pabsb Pq,Qq | pabsb Vdq,Wdq (66),(VEX),(o128)
6301d: pabsw Pq,Qq | vpabsw Vx,Wx (66),(v1) 6131d: pabsw Pq,Qq | pabsw Vdq,Wdq (66),(VEX),(o128)
6311e: pabsd Pq,Qq | vpabsd Vx,Wx (66),(v1) 6141e: pabsd Pq,Qq | pabsd Vdq,Wdq (66),(VEX),(o128)
6321f: 6151f:
633# 0x0f 0x38 0x20-0x2f 616# 0x0f 0x38 0x20-0x2f
63420: vpmovsxbw Vx,Ux/Mq (66),(v1) 61720: pmovsxbw Vdq,Udq/Mq (66),(VEX),(o128)
63521: vpmovsxbd Vx,Ux/Md (66),(v1) 61821: pmovsxbd Vdq,Udq/Md (66),(VEX),(o128)
63622: vpmovsxbq Vx,Ux/Mw (66),(v1) 61922: pmovsxbq Vdq,Udq/Mw (66),(VEX),(o128)
63723: vpmovsxwd Vx,Ux/Mq (66),(v1) 62023: pmovsxwd Vdq,Udq/Mq (66),(VEX),(o128)
63824: vpmovsxwq Vx,Ux/Md (66),(v1) 62124: pmovsxwq Vdq,Udq/Md (66),(VEX),(o128)
63925: vpmovsxdq Vx,Ux/Mq (66),(v1) 62225: pmovsxdq Vdq,Udq/Mq (66),(VEX),(o128)
64026: 62326:
64127: 62427:
64228: vpmuldq Vx,Hx,Wx (66),(v1) 62528: pmuldq Vdq,Wdq (66),(VEX),(o128)
64329: vpcmpeqq Vx,Hx,Wx (66),(v1) 62629: pcmpeqq Vdq,Wdq (66),(VEX),(o128)
6442a: vmovntdqa Vx,Mx (66),(v1) 6272a: movntdqa Vdq,Mdq (66),(VEX),(o128)
6452b: vpackusdw Vx,Hx,Wx (66),(v1) 6282b: packusdw Vdq,Wdq (66),(VEX),(o128)
6462c: vmaskmovps Vx,Hx,Mx (66),(v) 6292c: vmaskmovps(ld) /r (66),(oVEX)
6472d: vmaskmovpd Vx,Hx,Mx (66),(v) 6302d: vmaskmovpd(ld) /r (66),(oVEX)
6482e: vmaskmovps Mx,Hx,Vx (66),(v) 6312e: vmaskmovps(st) /r (66),(oVEX)
6492f: vmaskmovpd Mx,Hx,Vx (66),(v) 6322f: vmaskmovpd(st) /r (66),(oVEX)
650# 0x0f 0x38 0x30-0x3f 633# 0x0f 0x38 0x30-0x3f
65130: vpmovzxbw Vx,Ux/Mq (66),(v1) 63430: pmovzxbw Vdq,Udq/Mq (66),(VEX),(o128)
65231: vpmovzxbd Vx,Ux/Md (66),(v1) 63531: pmovzxbd Vdq,Udq/Md (66),(VEX),(o128)
65332: vpmovzxbq Vx,Ux/Mw (66),(v1) 63632: pmovzxbq Vdq,Udq/Mw (66),(VEX),(o128)
65433: vpmovzxwd Vx,Ux/Mq (66),(v1) 63733: pmovzxwd Vdq,Udq/Mq (66),(VEX),(o128)
65534: vpmovzxwq Vx,Ux/Md (66),(v1) 63834: pmovzxwq Vdq,Udq/Md (66),(VEX),(o128)
65635: vpmovzxdq Vx,Ux/Mq (66),(v1) 63935: pmovzxdq Vdq,Udq/Mq (66),(VEX),(o128)
65736: vpermd Vqq,Hqq,Wqq (66),(v) 64036:
65837: vpcmpgtq Vx,Hx,Wx (66),(v1) 64137: pcmpgtq Vdq,Wdq (66),(VEX),(o128)
65938: vpminsb Vx,Hx,Wx (66),(v1) 64238: pminsb Vdq,Wdq (66),(VEX),(o128)
66039: vpminsd Vx,Hx,Wx (66),(v1) 64339: pminsd Vdq,Wdq (66),(VEX),(o128)
6613a: vpminuw Vx,Hx,Wx (66),(v1) 6443a: pminuw Vdq,Wdq (66),(VEX),(o128)
6623b: vpminud Vx,Hx,Wx (66),(v1) 6453b: pminud Vdq,Wdq (66),(VEX),(o128)
6633c: vpmaxsb Vx,Hx,Wx (66),(v1) 6463c: pmaxsb Vdq,Wdq (66),(VEX),(o128)
6643d: vpmaxsd Vx,Hx,Wx (66),(v1) 6473d: pmaxsd Vdq,Wdq (66),(VEX),(o128)
6653e: vpmaxuw Vx,Hx,Wx (66),(v1) 6483e: pmaxuw Vdq,Wdq (66),(VEX),(o128)
6663f: vpmaxud Vx,Hx,Wx (66),(v1) 6493f: pmaxud Vdq,Wdq (66),(VEX),(o128)
667# 0x0f 0x38 0x40-0x8f 650# 0x0f 0x38 0x40-0x8f
66840: vpmulld Vx,Hx,Wx (66),(v1) 65140: pmulld Vdq,Wdq (66),(VEX),(o128)
66941: vphminposuw Vdq,Wdq (66),(v1) 65241: phminposuw Vdq,Wdq (66),(VEX),(o128)
67042: 65380: INVEPT Gd/q,Mdq (66)
67143: 65481: INVPID Gd/q,Mdq (66)
67244:
67345: vpsrlvd/q Vx,Hx,Wx (66),(v)
67446: vpsravd Vx,Hx,Wx (66),(v)
67547: vpsllvd/q Vx,Hx,Wx (66),(v)
676# Skip 0x48-0x57
67758: vpbroadcastd Vx,Wx (66),(v)
67859: vpbroadcastq Vx,Wx (66),(v)
6795a: vbroadcasti128 Vqq,Mdq (66),(v)
680# Skip 0x5b-0x77
68178: vpbroadcastb Vx,Wx (66),(v)
68279: vpbroadcastw Vx,Wx (66),(v)
683# Skip 0x7a-0x7f
68480: INVEPT Gy,Mdq (66)
68581: INVPID Gy,Mdq (66)
68682: INVPCID Gy,Mdq (66)
6878c: vpmaskmovd/q Vx,Hx,Mx (66),(v)
6888e: vpmaskmovd/q Mx,Vx,Hx (66),(v)
689# 0x0f 0x38 0x90-0xbf (FMA) 655# 0x0f 0x38 0x90-0xbf (FMA)
69090: vgatherdd/q Vx,Hx,Wx (66),(v) 65696: vfmaddsub132pd/ps /r (66),(VEX)
69191: vgatherqd/q Vx,Hx,Wx (66),(v) 65797: vfmsubadd132pd/ps /r (66),(VEX)
69292: vgatherdps/d Vx,Hx,Wx (66),(v) 65898: vfmadd132pd/ps /r (66),(VEX)
69393: vgatherqps/d Vx,Hx,Wx (66),(v) 65999: vfmadd132sd/ss /r (66),(VEX),(o128)
69494: 6609a: vfmsub132pd/ps /r (66),(VEX)
69595: 6619b: vfmsub132sd/ss /r (66),(VEX),(o128)
69696: vfmaddsub132ps/d Vx,Hx,Wx (66),(v) 6629c: vfnmadd132pd/ps /r (66),(VEX)
69797: vfmsubadd132ps/d Vx,Hx,Wx (66),(v) 6639d: vfnmadd132sd/ss /r (66),(VEX),(o128)
69898: vfmadd132ps/d Vx,Hx,Wx (66),(v) 6649e: vfnmsub132pd/ps /r (66),(VEX)
69999: vfmadd132ss/d Vx,Hx,Wx (66),(v),(v1) 6659f: vfnmsub132sd/ss /r (66),(VEX),(o128)
7009a: vfmsub132ps/d Vx,Hx,Wx (66),(v) 666a6: vfmaddsub213pd/ps /r (66),(VEX)
7019b: vfmsub132ss/d Vx,Hx,Wx (66),(v),(v1) 667a7: vfmsubadd213pd/ps /r (66),(VEX)
7029c: vfnmadd132ps/d Vx,Hx,Wx (66),(v) 668a8: vfmadd213pd/ps /r (66),(VEX)
7039d: vfnmadd132ss/d Vx,Hx,Wx (66),(v),(v1) 669a9: vfmadd213sd/ss /r (66),(VEX),(o128)
7049e: vfnmsub132ps/d Vx,Hx,Wx (66),(v) 670aa: vfmsub213pd/ps /r (66),(VEX)
7059f: vfnmsub132ss/d Vx,Hx,Wx (66),(v),(v1) 671ab: vfmsub213sd/ss /r (66),(VEX),(o128)
706a6: vfmaddsub213ps/d Vx,Hx,Wx (66),(v) 672ac: vfnmadd213pd/ps /r (66),(VEX)
707a7: vfmsubadd213ps/d Vx,Hx,Wx (66),(v) 673ad: vfnmadd213sd/ss /r (66),(VEX),(o128)
708a8: vfmadd213ps/d Vx,Hx,Wx (66),(v) 674ae: vfnmsub213pd/ps /r (66),(VEX)
709a9: vfmadd213ss/d Vx,Hx,Wx (66),(v),(v1) 675af: vfnmsub213sd/ss /r (66),(VEX),(o128)
710aa: vfmsub213ps/d Vx,Hx,Wx (66),(v) 676b6: vfmaddsub231pd/ps /r (66),(VEX)
711ab: vfmsub213ss/d Vx,Hx,Wx (66),(v),(v1) 677b7: vfmsubadd231pd/ps /r (66),(VEX)
712ac: vfnmadd213ps/d Vx,Hx,Wx (66),(v) 678b8: vfmadd231pd/ps /r (66),(VEX)
713ad: vfnmadd213ss/d Vx,Hx,Wx (66),(v),(v1) 679b9: vfmadd231sd/ss /r (66),(VEX),(o128)
714ae: vfnmsub213ps/d Vx,Hx,Wx (66),(v) 680ba: vfmsub231pd/ps /r (66),(VEX)
715af: vfnmsub213ss/d Vx,Hx,Wx (66),(v),(v1) 681bb: vfmsub231sd/ss /r (66),(VEX),(o128)
716b6: vfmaddsub231ps/d Vx,Hx,Wx (66),(v) 682bc: vfnmadd231pd/ps /r (66),(VEX)
717b7: vfmsubadd231ps/d Vx,Hx,Wx (66),(v) 683bd: vfnmadd231sd/ss /r (66),(VEX),(o128)
718b8: vfmadd231ps/d Vx,Hx,Wx (66),(v) 684be: vfnmsub231pd/ps /r (66),(VEX)
719b9: vfmadd231ss/d Vx,Hx,Wx (66),(v),(v1) 685bf: vfnmsub231sd/ss /r (66),(VEX),(o128)
720ba: vfmsub231ps/d Vx,Hx,Wx (66),(v)
721bb: vfmsub231ss/d Vx,Hx,Wx (66),(v),(v1)
722bc: vfnmadd231ps/d Vx,Hx,Wx (66),(v)
723bd: vfnmadd231ss/d Vx,Hx,Wx (66),(v),(v1)
724be: vfnmsub231ps/d Vx,Hx,Wx (66),(v)
725bf: vfnmsub231ss/d Vx,Hx,Wx (66),(v),(v1)
726# 0x0f 0x38 0xc0-0xff 686# 0x0f 0x38 0xc0-0xff
727db: VAESIMC Vdq,Wdq (66),(v1) 687db: aesimc Vdq,Wdq (66),(VEX),(o128)
728dc: VAESENC Vdq,Hdq,Wdq (66),(v1) 688dc: aesenc Vdq,Wdq (66),(VEX),(o128)
729dd: VAESENCLAST Vdq,Hdq,Wdq (66),(v1) 689dd: aesenclast Vdq,Wdq (66),(VEX),(o128)
730de: VAESDEC Vdq,Hdq,Wdq (66),(v1) 690de: aesdec Vdq,Wdq (66),(VEX),(o128)
731df: VAESDECLAST Vdq,Hdq,Wdq (66),(v1) 691df: aesdeclast Vdq,Wdq (66),(VEX),(o128)
732f0: MOVBE Gy,My | MOVBE Gw,Mw (66) | CRC32 Gd,Eb (F2) 692f0: MOVBE Gv,Mv | CRC32 Gd,Eb (F2)
733f1: MOVBE My,Gy | MOVBE Mw,Gw (66) | CRC32 Gd,Ey (F2) 693f1: MOVBE Mv,Gv | CRC32 Gd,Ev (F2)
734f2: ANDN Gy,By,Ey (v)
735f3: Grp17 (1A)
736f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v)
737f6: MULX By,Gy,rDX,Ey (F2),(v)
738f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v)
739EndTable 694EndTable
740 695
741Table: 3-byte opcode 2 (0x0f 0x3a) 696Table: 3-byte opcode 2 (0x0f 0x3a)
742Referrer: 3-byte escape 2 697Referrer: 3-byte escape 2
743AVXcode: 3 698AVXcode: 3
744# 0x0f 0x3a 0x00-0xff 699# 0x0f 0x3a 0x00-0xff
74500: vpermq Vqq,Wqq,Ib (66),(v) 70004: vpermilps /r,Ib (66),(oVEX)
74601: vpermpd Vqq,Wqq,Ib (66),(v) 70105: vpermilpd /r,Ib (66),(oVEX)
74702: vpblendd Vx,Hx,Wx,Ib (66),(v) 70206: vperm2f128 /r,Ib (66),(oVEX),(o256)
74803: 70308: roundps Vdq,Wdq,Ib (66),(VEX)
74904: vpermilps Vx,Wx,Ib (66),(v) 70409: roundpd Vdq,Wdq,Ib (66),(VEX)
75005: vpermilpd Vx,Wx,Ib (66),(v) 7050a: roundss Vss,Wss,Ib (66),(VEX),(o128)
75106: vperm2f128 Vqq,Hqq,Wqq,Ib (66),(v) 7060b: roundsd Vsd,Wsd,Ib (66),(VEX),(o128)
75207: 7070c: blendps Vdq,Wdq,Ib (66),(VEX)
75308: vroundps Vx,Wx,Ib (66) 7080d: blendpd Vdq,Wdq,Ib (66),(VEX)
75409: vroundpd Vx,Wx,Ib (66) 7090e: pblendw Vdq,Wdq,Ib (66),(VEX),(o128)
7550a: vroundss Vss,Wss,Ib (66),(v1) 7100f: palignr Pq,Qq,Ib | palignr Vdq,Wdq,Ib (66),(VEX),(o128)
7560b: vroundsd Vsd,Wsd,Ib (66),(v1) 71114: pextrb Rd/Mb,Vdq,Ib (66),(VEX),(o128)
7570c: vblendps Vx,Hx,Wx,Ib (66) 71215: pextrw Rd/Mw,Vdq,Ib (66),(VEX),(o128)
7580d: vblendpd Vx,Hx,Wx,Ib (66) 71316: pextrd/pextrq Ed/q,Vdq,Ib (66),(VEX),(o128)
7590e: vpblendw Vx,Hx,Wx,Ib (66),(v1) 71417: extractps Ed,Vdq,Ib (66),(VEX),(o128)
7600f: palignr Pq,Qq,Ib | vpalignr Vx,Hx,Wx,Ib (66),(v1) 71518: vinsertf128 /r,Ib (66),(oVEX),(o256)
76114: vpextrb Rd/Mb,Vdq,Ib (66),(v1) 71619: vextractf128 /r,Ib (66),(oVEX),(o256)
76215: vpextrw Rd/Mw,Vdq,Ib (66),(v1) 71720: pinsrb Vdq,Rd/q/Mb,Ib (66),(VEX),(o128)
76316: vpextrd/q Ey,Vdq,Ib (66),(v1) 71821: insertps Vdq,Udq/Md,Ib (66),(VEX),(o128)
76417: vextractps Ed,Vdq,Ib (66),(v1) 71922: pinsrd/pinsrq Vdq,Ed/q,Ib (66),(VEX),(o128)
76518: vinsertf128 Vqq,Hqq,Wqq,Ib (66),(v) 72040: dpps Vdq,Wdq,Ib (66),(VEX)
76619: vextractf128 Wdq,Vqq,Ib (66),(v) 72141: dppd Vdq,Wdq,Ib (66),(VEX),(o128)
7671d: vcvtps2ph Wx,Vx,Ib (66),(v) 72242: mpsadbw Vdq,Wdq,Ib (66),(VEX),(o128)
76820: vpinsrb Vdq,Hdq,Ry/Mb,Ib (66),(v1) 72344: pclmulq Vdq,Wdq,Ib (66),(VEX),(o128)
76921: vinsertps Vdq,Hdq,Udq/Md,Ib (66),(v1) 7244a: vblendvps /r,Ib (66),(oVEX)
77022: vpinsrd/q Vdq,Hdq,Ey,Ib (66),(v1) 7254b: vblendvpd /r,Ib (66),(oVEX)
77138: vinserti128 Vqq,Hqq,Wqq,Ib (66),(v) 7264c: vpblendvb /r,Ib (66),(oVEX),(o128)
77239: vextracti128 Wdq,Vqq,Ib (66),(v) 72760: pcmpestrm Vdq,Wdq,Ib (66),(VEX),(o128)
77340: vdpps Vx,Hx,Wx,Ib (66) 72861: pcmpestri Vdq,Wdq,Ib (66),(VEX),(o128)
77441: vdppd Vdq,Hdq,Wdq,Ib (66),(v1) 72962: pcmpistrm Vdq,Wdq,Ib (66),(VEX),(o128)
77542: vmpsadbw Vx,Hx,Wx,Ib (66),(v1) 73063: pcmpistri Vdq,Wdq,Ib (66),(VEX),(o128)
77644: vpclmulqdq Vdq,Hdq,Wdq,Ib (66),(v1) 731df: aeskeygenassist Vdq,Wdq,Ib (66),(VEX),(o128)
77746: vperm2i128 Vqq,Hqq,Wqq,Ib (66),(v)
7784a: vblendvps Vx,Hx,Wx,Lx (66),(v)
7794b: vblendvpd Vx,Hx,Wx,Lx (66),(v)
7804c: vpblendvb Vx,Hx,Wx,Lx (66),(v1)
78160: vpcmpestrm Vdq,Wdq,Ib (66),(v1)
78261: vpcmpestri Vdq,Wdq,Ib (66),(v1)
78362: vpcmpistrm Vdq,Wdq,Ib (66),(v1)
78463: vpcmpistri Vdq,Wdq,Ib (66),(v1)
785df: VAESKEYGEN Vdq,Wdq,Ib (66),(v1)
786f0: RORX Gy,Ey,Ib (F2),(v)
787EndTable 732EndTable
788 733
789GrpTable: Grp1 734GrpTable: Grp1
@@ -845,7 +790,7 @@ GrpTable: Grp5
8452: CALLN Ev (f64) 7902: CALLN Ev (f64)
8463: CALLF Ep 7913: CALLF Ep
8474: JMPN Ev (f64) 7924: JMPN Ev (f64)
8485: JMPF Mp 7935: JMPF Ep
8496: PUSH Ev (d64) 7946: PUSH Ev (d64)
8507: 7957:
851EndTable 796EndTable
@@ -862,7 +807,7 @@ EndTable
862GrpTable: Grp7 807GrpTable: Grp7
8630: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) 8080: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B)
8641: SIDT Ms | MONITOR (000),(11B) | MWAIT (001) 8091: SIDT Ms | MONITOR (000),(11B) | MWAIT (001)
8652: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) 8102: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B)
8663: LIDT Ms 8113: LIDT Ms
8674: SMSW Mw/Rv 8124: SMSW Mw/Rv
8685: 8135:
@@ -879,45 +824,44 @@ EndTable
879 824
880GrpTable: Grp9 825GrpTable: Grp9
8811: CMPXCHG8B/16B Mq/Mdq 8261: CMPXCHG8B/16B Mq/Mdq
8826: VMPTRLD Mq | VMCLEAR Mq (66) | VMXON Mq (F3) | RDRAND Rv (11B) 8276: VMPTRLD Mq | VMCLEAR Mq (66) | VMXON Mq (F3)
8837: VMPTRST Mq | VMPTRST Mq (F3) 8287: VMPTRST Mq
884EndTable 829EndTable
885 830
886GrpTable: Grp10 831GrpTable: Grp10
887EndTable 832EndTable
888 833
889GrpTable: Grp11 834GrpTable: Grp11
890# Note: the operands are given by group opcode
8910: MOV 8350: MOV
892EndTable 836EndTable
893 837
894GrpTable: Grp12 838GrpTable: Grp12
8952: psrlw Nq,Ib (11B) | vpsrlw Hx,Ux,Ib (66),(11B),(v1) 8392: psrlw Nq,Ib (11B) | psrlw Udq,Ib (66),(11B),(VEX),(o128)
8964: psraw Nq,Ib (11B) | vpsraw Hx,Ux,Ib (66),(11B),(v1) 8404: psraw Nq,Ib (11B) | psraw Udq,Ib (66),(11B),(VEX),(o128)
8976: psllw Nq,Ib (11B) | vpsllw Hx,Ux,Ib (66),(11B),(v1) 8416: psllw Nq,Ib (11B) | psllw Udq,Ib (66),(11B),(VEX),(o128)
898EndTable 842EndTable
899 843
900GrpTable: Grp13 844GrpTable: Grp13
9012: psrld Nq,Ib (11B) | vpsrld Hx,Ux,Ib (66),(11B),(v1) 8452: psrld Nq,Ib (11B) | psrld Udq,Ib (66),(11B),(VEX),(o128)
9024: psrad Nq,Ib (11B) | vpsrad Hx,Ux,Ib (66),(11B),(v1) 8464: psrad Nq,Ib (11B) | psrad Udq,Ib (66),(11B),(VEX),(o128)
9036: pslld Nq,Ib (11B) | vpslld Hx,Ux,Ib (66),(11B),(v1) 8476: pslld Nq,Ib (11B) | pslld Udq,Ib (66),(11B),(VEX),(o128)
904EndTable 848EndTable
905 849
906GrpTable: Grp14 850GrpTable: Grp14
9072: psrlq Nq,Ib (11B) | vpsrlq Hx,Ux,Ib (66),(11B),(v1) 8512: psrlq Nq,Ib (11B) | psrlq Udq,Ib (66),(11B),(VEX),(o128)
9083: vpsrldq Hx,Ux,Ib (66),(11B),(v1) 8523: psrldq Udq,Ib (66),(11B),(VEX),(o128)
9096: psllq Nq,Ib (11B) | vpsllq Hx,Ux,Ib (66),(11B),(v1) 8536: psllq Nq,Ib (11B) | psllq Udq,Ib (66),(11B),(VEX),(o128)
9107: vpslldq Hx,Ux,Ib (66),(11B),(v1) 8547: pslldq Udq,Ib (66),(11B),(VEX),(o128)
911EndTable 855EndTable
912 856
913GrpTable: Grp15 857GrpTable: Grp15
9140: fxsave | RDFSBASE Ry (F3),(11B) 8580: fxsave
9151: fxstor | RDGSBASE Ry (F3),(11B) 8591: fxstor
9162: vldmxcsr Md (v1) | WRFSBASE Ry (F3),(11B) 8602: ldmxcsr (VEX)
9173: vstmxcsr Md (v1) | WRGSBASE Ry (F3),(11B) 8613: stmxcsr (VEX)
9184: XSAVE 8624: XSAVE
9195: XRSTOR | lfence (11B) 8635: XRSTOR | lfence (11B)
9206: XSAVEOPT | mfence (11B) 8646: mfence (11B)
9217: clflush | sfence (11B) 8657: clflush | sfence (11B)
922EndTable 866EndTable
923 867
@@ -928,12 +872,6 @@ GrpTable: Grp16
9283: prefetch T2 8723: prefetch T2
929EndTable 873EndTable
930 874
931GrpTable: Grp17
9321: BLSR By,Ey (v)
9332: BLSMSK By,Ey (v)
9343: BLSI By,Ey (v)
935EndTable
936
937# AMD's Prefetch Group 875# AMD's Prefetch Group
938GrpTable: GrpP 876GrpTable: GrpP
9390: PREFETCH 8770: PREFETCH