linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] ARC: Change ld.as instruction to regular ld.
@ 2016-08-17  6:23 Liav Rehana
  2016-08-17 17:16 ` Vineet Gupta
  2016-08-25 12:05 ` Alexey Brodkin
  0 siblings, 2 replies; 7+ messages in thread
From: Liav Rehana @ 2016-08-17  6:23 UTC (permalink / raw)
  To: vgupta
  Cc: noamca, linux-snps-arc, linux-kernel, Vineet.Gupta1, eladkan,
	Liav Rehana

From: Liav Rehana <liavr@mellanox.com>

User mode callee regs are explicitly collected before signal delivery
or breakpoint trap. r25 is special for kernel as it serves as task
pointer, so user mode value is clobbered very early. It is saved in
pt_regs where generally only scratch (caller saved) res are saved.
The code to access the corresponding pt_regs location had a subtle bug
as it was using load/store with scaling of offset, whereas the offset
was already byte wise correct. So fix this by replacing LD.AS with a
standard LD

Signed-off-by: Liav Rehana <liavr@mellanox.com>
---
 arch/arc/include/asm/entry.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arc/include/asm/entry.h b/arch/arc/include/asm/entry.h
index 337ab6d..9d8f85d 100644
--- a/arch/arc/include/asm/entry.h
+++ b/arch/arc/include/asm/entry.h
@@ -138,7 +138,7 @@
 
 #ifdef CONFIG_ARC_CURR_IN_REG
 	; Retrieve orig r25 and save it with rest of callee_regs
-	ld.as   r12, [r12, PT_user_r25]
+	ld	r12, [r12, PT_user_r25]
 	PUSH	r12
 #else
 	PUSH	r25
@@ -194,7 +194,7 @@
 
 	; SP is back to start of pt_regs
 #ifdef CONFIG_ARC_CURR_IN_REG
-	st.as   r12, [sp, PT_user_r25]
+	st	r12, [sp, PT_user_r25]
 #endif
 .endm
 
-- 
1.7.1

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

* Re: [PATCH] ARC: Change ld.as instruction to regular ld.
  2016-08-17  6:23 [PATCH] ARC: Change ld.as instruction to regular ld Liav Rehana
@ 2016-08-17 17:16 ` Vineet Gupta
  2016-08-25 12:05 ` Alexey Brodkin
  1 sibling, 0 replies; 7+ messages in thread
From: Vineet Gupta @ 2016-08-17 17:16 UTC (permalink / raw)
  To: Liav Rehana; +Cc: noamca, linux-snps-arc, linux-kernel, eladkan

On 08/16/2016 11:24 PM, Liav Rehana wrote:
> From: Liav Rehana <liavr@mellanox.com>
>
> User mode callee regs are explicitly collected before signal delivery
> or breakpoint trap. r25 is special for kernel as it serves as task
> pointer, so user mode value is clobbered very early. It is saved in
> pt_regs where generally only scratch (caller saved) res are saved.
> The code to access the corresponding pt_regs location had a subtle bug
> as it was using load/store with scaling of offset, whereas the offset
> was already byte wise correct. So fix this by replacing LD.AS with a
> standard LD
>
> Signed-off-by: Liav Rehana <liavr@mellanox.com>

Thx for the fix Liv.
I added it to my for-curr.

-Vineet

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

* Re: [PATCH] ARC: Change ld.as instruction to regular ld.
  2016-08-17  6:23 [PATCH] ARC: Change ld.as instruction to regular ld Liav Rehana
  2016-08-17 17:16 ` Vineet Gupta
@ 2016-08-25 12:05 ` Alexey Brodkin
  2016-08-25 17:40   ` Vineet Gupta
  1 sibling, 1 reply; 7+ messages in thread
From: Alexey Brodkin @ 2016-08-25 12:05 UTC (permalink / raw)
  To: liavr
  Cc: Cupertino Miranda, linux-kernel, eladkan, noamca, Vineet Gupta,
	linux-snps-arc

Hi Liav,

On Wed, 2016-08-17 at 09:23 +0300, Liav Rehana wrote:
> From: Liav Rehana <liavr@mellanox.com>
> 
> User mode callee regs are explicitly collected before signal delivery
> or breakpoint trap. r25 is special for kernel as it serves as task
> pointer, so user mode value is clobbered very early. It is saved in
> pt_regs where generally only scratch (caller saved) res are saved.
> The code to access the corresponding pt_regs location had a subtle bug
> as it was using load/store with scaling of offset, whereas the offset
> was already byte wise correct. So fix this by replacing LD.AS with a
> standard LD
> 
> Signed-off-by: Liav Rehana <liavr@mellanox.com>

That nice patch really fixes quite annoying issue when r25 got
printed improperly in gdb!

So

Tested-by: Alexey Brodkin <abrodkin@synopsys.com>

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

* Re: [PATCH] ARC: Change ld.as instruction to regular ld.
  2016-08-25 12:05 ` Alexey Brodkin
@ 2016-08-25 17:40   ` Vineet Gupta
  0 siblings, 0 replies; 7+ messages in thread
From: Vineet Gupta @ 2016-08-25 17:40 UTC (permalink / raw)
  To: Alexey Brodkin, liavr
  Cc: Cupertino Miranda, linux-kernel, eladkan, noamca, linux-snps-arc

On 08/25/2016 05:05 AM, Alexey Brodkin wrote:
> Hi Liav,
>
> On Wed, 2016-08-17 at 09:23 +0300, Liav Rehana wrote:
>> From: Liav Rehana <liavr@mellanox.com>
>>
>> User mode callee regs are explicitly collected before signal delivery
>> or breakpoint trap. r25 is special for kernel as it serves as task
>> pointer, so user mode value is clobbered very early. It is saved in
>> pt_regs where generally only scratch (caller saved) res are saved.
>> The code to access the corresponding pt_regs location had a subtle bug
>> as it was using load/store with scaling of offset, whereas the offset
>> was already byte wise correct. So fix this by replacing LD.AS with a
>> standard LD
>>
>> Signed-off-by: Liav Rehana <liavr@mellanox.com>
> That nice patch really fixes quite annoying issue when r25 got
> printed improperly in gdb!
>
> So
>
> Tested-by: Alexey Brodkin <abrodkin@synopsys.com>


Indeed this becomes even more important given that r25 is Thread pointer regs in
ARC ABI !
This patch is already merged upstream by Linus.

Thx,
-Vineet

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

* Re: [PATCH] ARC: Change ld.as instruction to regular ld.
  2016-08-16 13:15 ` Alexey Brodkin
@ 2016-08-16 15:47   ` Vineet Gupta
  0 siblings, 0 replies; 7+ messages in thread
From: Vineet Gupta @ 2016-08-16 15:47 UTC (permalink / raw)
  To: Alexey Brodkin, liavr; +Cc: noamca, linux-snps-arc, linux-kernel, eladkan

On 08/16/2016 06:15 AM, Alexey Brodkin wrote:
> Hi Liav,
> 
> On Tue, 2016-08-16 at 10:55 +0300, Liav Rehana wrote:
>> From: Liav Rehana <liavr@mellanox.com>
>>
>> The instruction ld.as takes as operands a base address and an offset,
>> and doesn't access the sum of these two, but the sum of the base
>> address and a shifted version of the offset.
>> This isn't what we want in that case, since it causes a bug during
>> the push and pop of r25, since his actual offset is given during
>> resume_user_mode_begin.
>> Thus, the use of ld solves this problem.
>>
>> Signed-off-by: Liav Rehana <liavr@mellanox.com>
>> ---
> 
> Very nice catch!
> 
> But IMHO description could be improved a little bit.
> Probably something like that:
> --------------------->8---------------------
> "PT_user_r25" is offset in bytes within pt_regs structure.
> 
> In its turn what "ld.as r1, [r2, x]" really does is
> r1 <- load_from(r2 + (x << data_size)) = load_from(r2 + x*4).
> 
> But the code in question is supposed to load_from(r2 + x).
> 
> This leads to obvious stack corruption.
> --------------------->8---------------------

Right - this is much better. A good changelog also needs to explain the context of
problem. How does below sound ...

-------->
User mode callee regs are explicitly collected before signal delivery or
breakpoint trap. r25 is special for kernel as it serves as task pointer,
so user mode value is clobbered very early. It is saved in pt_regs where
generally only scratch (caller saved) res are saved.

The code to access the corresponding pt_regs location had a subtle bug as
it was using load/store with scaling of offset, whereas the offset was already
byte wise correct. So fix this by replacing LD.AS with a standard LD

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

* Re: [PATCH] ARC: Change ld.as instruction to regular ld.
  2016-08-16  7:55 Liav Rehana
@ 2016-08-16 13:15 ` Alexey Brodkin
  2016-08-16 15:47   ` Vineet Gupta
  0 siblings, 1 reply; 7+ messages in thread
From: Alexey Brodkin @ 2016-08-16 13:15 UTC (permalink / raw)
  To: liavr; +Cc: linux-kernel, eladkan, noamca, Vineet Gupta, linux-snps-arc

Hi Liav,

On Tue, 2016-08-16 at 10:55 +0300, Liav Rehana wrote:
> From: Liav Rehana <liavr@mellanox.com>
> 
> The instruction ld.as takes as operands a base address and an offset,
> and doesn't access the sum of these two, but the sum of the base
> address and a shifted version of the offset.
> This isn't what we want in that case, since it causes a bug during
> the push and pop of r25, since his actual offset is given during
> resume_user_mode_begin.
> Thus, the use of ld solves this problem.
> 
> Signed-off-by: Liav Rehana <liavr@mellanox.com>
> ---

Very nice catch!

But IMHO description could be improved a little bit.
Probably something like that:
--------------------->8---------------------
"PT_user_r25" is offset in bytes within pt_regs structure.

In its turn what "ld.as r1, [r2, x]" really does is
r1 <- load_from(r2 + (x << data_size)) = load_from(r2 + x*4).

But the code in question is supposed to load_from(r2 + x).

This leads to obvious stack corruption.
--------------------->8---------------------

Reviewed-by: Alexey Brodkin <abrodkin@synopsys.com>

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

* [PATCH] ARC: Change ld.as instruction to regular ld.
@ 2016-08-16  7:55 Liav Rehana
  2016-08-16 13:15 ` Alexey Brodkin
  0 siblings, 1 reply; 7+ messages in thread
From: Liav Rehana @ 2016-08-16  7:55 UTC (permalink / raw)
  To: vgupta
  Cc: vineet.gupta1, noamca, linux-snps-arc, linux-kernel, eladkan,
	Liav Rehana

From: Liav Rehana <liavr@mellanox.com>

The instruction ld.as takes as operands a base address and an offset,
and doesn't access the sum of these two, but the sum of the base
address and a shifted version of the offset.
This isn't what we want in that case, since it causes a bug during
the push and pop of r25, since his actual offset is given during
resume_user_mode_begin.
Thus, the use of ld solves this problem.

Signed-off-by: Liav Rehana <liavr@mellanox.com>
---
 arch/arc/include/asm/entry.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arc/include/asm/entry.h b/arch/arc/include/asm/entry.h
index 337ab6d..9d8f85d 100644
--- a/arch/arc/include/asm/entry.h
+++ b/arch/arc/include/asm/entry.h
@@ -138,7 +138,7 @@
 
 #ifdef CONFIG_ARC_CURR_IN_REG
 	; Retrieve orig r25 and save it with rest of callee_regs
-	ld.as   r12, [r12, PT_user_r25]
+	ld	r12, [r12, PT_user_r25]
 	PUSH	r12
 #else
 	PUSH	r25
@@ -194,7 +194,7 @@
 
 	; SP is back to start of pt_regs
 #ifdef CONFIG_ARC_CURR_IN_REG
-	st.as   r12, [sp, PT_user_r25]
+	st	r12, [sp, PT_user_r25]
 #endif
 .endm
 
-- 
1.7.1

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

end of thread, other threads:[~2016-08-25 17:41 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-17  6:23 [PATCH] ARC: Change ld.as instruction to regular ld Liav Rehana
2016-08-17 17:16 ` Vineet Gupta
2016-08-25 12:05 ` Alexey Brodkin
2016-08-25 17:40   ` Vineet Gupta
  -- strict thread matches above, loose matches on Subject: below --
2016-08-16  7:55 Liav Rehana
2016-08-16 13:15 ` Alexey Brodkin
2016-08-16 15:47   ` Vineet Gupta

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).