Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1463776 > unrolled thread

Re: [PATCH] ARC: Change ld.as instruction to regular ld.

Started byAlexey Brodkin <Alexey.Brodkin@synopsys.com>
First post2016-08-16 15:20 +0200
Last post2016-08-16 17:50 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: [PATCH] ARC: Change ld.as instruction to regular ld. Alexey Brodkin <Alexey.Brodkin@synopsys.com> - 2016-08-16 15:20 +0200
    Re: [PATCH] ARC: Change ld.as instruction to regular ld. Vineet Gupta <Vineet.Gupta1@synopsys.com> - 2016-08-16 17:50 +0200

#1463776 — Re: [PATCH] ARC: Change ld.as instruction to regular ld.

FromAlexey Brodkin <Alexey.Brodkin@synopsys.com>
Date2016-08-16 15:20 +0200
SubjectRe: [PATCH] ARC: Change ld.as instruction to regular ld.
Message-ID<s6MrE-3zL-17@gated-at.bofh.it>
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>

[toc] | [next] | [standalone]


#1463905

FromVineet Gupta <Vineet.Gupta1@synopsys.com>
Date2016-08-16 17:50 +0200
Message-ID<s6OMO-4U7-23@gated-at.bofh.it>
In reply to#1463776
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

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web