All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/4] perf/x86_64: get_regs_user: Do not guess user_regs->cs,ss,sp
@ 2015-04-10 13:06 Denys Vlasenko
  2015-04-10 13:06 ` [PATCH 2/4] perf/x86_64: get_regs_user: Do report user_regs->cx while we are in syscall Denys Vlasenko
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Denys Vlasenko @ 2015-04-10 13:06 UTC (permalink / raw)
  To: linux-kernel
  Cc: Denys Vlasenko, Jiri Olsa, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Arnaldo Carvalho de Melo, x86

After recent changes to syscall entry points, user_regs->{cs,ss,sp}
are always correct. (They used to be undefined while in syscalls).

We can report them reliably, without guessing.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
CC: Jiri Olsa <jolsa@redhat.com>
CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
CC: Paul Mackerras <paulus@samba.org>
CC: Ingo Molnar <mingo@redhat.com>
CC: Arnaldo Carvalho de Melo <acme@kernel.org>
CC: x86@kernel.org
CC: linux-kernel@vger.kernel.org
---
 arch/x86/kernel/perf_regs.c | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index 02a8720..7ab198a 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -131,8 +131,8 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	}
 
 	/*
-	 * RIP, flags, and the argument registers are usually saved.
-	 * orig_ax is probably okay, too.
+	 * These registers are always saved on 64-bit syscall entry.
+	 * On 32-bit entry points, they are saved too except r8..r11.
 	 */
 	regs_user_copy->ip = user_regs->ip;
 	regs_user_copy->cx = user_regs->cx;
@@ -145,9 +145,12 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	regs_user_copy->r11 = user_regs->r11;
 	regs_user_copy->orig_ax = user_regs->orig_ax;
 	regs_user_copy->flags = user_regs->flags;
+	regs_user_copy->sp = user_regs->sp;
+	regs_user_copy->cs = user_regs->cs;
+	regs_user_copy->ss = user_regs->ss;
 
 	/*
-	 * Don't even try to report the "rest" regs.
+	 * Most system calls don't save these registers, don't report them.
 	 */
 	regs_user_copy->bx = -1;
 	regs_user_copy->bp = -1;
@@ -158,7 +161,7 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 
 	/*
 	 * For this to be at all useful, we need a reasonable guess for
-	 * sp and the ABI.  Be careful: we're in NMI context, and we're
+	 * the ABI.  Be careful: we're in NMI context, and we're
 	 * considering current to be the current task, so we should
 	 * be careful not to look at any other percpu variables that might
 	 * change during context switches.
@@ -167,9 +170,6 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	    task_thread_info(current)->status & TS_COMPAT) {
 		/* Easy case: we're in a compat syscall. */
 		regs_user->abi = PERF_SAMPLE_REGS_ABI_32;
-		regs_user_copy->sp = user_regs->sp;
-		regs_user_copy->cs = user_regs->cs;
-		regs_user_copy->ss = user_regs->ss;
 	} else if (user_regs->orig_ax != -1) {
 		/*
 		 * We're probably in a 64-bit syscall.
@@ -177,17 +177,12 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 		 * than just blindly copying user_regs.
 		 */
 		regs_user->abi = PERF_SAMPLE_REGS_ABI_64;
-		regs_user_copy->sp = user_regs->sp;
-		regs_user_copy->cs = __USER_CS;
-		regs_user_copy->ss = __USER_DS;
-		regs_user_copy->cx = -1;  /* usually contains garbage */
+		/* usually contains return address (same as ->ip) */
+		regs_user_copy->cx = -1;
 	} else {
 		/* We're probably in an interrupt or exception. */
 		regs_user->abi = user_64bit_mode(user_regs) ?
 			PERF_SAMPLE_REGS_ABI_64 : PERF_SAMPLE_REGS_ABI_32;
-		regs_user_copy->sp = user_regs->sp;
-		regs_user_copy->cs = user_regs->cs;
-		regs_user_copy->ss = user_regs->ss;
 	}
 
 	regs_user->regs = regs_user_copy;
-- 
1.8.1.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/4] perf/x86_64: get_regs_user: Do report user_regs->cx while we are in syscall
  2015-04-10 13:06 [PATCH 1/4] perf/x86_64: get_regs_user: Do not guess user_regs->cs,ss,sp Denys Vlasenko
@ 2015-04-10 13:06 ` Denys Vlasenko
  2015-04-12 17:26   ` [tip:x86/asm] perf/x86/64: Do report user_regs-> cx while we are in syscall, in get_regs_user() tip-bot for Denys Vlasenko
  2015-04-10 13:06 ` [PATCH 3/4] perf/x86_64: get_regs_user: Simplify regs_user->abi setting code Denys Vlasenko
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Denys Vlasenko @ 2015-04-10 13:06 UTC (permalink / raw)
  To: linux-kernel
  Cc: Denys Vlasenko, Jiri Olsa, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Arnaldo Carvalho de Melo, x86

Yes, it is true that cx contains return address.
It's not clear why we trash it.
Stop doing that.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
CC: Jiri Olsa <jolsa@redhat.com>
CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
CC: Paul Mackerras <paulus@samba.org>
CC: Ingo Molnar <mingo@redhat.com>
CC: Arnaldo Carvalho de Melo <acme@kernel.org>
CC: x86@kernel.org
CC: linux-kernel@vger.kernel.org
---
 arch/x86/kernel/perf_regs.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index 7ab198a..a8d4e48 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -177,8 +177,6 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 		 * than just blindly copying user_regs.
 		 */
 		regs_user->abi = PERF_SAMPLE_REGS_ABI_64;
-		/* usually contains return address (same as ->ip) */
-		regs_user_copy->cx = -1;
 	} else {
 		/* We're probably in an interrupt or exception. */
 		regs_user->abi = user_64bit_mode(user_regs) ?
-- 
1.8.1.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/4] perf/x86_64: get_regs_user: Simplify regs_user->abi setting code
  2015-04-10 13:06 [PATCH 1/4] perf/x86_64: get_regs_user: Do not guess user_regs->cs,ss,sp Denys Vlasenko
  2015-04-10 13:06 ` [PATCH 2/4] perf/x86_64: get_regs_user: Do report user_regs->cx while we are in syscall Denys Vlasenko
@ 2015-04-10 13:06 ` Denys Vlasenko
  2015-04-12 17:26   ` [tip:x86/asm] perf/x86/64: Simplify regs_user-> abi setting code in get_regs_user() tip-bot for Denys Vlasenko
  2015-04-10 13:06 ` [PATCH 4/4] perf/x86_64: get_regs_user: Report regs_user->ax too Denys Vlasenko
  2015-04-12 17:26 ` [tip:x86/asm] perf/x86/64: Do not guess user_regs->cs, ss, sp " tip-bot for Denys Vlasenko
  3 siblings, 1 reply; 8+ messages in thread
From: Denys Vlasenko @ 2015-04-10 13:06 UTC (permalink / raw)
  To: linux-kernel
  Cc: Denys Vlasenko, Jiri Olsa, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Arnaldo Carvalho de Melo, x86

user_64bit_mode(regs) basically checks regs->cs to point to a 64-bit segment.
This check used to be unreliable here because regs->cs was not always correct
in syscalls.

Now regs->cs is always correct: in syscalls, in interrupts, in exceptions.
No need to emply heuristics here.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
CC: Jiri Olsa <jolsa@redhat.com>
CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
CC: Paul Mackerras <paulus@samba.org>
CC: Ingo Molnar <mingo@redhat.com>
CC: Arnaldo Carvalho de Melo <acme@kernel.org>
CC: x86@kernel.org
CC: linux-kernel@vger.kernel.org
---
 arch/x86/kernel/perf_regs.c | 18 ++----------------
 1 file changed, 2 insertions(+), 16 deletions(-)

diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index a8d4e48..8157d39 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -166,22 +166,8 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	 * be careful not to look at any other percpu variables that might
 	 * change during context switches.
 	 */
-	if (IS_ENABLED(CONFIG_IA32_EMULATION) &&
-	    task_thread_info(current)->status & TS_COMPAT) {
-		/* Easy case: we're in a compat syscall. */
-		regs_user->abi = PERF_SAMPLE_REGS_ABI_32;
-	} else if (user_regs->orig_ax != -1) {
-		/*
-		 * We're probably in a 64-bit syscall.
-		 * Warning: this code is severely racy.  At least it's better
-		 * than just blindly copying user_regs.
-		 */
-		regs_user->abi = PERF_SAMPLE_REGS_ABI_64;
-	} else {
-		/* We're probably in an interrupt or exception. */
-		regs_user->abi = user_64bit_mode(user_regs) ?
-			PERF_SAMPLE_REGS_ABI_64 : PERF_SAMPLE_REGS_ABI_32;
-	}
+	regs_user->abi = user_64bit_mode(user_regs) ?
+		PERF_SAMPLE_REGS_ABI_64 : PERF_SAMPLE_REGS_ABI_32;
 
 	regs_user->regs = regs_user_copy;
 }
-- 
1.8.1.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/4] perf/x86_64: get_regs_user: Report regs_user->ax too
  2015-04-10 13:06 [PATCH 1/4] perf/x86_64: get_regs_user: Do not guess user_regs->cs,ss,sp Denys Vlasenko
  2015-04-10 13:06 ` [PATCH 2/4] perf/x86_64: get_regs_user: Do report user_regs->cx while we are in syscall Denys Vlasenko
  2015-04-10 13:06 ` [PATCH 3/4] perf/x86_64: get_regs_user: Simplify regs_user->abi setting code Denys Vlasenko
@ 2015-04-10 13:06 ` Denys Vlasenko
  2015-04-12 17:26   ` [tip:x86/asm] perf/x86/64: Report regs_user-> ax too in get_regs_user() tip-bot for Denys Vlasenko
  2015-04-12 17:26 ` [tip:x86/asm] perf/x86/64: Do not guess user_regs->cs, ss, sp " tip-bot for Denys Vlasenko
  3 siblings, 1 reply; 8+ messages in thread
From: Denys Vlasenko @ 2015-04-10 13:06 UTC (permalink / raw)
  To: linux-kernel
  Cc: Denys Vlasenko, Jiri Olsa, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Arnaldo Carvalho de Melo, x86

I don't see why we report e.g. orix_ax, which is not always meaningful,
but don't report ax, which is meaningful.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
CC: Jiri Olsa <jolsa@redhat.com>
CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
CC: Paul Mackerras <paulus@samba.org>
CC: Ingo Molnar <mingo@redhat.com>
CC: Arnaldo Carvalho de Melo <acme@kernel.org>
CC: x86@kernel.org
CC: linux-kernel@vger.kernel.org
---
 arch/x86/kernel/perf_regs.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index 8157d39..da8cb98 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -135,6 +135,7 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	 * On 32-bit entry points, they are saved too except r8..r11.
 	 */
 	regs_user_copy->ip = user_regs->ip;
+	regs_user_copy->ax = user_regs->ax;
 	regs_user_copy->cx = user_regs->cx;
 	regs_user_copy->dx = user_regs->dx;
 	regs_user_copy->si = user_regs->si;
-- 
1.8.1.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [tip:x86/asm] perf/x86/64: Do not guess user_regs->cs, ss, sp in get_regs_user()
  2015-04-10 13:06 [PATCH 1/4] perf/x86_64: get_regs_user: Do not guess user_regs->cs,ss,sp Denys Vlasenko
                   ` (2 preceding siblings ...)
  2015-04-10 13:06 ` [PATCH 4/4] perf/x86_64: get_regs_user: Report regs_user->ax too Denys Vlasenko
@ 2015-04-12 17:26 ` tip-bot for Denys Vlasenko
  3 siblings, 0 replies; 8+ messages in thread
From: tip-bot for Denys Vlasenko @ 2015-04-12 17:26 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: dvlasenk, acme, a.p.zijlstra, hpa, paulus, mingo, linux-kernel,
	jolsa, tglx

Commit-ID:  aa21df0424468dbd991440d41ba0f700c5997103
Gitweb:     http://git.kernel.org/tip/aa21df0424468dbd991440d41ba0f700c5997103
Author:     Denys Vlasenko <dvlasenk@redhat.com>
AuthorDate: Fri, 10 Apr 2015 15:06:56 +0200
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Sat, 11 Apr 2015 13:08:52 +0200

perf/x86/64: Do not guess user_regs->cs, ss, sp in get_regs_user()

After recent changes to syscall entry points,
user_regs->{cs,ss,sp} are always correct. (They used to be
undefined while in syscalls).

We can report them reliably, without guessing.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1428671219-29341-1-git-send-email-dvlasenk@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/perf_regs.c | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index 02a8720..7ab198a 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -131,8 +131,8 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	}
 
 	/*
-	 * RIP, flags, and the argument registers are usually saved.
-	 * orig_ax is probably okay, too.
+	 * These registers are always saved on 64-bit syscall entry.
+	 * On 32-bit entry points, they are saved too except r8..r11.
 	 */
 	regs_user_copy->ip = user_regs->ip;
 	regs_user_copy->cx = user_regs->cx;
@@ -145,9 +145,12 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	regs_user_copy->r11 = user_regs->r11;
 	regs_user_copy->orig_ax = user_regs->orig_ax;
 	regs_user_copy->flags = user_regs->flags;
+	regs_user_copy->sp = user_regs->sp;
+	regs_user_copy->cs = user_regs->cs;
+	regs_user_copy->ss = user_regs->ss;
 
 	/*
-	 * Don't even try to report the "rest" regs.
+	 * Most system calls don't save these registers, don't report them.
 	 */
 	regs_user_copy->bx = -1;
 	regs_user_copy->bp = -1;
@@ -158,7 +161,7 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 
 	/*
 	 * For this to be at all useful, we need a reasonable guess for
-	 * sp and the ABI.  Be careful: we're in NMI context, and we're
+	 * the ABI.  Be careful: we're in NMI context, and we're
 	 * considering current to be the current task, so we should
 	 * be careful not to look at any other percpu variables that might
 	 * change during context switches.
@@ -167,9 +170,6 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	    task_thread_info(current)->status & TS_COMPAT) {
 		/* Easy case: we're in a compat syscall. */
 		regs_user->abi = PERF_SAMPLE_REGS_ABI_32;
-		regs_user_copy->sp = user_regs->sp;
-		regs_user_copy->cs = user_regs->cs;
-		regs_user_copy->ss = user_regs->ss;
 	} else if (user_regs->orig_ax != -1) {
 		/*
 		 * We're probably in a 64-bit syscall.
@@ -177,17 +177,12 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 		 * than just blindly copying user_regs.
 		 */
 		regs_user->abi = PERF_SAMPLE_REGS_ABI_64;
-		regs_user_copy->sp = user_regs->sp;
-		regs_user_copy->cs = __USER_CS;
-		regs_user_copy->ss = __USER_DS;
-		regs_user_copy->cx = -1;  /* usually contains garbage */
+		/* usually contains return address (same as ->ip) */
+		regs_user_copy->cx = -1;
 	} else {
 		/* We're probably in an interrupt or exception. */
 		regs_user->abi = user_64bit_mode(user_regs) ?
 			PERF_SAMPLE_REGS_ABI_64 : PERF_SAMPLE_REGS_ABI_32;
-		regs_user_copy->sp = user_regs->sp;
-		regs_user_copy->cs = user_regs->cs;
-		regs_user_copy->ss = user_regs->ss;
 	}
 
 	regs_user->regs = regs_user_copy;

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [tip:x86/asm] perf/x86/64: Do report user_regs-> cx while we are in syscall, in get_regs_user()
  2015-04-10 13:06 ` [PATCH 2/4] perf/x86_64: get_regs_user: Do report user_regs->cx while we are in syscall Denys Vlasenko
@ 2015-04-12 17:26   ` tip-bot for Denys Vlasenko
  0 siblings, 0 replies; 8+ messages in thread
From: tip-bot for Denys Vlasenko @ 2015-04-12 17:26 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: paulus, tglx, acme, hpa, linux-kernel, dvlasenk, a.p.zijlstra,
	jolsa, mingo

Commit-ID:  5df71b396b2d1fdd9d9f5a33e2eda5dc27c5632d
Gitweb:     http://git.kernel.org/tip/5df71b396b2d1fdd9d9f5a33e2eda5dc27c5632d
Author:     Denys Vlasenko <dvlasenk@redhat.com>
AuthorDate: Fri, 10 Apr 2015 15:06:57 +0200
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Sat, 11 Apr 2015 13:08:53 +0200

perf/x86/64: Do report user_regs->cx while we are in syscall, in get_regs_user()

Yes, it is true that cx contains return address.
It's not clear why we trash it.
Stop doing that.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1428671219-29341-2-git-send-email-dvlasenk@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/perf_regs.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index 7ab198a..a8d4e48 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -177,8 +177,6 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 		 * than just blindly copying user_regs.
 		 */
 		regs_user->abi = PERF_SAMPLE_REGS_ABI_64;
-		/* usually contains return address (same as ->ip) */
-		regs_user_copy->cx = -1;
 	} else {
 		/* We're probably in an interrupt or exception. */
 		regs_user->abi = user_64bit_mode(user_regs) ?

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [tip:x86/asm] perf/x86/64: Simplify regs_user-> abi setting code in get_regs_user()
  2015-04-10 13:06 ` [PATCH 3/4] perf/x86_64: get_regs_user: Simplify regs_user->abi setting code Denys Vlasenko
@ 2015-04-12 17:26   ` tip-bot for Denys Vlasenko
  0 siblings, 0 replies; 8+ messages in thread
From: tip-bot for Denys Vlasenko @ 2015-04-12 17:26 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, mingo, hpa, jolsa, dvlasenk, paulus, a.p.zijlstra,
	acme, tglx

Commit-ID:  32caa06091cc59651222cdc971dc21eaab36b097
Gitweb:     http://git.kernel.org/tip/32caa06091cc59651222cdc971dc21eaab36b097
Author:     Denys Vlasenko <dvlasenk@redhat.com>
AuthorDate: Fri, 10 Apr 2015 15:06:58 +0200
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Sat, 11 Apr 2015 13:08:53 +0200

perf/x86/64: Simplify regs_user->abi setting code in get_regs_user()

user_64bit_mode(regs) basically checks regs->cs to point to a
64-bit segment. This check used to be unreliable here because
regs->cs was not always correct in syscalls.

Now regs->cs is always correct: in syscalls, in interrupts, in
exceptions. No need to emply heuristics here.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1428671219-29341-3-git-send-email-dvlasenk@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/perf_regs.c | 18 ++----------------
 1 file changed, 2 insertions(+), 16 deletions(-)

diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index a8d4e48..8157d39 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -166,22 +166,8 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	 * be careful not to look at any other percpu variables that might
 	 * change during context switches.
 	 */
-	if (IS_ENABLED(CONFIG_IA32_EMULATION) &&
-	    task_thread_info(current)->status & TS_COMPAT) {
-		/* Easy case: we're in a compat syscall. */
-		regs_user->abi = PERF_SAMPLE_REGS_ABI_32;
-	} else if (user_regs->orig_ax != -1) {
-		/*
-		 * We're probably in a 64-bit syscall.
-		 * Warning: this code is severely racy.  At least it's better
-		 * than just blindly copying user_regs.
-		 */
-		regs_user->abi = PERF_SAMPLE_REGS_ABI_64;
-	} else {
-		/* We're probably in an interrupt or exception. */
-		regs_user->abi = user_64bit_mode(user_regs) ?
-			PERF_SAMPLE_REGS_ABI_64 : PERF_SAMPLE_REGS_ABI_32;
-	}
+	regs_user->abi = user_64bit_mode(user_regs) ?
+		PERF_SAMPLE_REGS_ABI_64 : PERF_SAMPLE_REGS_ABI_32;
 
 	regs_user->regs = regs_user_copy;
 }

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [tip:x86/asm] perf/x86/64: Report regs_user-> ax too in get_regs_user()
  2015-04-10 13:06 ` [PATCH 4/4] perf/x86_64: get_regs_user: Report regs_user->ax too Denys Vlasenko
@ 2015-04-12 17:26   ` tip-bot for Denys Vlasenko
  0 siblings, 0 replies; 8+ messages in thread
From: tip-bot for Denys Vlasenko @ 2015-04-12 17:26 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: dvlasenk, tglx, acme, a.p.zijlstra, hpa, paulus, jolsa, mingo,
	linux-kernel

Commit-ID:  3b75232d55680ca166dffa274d0587d5faf0a016
Gitweb:     http://git.kernel.org/tip/3b75232d55680ca166dffa274d0587d5faf0a016
Author:     Denys Vlasenko <dvlasenk@redhat.com>
AuthorDate: Fri, 10 Apr 2015 15:06:59 +0200
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Sat, 11 Apr 2015 13:08:53 +0200

perf/x86/64: Report regs_user->ax too in get_regs_user()

I don't see why we report e.g. orix_ax, which is not always
meaningful, but don't report ax, which is meaningful.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1428671219-29341-4-git-send-email-dvlasenk@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/perf_regs.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index 8157d39..da8cb98 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -135,6 +135,7 @@ void perf_get_regs_user(struct perf_regs *regs_user,
 	 * On 32-bit entry points, they are saved too except r8..r11.
 	 */
 	regs_user_copy->ip = user_regs->ip;
+	regs_user_copy->ax = user_regs->ax;
 	regs_user_copy->cx = user_regs->cx;
 	regs_user_copy->dx = user_regs->dx;
 	regs_user_copy->si = user_regs->si;

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-04-12 17:27 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-10 13:06 [PATCH 1/4] perf/x86_64: get_regs_user: Do not guess user_regs->cs,ss,sp Denys Vlasenko
2015-04-10 13:06 ` [PATCH 2/4] perf/x86_64: get_regs_user: Do report user_regs->cx while we are in syscall Denys Vlasenko
2015-04-12 17:26   ` [tip:x86/asm] perf/x86/64: Do report user_regs-> cx while we are in syscall, in get_regs_user() tip-bot for Denys Vlasenko
2015-04-10 13:06 ` [PATCH 3/4] perf/x86_64: get_regs_user: Simplify regs_user->abi setting code Denys Vlasenko
2015-04-12 17:26   ` [tip:x86/asm] perf/x86/64: Simplify regs_user-> abi setting code in get_regs_user() tip-bot for Denys Vlasenko
2015-04-10 13:06 ` [PATCH 4/4] perf/x86_64: get_regs_user: Report regs_user->ax too Denys Vlasenko
2015-04-12 17:26   ` [tip:x86/asm] perf/x86/64: Report regs_user-> ax too in get_regs_user() tip-bot for Denys Vlasenko
2015-04-12 17:26 ` [tip:x86/asm] perf/x86/64: Do not guess user_regs->cs, ss, sp " tip-bot for Denys Vlasenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.