diff mbox series

MIPS: Loongson-3: Fix fp register access if MSA enabled

Message ID 1598255043-11839-1-git-send-email-chenhc@lemote.com (mailing list archive)
State Accepted
Commit 01ce6d4d2c8157b076425e3dd8319948652583c5
Headers show
Series MIPS: Loongson-3: Fix fp register access if MSA enabled | expand

Commit Message

Huacai Chen Aug. 24, 2020, 7:44 a.m. UTC
If MSA is enabled, FPU_REG_WIDTH is 128 rather than 64, then get_fpr64()
/set_fpr64() in the original unaligned instruction emulation code access
the wrong fp registers. This is because the current code doesn't specify
the correct index field, so fix it.

Fixes: f83e4f9896eff614d0f2547a ("MIPS: Loongson-3: Add some unaligned instructions emulation")
Signed-off-by: Huacai Chen <chenhc@lemote.com>
Signed-off-by: Pei Huang <huangpei@loongson.cn>
---
 arch/mips/loongson64/cop2-ex.c | 24 ++++++++----------------
 1 file changed, 8 insertions(+), 16 deletions(-)

Comments

Huacai Chen Sept. 22, 2020, 2:06 a.m. UTC | #1
Ping?

On Mon, Aug 24, 2020 at 3:40 PM Huacai Chen <chenhc@lemote.com> wrote:
>
> If MSA is enabled, FPU_REG_WIDTH is 128 rather than 64, then get_fpr64()
> /set_fpr64() in the original unaligned instruction emulation code access
> the wrong fp registers. This is because the current code doesn't specify
> the correct index field, so fix it.
>
> Fixes: f83e4f9896eff614d0f2547a ("MIPS: Loongson-3: Add some unaligned instructions emulation")
> Signed-off-by: Huacai Chen <chenhc@lemote.com>
> Signed-off-by: Pei Huang <huangpei@loongson.cn>
> ---
>  arch/mips/loongson64/cop2-ex.c | 24 ++++++++----------------
>  1 file changed, 8 insertions(+), 16 deletions(-)
>
> diff --git a/arch/mips/loongson64/cop2-ex.c b/arch/mips/loongson64/cop2-ex.c
> index f130f62..00055d4 100644
> --- a/arch/mips/loongson64/cop2-ex.c
> +++ b/arch/mips/loongson64/cop2-ex.c
> @@ -95,10 +95,8 @@ static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
>                         if (res)
>                                 goto fault;
>
> -                       set_fpr64(current->thread.fpu.fpr,
> -                               insn.loongson3_lswc2_format.rt, value);
> -                       set_fpr64(current->thread.fpu.fpr,
> -                               insn.loongson3_lswc2_format.rq, value_next);
> +                       set_fpr64(&current->thread.fpu.fpr[insn.loongson3_lswc2_format.rt], 0, value);
> +                       set_fpr64(&current->thread.fpu.fpr[insn.loongson3_lswc2_format.rq], 0, value_next);
>                         compute_return_epc(regs);
>                         own_fpu(1);
>                 }
> @@ -130,15 +128,13 @@ static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
>                                 goto sigbus;
>
>                         lose_fpu(1);
> -                       value_next = get_fpr64(current->thread.fpu.fpr,
> -                                       insn.loongson3_lswc2_format.rq);
> +                       value_next = get_fpr64(&current->thread.fpu.fpr[insn.loongson3_lswc2_format.rq], 0);
>
>                         StoreDW(addr + 8, value_next, res);
>                         if (res)
>                                 goto fault;
>
> -                       value = get_fpr64(current->thread.fpu.fpr,
> -                                       insn.loongson3_lswc2_format.rt);
> +                       value = get_fpr64(&current->thread.fpu.fpr[insn.loongson3_lswc2_format.rt], 0);
>
>                         StoreDW(addr, value, res);
>                         if (res)
> @@ -204,8 +200,7 @@ static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
>                         if (res)
>                                 goto fault;
>
> -                       set_fpr64(current->thread.fpu.fpr,
> -                                       insn.loongson3_lsdc2_format.rt, value);
> +                       set_fpr64(&current->thread.fpu.fpr[insn.loongson3_lsdc2_format.rt], 0, value);
>                         compute_return_epc(regs);
>                         own_fpu(1);
>
> @@ -221,8 +216,7 @@ static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
>                         if (res)
>                                 goto fault;
>
> -                       set_fpr64(current->thread.fpu.fpr,
> -                                       insn.loongson3_lsdc2_format.rt, value);
> +                       set_fpr64(&current->thread.fpu.fpr[insn.loongson3_lsdc2_format.rt], 0, value);
>                         compute_return_epc(regs);
>                         own_fpu(1);
>                         break;
> @@ -286,8 +280,7 @@ static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
>                                 goto sigbus;
>
>                         lose_fpu(1);
> -                       value = get_fpr64(current->thread.fpu.fpr,
> -                                       insn.loongson3_lsdc2_format.rt);
> +                       value = get_fpr64(&current->thread.fpu.fpr[insn.loongson3_lsdc2_format.rt], 0);
>
>                         StoreW(addr, value, res);
>                         if (res)
> @@ -305,8 +298,7 @@ static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
>                                 goto sigbus;
>
>                         lose_fpu(1);
> -                       value = get_fpr64(current->thread.fpu.fpr,
> -                                       insn.loongson3_lsdc2_format.rt);
> +                       value = get_fpr64(&current->thread.fpu.fpr[insn.loongson3_lsdc2_format.rt], 0);
>
>                         StoreDW(addr, value, res);
>                         if (res)
> --
> 2.7.0
>
Thomas Bogendoerfer Sept. 22, 2020, 7:03 a.m. UTC | #2
On Tue, Sep 22, 2020 at 10:06:24AM +0800, Huacai Chen wrote:
> On Mon, Aug 24, 2020 at 3:40 PM Huacai Chen <chenhc@lemote.com> wrote:
> >
> > If MSA is enabled, FPU_REG_WIDTH is 128 rather than 64, then get_fpr64()
> > /set_fpr64() in the original unaligned instruction emulation code access
> > the wrong fp registers. This is because the current code doesn't specify
> > the correct index field, so fix it.
> >
> > Fixes: f83e4f9896eff614d0f2547a ("MIPS: Loongson-3: Add some unaligned instructions emulation")
> > Signed-off-by: Huacai Chen <chenhc@lemote.com>
> > Signed-off-by: Pei Huang <huangpei@loongson.cn>
> > ---
> >  arch/mips/loongson64/cop2-ex.c | 24 ++++++++----------------
> >  1 file changed, 8 insertions(+), 16 deletions(-)

should this go via mips-fixes ?

Thomas.
Huacai Chen Sept. 22, 2020, 8:44 a.m. UTC | #3
Hi, Thomas,

On Tue, Sep 22, 2020 at 3:04 PM Thomas Bogendoerfer
<tsbogend@alpha.franken.de> wrote:
>
> On Tue, Sep 22, 2020 at 10:06:24AM +0800, Huacai Chen wrote:
> > On Mon, Aug 24, 2020 at 3:40 PM Huacai Chen <chenhc@lemote.com> wrote:
> > >
> > > If MSA is enabled, FPU_REG_WIDTH is 128 rather than 64, then get_fpr64()
> > > /set_fpr64() in the original unaligned instruction emulation code access
> > > the wrong fp registers. This is because the current code doesn't specify
> > > the correct index field, so fix it.
> > >
> > > Fixes: f83e4f9896eff614d0f2547a ("MIPS: Loongson-3: Add some unaligned instructions emulation")
> > > Signed-off-by: Huacai Chen <chenhc@lemote.com>
> > > Signed-off-by: Pei Huang <huangpei@loongson.cn>
> > > ---
> > >  arch/mips/loongson64/cop2-ex.c | 24 ++++++++----------------
> > >  1 file changed, 8 insertions(+), 16 deletions(-)
>
> should this go via mips-fixes ?
Yes, it should go.

Huacai
>
> Thomas.
>
> --
> Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
> good idea.                                                [ RFC1925, 2.3 ]
Thomas Bogendoerfer Sept. 22, 2020, 11:26 a.m. UTC | #4
On Mon, Aug 24, 2020 at 03:44:03PM +0800, Huacai Chen wrote:
> If MSA is enabled, FPU_REG_WIDTH is 128 rather than 64, then get_fpr64()
> /set_fpr64() in the original unaligned instruction emulation code access
> the wrong fp registers. This is because the current code doesn't specify
> the correct index field, so fix it.
> 
> Fixes: f83e4f9896eff614d0f2547a ("MIPS: Loongson-3: Add some unaligned instructions emulation")
> Signed-off-by: Huacai Chen <chenhc@lemote.com>
> Signed-off-by: Pei Huang <huangpei@loongson.cn>
> ---
>  arch/mips/loongson64/cop2-ex.c | 24 ++++++++----------------
>  1 file changed, 8 insertions(+), 16 deletions(-)

applied to mips-fixes.

Thomas.
diff mbox series

Patch

diff --git a/arch/mips/loongson64/cop2-ex.c b/arch/mips/loongson64/cop2-ex.c
index f130f62..00055d4 100644
--- a/arch/mips/loongson64/cop2-ex.c
+++ b/arch/mips/loongson64/cop2-ex.c
@@ -95,10 +95,8 @@  static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
 			if (res)
 				goto fault;
 
-			set_fpr64(current->thread.fpu.fpr,
-				insn.loongson3_lswc2_format.rt, value);
-			set_fpr64(current->thread.fpu.fpr,
-				insn.loongson3_lswc2_format.rq, value_next);
+			set_fpr64(&current->thread.fpu.fpr[insn.loongson3_lswc2_format.rt], 0, value);
+			set_fpr64(&current->thread.fpu.fpr[insn.loongson3_lswc2_format.rq], 0, value_next);
 			compute_return_epc(regs);
 			own_fpu(1);
 		}
@@ -130,15 +128,13 @@  static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
 				goto sigbus;
 
 			lose_fpu(1);
-			value_next = get_fpr64(current->thread.fpu.fpr,
-					insn.loongson3_lswc2_format.rq);
+			value_next = get_fpr64(&current->thread.fpu.fpr[insn.loongson3_lswc2_format.rq], 0);
 
 			StoreDW(addr + 8, value_next, res);
 			if (res)
 				goto fault;
 
-			value = get_fpr64(current->thread.fpu.fpr,
-					insn.loongson3_lswc2_format.rt);
+			value = get_fpr64(&current->thread.fpu.fpr[insn.loongson3_lswc2_format.rt], 0);
 
 			StoreDW(addr, value, res);
 			if (res)
@@ -204,8 +200,7 @@  static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
 			if (res)
 				goto fault;
 
-			set_fpr64(current->thread.fpu.fpr,
-					insn.loongson3_lsdc2_format.rt, value);
+			set_fpr64(&current->thread.fpu.fpr[insn.loongson3_lsdc2_format.rt], 0, value);
 			compute_return_epc(regs);
 			own_fpu(1);
 
@@ -221,8 +216,7 @@  static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
 			if (res)
 				goto fault;
 
-			set_fpr64(current->thread.fpu.fpr,
-					insn.loongson3_lsdc2_format.rt, value);
+			set_fpr64(&current->thread.fpu.fpr[insn.loongson3_lsdc2_format.rt], 0, value);
 			compute_return_epc(regs);
 			own_fpu(1);
 			break;
@@ -286,8 +280,7 @@  static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
 				goto sigbus;
 
 			lose_fpu(1);
-			value = get_fpr64(current->thread.fpu.fpr,
-					insn.loongson3_lsdc2_format.rt);
+			value = get_fpr64(&current->thread.fpu.fpr[insn.loongson3_lsdc2_format.rt], 0);
 
 			StoreW(addr, value, res);
 			if (res)
@@ -305,8 +298,7 @@  static int loongson_cu2_call(struct notifier_block *nfb, unsigned long action,
 				goto sigbus;
 
 			lose_fpu(1);
-			value = get_fpr64(current->thread.fpu.fpr,
-					insn.loongson3_lsdc2_format.rt);
+			value = get_fpr64(&current->thread.fpu.fpr[insn.loongson3_lsdc2_format.rt], 0);
 
 			StoreDW(addr, value, res);
 			if (res)