diff options
author | Dan Williams <dan.j.williams@intel.com> | 2016-06-02 14:06:13 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2016-07-23 14:04:23 -0400 |
commit | fd1d961dd681d58308456049a817cbf4c0662018 (patch) | |
tree | ac9f8db412c027094a8349205c0d3802b52d8fca | |
parent | dfa169bbee00671288df25f8ef8a2f6e13fe2581 (diff) |
x86/insn: remove pcommit
The pcommit instruction is being deprecated in favor of either ADR
(asynchronous DRAM refresh: flush-on-power-fail) at the platform level, or
posted-write-queue flush addresses as defined by the ACPI 6.x NFIT (NVDIMM
Firmware Interface Table).
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Xiao Guangrong <guangrong.xiao@linux.intel.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Acked-by: Ingo Molnar <mingo@redhat.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | arch/x86/include/asm/cpufeatures.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/special_insns.h | 46 | ||||
-rw-r--r-- | arch/x86/lib/x86-opcode-map.txt | 2 | ||||
-rw-r--r-- | tools/objtool/arch/x86/insn/x86-opcode-map.txt | 2 | ||||
-rw-r--r-- | tools/perf/arch/x86/tests/insn-x86-dat-32.c | 2 | ||||
-rw-r--r-- | tools/perf/arch/x86/tests/insn-x86-dat-64.c | 2 | ||||
-rw-r--r-- | tools/perf/arch/x86/tests/insn-x86-dat-src.c | 4 | ||||
-rw-r--r-- | tools/perf/util/intel-pt-decoder/x86-opcode-map.txt | 2 |
8 files changed, 3 insertions, 58 deletions
diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h index 4a413485f9eb..700d97df7d28 100644 --- a/arch/x86/include/asm/cpufeatures.h +++ b/arch/x86/include/asm/cpufeatures.h | |||
@@ -225,7 +225,6 @@ | |||
225 | #define X86_FEATURE_RDSEED ( 9*32+18) /* The RDSEED instruction */ | 225 | #define X86_FEATURE_RDSEED ( 9*32+18) /* The RDSEED instruction */ |
226 | #define X86_FEATURE_ADX ( 9*32+19) /* The ADCX and ADOX instructions */ | 226 | #define X86_FEATURE_ADX ( 9*32+19) /* The ADCX and ADOX instructions */ |
227 | #define X86_FEATURE_SMAP ( 9*32+20) /* Supervisor Mode Access Prevention */ | 227 | #define X86_FEATURE_SMAP ( 9*32+20) /* Supervisor Mode Access Prevention */ |
228 | #define X86_FEATURE_PCOMMIT ( 9*32+22) /* PCOMMIT instruction */ | ||
229 | #define X86_FEATURE_CLFLUSHOPT ( 9*32+23) /* CLFLUSHOPT instruction */ | 228 | #define X86_FEATURE_CLFLUSHOPT ( 9*32+23) /* CLFLUSHOPT instruction */ |
230 | #define X86_FEATURE_CLWB ( 9*32+24) /* CLWB instruction */ | 229 | #define X86_FEATURE_CLWB ( 9*32+24) /* CLWB instruction */ |
231 | #define X86_FEATURE_AVX512PF ( 9*32+26) /* AVX-512 Prefetch */ | 230 | #define X86_FEATURE_AVX512PF ( 9*32+26) /* AVX-512 Prefetch */ |
diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h index d96d04377765..587d7914ea4b 100644 --- a/arch/x86/include/asm/special_insns.h +++ b/arch/x86/include/asm/special_insns.h | |||
@@ -253,52 +253,6 @@ static inline void clwb(volatile void *__p) | |||
253 | : [pax] "a" (p)); | 253 | : [pax] "a" (p)); |
254 | } | 254 | } |
255 | 255 | ||
256 | /** | ||
257 | * pcommit_sfence() - persistent commit and fence | ||
258 | * | ||
259 | * The PCOMMIT instruction ensures that data that has been flushed from the | ||
260 | * processor's cache hierarchy with CLWB, CLFLUSHOPT or CLFLUSH is accepted to | ||
261 | * memory and is durable on the DIMM. The primary use case for this is | ||
262 | * persistent memory. | ||
263 | * | ||
264 | * This function shows how to properly use CLWB/CLFLUSHOPT/CLFLUSH and PCOMMIT | ||
265 | * with appropriate fencing. | ||
266 | * | ||
267 | * Example: | ||
268 | * void flush_and_commit_buffer(void *vaddr, unsigned int size) | ||
269 | * { | ||
270 | * unsigned long clflush_mask = boot_cpu_data.x86_clflush_size - 1; | ||
271 | * void *vend = vaddr + size; | ||
272 | * void *p; | ||
273 | * | ||
274 | * for (p = (void *)((unsigned long)vaddr & ~clflush_mask); | ||
275 | * p < vend; p += boot_cpu_data.x86_clflush_size) | ||
276 | * clwb(p); | ||
277 | * | ||
278 | * // SFENCE to order CLWB/CLFLUSHOPT/CLFLUSH cache flushes | ||
279 | * // MFENCE via mb() also works | ||
280 | * wmb(); | ||
281 | * | ||
282 | * // PCOMMIT and the required SFENCE for ordering | ||
283 | * pcommit_sfence(); | ||
284 | * } | ||
285 | * | ||
286 | * After this function completes the data pointed to by 'vaddr' has been | ||
287 | * accepted to memory and will be durable if the 'vaddr' points to persistent | ||
288 | * memory. | ||
289 | * | ||
290 | * PCOMMIT must always be ordered by an MFENCE or SFENCE, so to help simplify | ||
291 | * things we include both the PCOMMIT and the required SFENCE in the | ||
292 | * alternatives generated by pcommit_sfence(). | ||
293 | */ | ||
294 | static inline void pcommit_sfence(void) | ||
295 | { | ||
296 | alternative(ASM_NOP7, | ||
297 | ".byte 0x66, 0x0f, 0xae, 0xf8\n\t" /* pcommit */ | ||
298 | "sfence", | ||
299 | X86_FEATURE_PCOMMIT); | ||
300 | } | ||
301 | |||
302 | #define nop() asm volatile ("nop") | 256 | #define nop() asm volatile ("nop") |
303 | 257 | ||
304 | 258 | ||
diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt index d388de72eaca..28632ee68377 100644 --- a/arch/x86/lib/x86-opcode-map.txt +++ b/arch/x86/lib/x86-opcode-map.txt | |||
@@ -947,7 +947,7 @@ GrpTable: Grp15 | |||
947 | 4: XSAVE | 947 | 4: XSAVE |
948 | 5: XRSTOR | lfence (11B) | 948 | 5: XRSTOR | lfence (11B) |
949 | 6: XSAVEOPT | clwb (66) | mfence (11B) | 949 | 6: XSAVEOPT | clwb (66) | mfence (11B) |
950 | 7: clflush | clflushopt (66) | sfence (11B) | pcommit (66),(11B) | 950 | 7: clflush | clflushopt (66) | sfence (11B) |
951 | EndTable | 951 | EndTable |
952 | 952 | ||
953 | GrpTable: Grp16 | 953 | GrpTable: Grp16 |
diff --git a/tools/objtool/arch/x86/insn/x86-opcode-map.txt b/tools/objtool/arch/x86/insn/x86-opcode-map.txt index d388de72eaca..28632ee68377 100644 --- a/tools/objtool/arch/x86/insn/x86-opcode-map.txt +++ b/tools/objtool/arch/x86/insn/x86-opcode-map.txt | |||
@@ -947,7 +947,7 @@ GrpTable: Grp15 | |||
947 | 4: XSAVE | 947 | 4: XSAVE |
948 | 5: XRSTOR | lfence (11B) | 948 | 5: XRSTOR | lfence (11B) |
949 | 6: XSAVEOPT | clwb (66) | mfence (11B) | 949 | 6: XSAVEOPT | clwb (66) | mfence (11B) |
950 | 7: clflush | clflushopt (66) | sfence (11B) | pcommit (66),(11B) | 950 | 7: clflush | clflushopt (66) | sfence (11B) |
951 | EndTable | 951 | EndTable |
952 | 952 | ||
953 | GrpTable: Grp16 | 953 | GrpTable: Grp16 |
diff --git a/tools/perf/arch/x86/tests/insn-x86-dat-32.c b/tools/perf/arch/x86/tests/insn-x86-dat-32.c index 3b491cfe204e..38a48daed154 100644 --- a/tools/perf/arch/x86/tests/insn-x86-dat-32.c +++ b/tools/perf/arch/x86/tests/insn-x86-dat-32.c | |||
@@ -654,5 +654,3 @@ | |||
654 | "0f c7 1d 78 56 34 12 \txrstors 0x12345678",}, | 654 | "0f c7 1d 78 56 34 12 \txrstors 0x12345678",}, |
655 | {{0x0f, 0xc7, 0x9c, 0xc8, 0x78, 0x56, 0x34, 0x12, }, 8, 0, "", "", | 655 | {{0x0f, 0xc7, 0x9c, 0xc8, 0x78, 0x56, 0x34, 0x12, }, 8, 0, "", "", |
656 | "0f c7 9c c8 78 56 34 12 \txrstors 0x12345678(%eax,%ecx,8)",}, | 656 | "0f c7 9c c8 78 56 34 12 \txrstors 0x12345678(%eax,%ecx,8)",}, |
657 | {{0x66, 0x0f, 0xae, 0xf8, }, 4, 0, "", "", | ||
658 | "66 0f ae f8 \tpcommit ",}, | ||
diff --git a/tools/perf/arch/x86/tests/insn-x86-dat-64.c b/tools/perf/arch/x86/tests/insn-x86-dat-64.c index 4fe7cce179c4..1f11ea85b60f 100644 --- a/tools/perf/arch/x86/tests/insn-x86-dat-64.c +++ b/tools/perf/arch/x86/tests/insn-x86-dat-64.c | |||
@@ -764,5 +764,3 @@ | |||
764 | "0f c7 9c c8 78 56 34 12 \txrstors 0x12345678(%rax,%rcx,8)",}, | 764 | "0f c7 9c c8 78 56 34 12 \txrstors 0x12345678(%rax,%rcx,8)",}, |
765 | {{0x41, 0x0f, 0xc7, 0x9c, 0xc8, 0x78, 0x56, 0x34, 0x12, }, 9, 0, "", "", | 765 | {{0x41, 0x0f, 0xc7, 0x9c, 0xc8, 0x78, 0x56, 0x34, 0x12, }, 9, 0, "", "", |
766 | "41 0f c7 9c c8 78 56 34 12 \txrstors 0x12345678(%r8,%rcx,8)",}, | 766 | "41 0f c7 9c c8 78 56 34 12 \txrstors 0x12345678(%r8,%rcx,8)",}, |
767 | {{0x66, 0x0f, 0xae, 0xf8, }, 4, 0, "", "", | ||
768 | "66 0f ae f8 \tpcommit ",}, | ||
diff --git a/tools/perf/arch/x86/tests/insn-x86-dat-src.c b/tools/perf/arch/x86/tests/insn-x86-dat-src.c index 41b1b1c62660..033b8a6fdab9 100644 --- a/tools/perf/arch/x86/tests/insn-x86-dat-src.c +++ b/tools/perf/arch/x86/tests/insn-x86-dat-src.c | |||
@@ -866,10 +866,6 @@ int main(void) | |||
866 | 866 | ||
867 | #endif /* #ifndef __x86_64__ */ | 867 | #endif /* #ifndef __x86_64__ */ |
868 | 868 | ||
869 | /* pcommit */ | ||
870 | |||
871 | asm volatile("pcommit"); | ||
872 | |||
873 | /* Following line is a marker for the awk script - do not change */ | 869 | /* Following line is a marker for the awk script - do not change */ |
874 | asm volatile("rdtsc"); /* Stop here */ | 870 | asm volatile("rdtsc"); /* Stop here */ |
875 | 871 | ||
diff --git a/tools/perf/util/intel-pt-decoder/x86-opcode-map.txt b/tools/perf/util/intel-pt-decoder/x86-opcode-map.txt index d388de72eaca..28632ee68377 100644 --- a/tools/perf/util/intel-pt-decoder/x86-opcode-map.txt +++ b/tools/perf/util/intel-pt-decoder/x86-opcode-map.txt | |||
@@ -947,7 +947,7 @@ GrpTable: Grp15 | |||
947 | 4: XSAVE | 947 | 4: XSAVE |
948 | 5: XRSTOR | lfence (11B) | 948 | 5: XRSTOR | lfence (11B) |
949 | 6: XSAVEOPT | clwb (66) | mfence (11B) | 949 | 6: XSAVEOPT | clwb (66) | mfence (11B) |
950 | 7: clflush | clflushopt (66) | sfence (11B) | pcommit (66),(11B) | 950 | 7: clflush | clflushopt (66) | sfence (11B) |
951 | EndTable | 951 | EndTable |
952 | 952 | ||
953 | GrpTable: Grp16 | 953 | GrpTable: Grp16 |