| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- From 6e502c25e8279d5c02db5b59e081a5415e1734fe Mon Sep 17 00:00:00 2001
- From: Andi Kleen <[email protected]>
- Date: Thu, 31 Aug 2017 14:46:30 -0700
- Subject: [PATCH 123/242] perf/x86: Enable free running PEBS for REGS_USER/INTR
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- CVE-2017-5754
- [ Note, this is a Git cherry-pick of the following commit:
- a47ba4d77e12 ("perf/x86: Enable free running PEBS for REGS_USER/INTR")
- ... for easier x86 PTI code testing and back-porting. ]
- Currently free running PEBS is disabled when user or interrupt
- registers are requested. Most of the registers are actually
- available in the PEBS record and can be supported.
- So we just need to check for the supported registers and then
- allow it: it is all except for the segment register.
- For user registers this only works when the counter is limited
- to ring 3 only, so this also needs to be checked.
- Signed-off-by: Andi Kleen <[email protected]>
- Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
- Cc: Linus Torvalds <[email protected]>
- Cc: Peter Zijlstra <[email protected]>
- Cc: Thomas Gleixner <[email protected]>
- Link: http://lkml.kernel.org/r/[email protected]
- Signed-off-by: Ingo Molnar <[email protected]>
- (backported from commit 2fe1bc1f501d55e5925b4035bcd85781adc76c63)
- Signed-off-by: Andy Whitcroft <[email protected]>
- Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
- (cherry picked from commit 06c6715f5b78b9976e72467b6bba510e243e5aad)
- Signed-off-by: Fabian Grünbichler <[email protected]>
- ---
- arch/x86/events/perf_event.h | 24 +++++++++++++++++++++++-
- arch/x86/events/intel/core.c | 4 ++++
- 2 files changed, 27 insertions(+), 1 deletion(-)
- diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h
- index 0f7dad8bd358..590eaf7c2c3e 100644
- --- a/arch/x86/events/perf_event.h
- +++ b/arch/x86/events/perf_event.h
- @@ -85,13 +85,15 @@ struct amd_nb {
- * Flags PEBS can handle without an PMI.
- *
- * TID can only be handled by flushing at context switch.
- + * REGS_USER can be handled for events limited to ring 3.
- *
- */
- #define PEBS_FREERUNNING_FLAGS \
- (PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_ADDR | \
- PERF_SAMPLE_ID | PERF_SAMPLE_CPU | PERF_SAMPLE_STREAM_ID | \
- PERF_SAMPLE_DATA_SRC | PERF_SAMPLE_IDENTIFIER | \
- - PERF_SAMPLE_TRANSACTION)
- + PERF_SAMPLE_TRANSACTION | \
- + PERF_SAMPLE_REGS_INTR | PERF_SAMPLE_REGS_USER)
-
- /*
- * A debug store configuration.
- @@ -110,6 +112,26 @@ struct debug_store {
- u64 pebs_event_reset[MAX_PEBS_EVENTS];
- };
-
- +#define PEBS_REGS \
- + (PERF_REG_X86_AX | \
- + PERF_REG_X86_BX | \
- + PERF_REG_X86_CX | \
- + PERF_REG_X86_DX | \
- + PERF_REG_X86_DI | \
- + PERF_REG_X86_SI | \
- + PERF_REG_X86_SP | \
- + PERF_REG_X86_BP | \
- + PERF_REG_X86_IP | \
- + PERF_REG_X86_FLAGS | \
- + PERF_REG_X86_R8 | \
- + PERF_REG_X86_R9 | \
- + PERF_REG_X86_R10 | \
- + PERF_REG_X86_R11 | \
- + PERF_REG_X86_R12 | \
- + PERF_REG_X86_R13 | \
- + PERF_REG_X86_R14 | \
- + PERF_REG_X86_R15)
- +
- /*
- * Per register state.
- */
- diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
- index 6f342001ec6a..7f3afbf928bb 100644
- --- a/arch/x86/events/intel/core.c
- +++ b/arch/x86/events/intel/core.c
- @@ -2958,6 +2958,10 @@ static unsigned long intel_pmu_free_running_flags(struct perf_event *event)
-
- if (event->attr.use_clockid)
- flags &= ~PERF_SAMPLE_TIME;
- + if (!event->attr.exclude_kernel)
- + flags &= ~PERF_SAMPLE_REGS_USER;
- + if (event->attr.sample_regs_user & ~PEBS_REGS)
- + flags &= ~(PERF_SAMPLE_REGS_USER | PERF_SAMPLE_REGS_INTR);
- return flags;
- }
-
- --
- 2.14.2
|