Re: [PATCH] powerpc: remove fpscr use from [kvm_]cvt_{fd,df}

2010-08-24 Thread Benjamin Herrenschmidt
On Tue, 2010-08-24 at 15:15 +1000, Michael Neuling wrote:
   Do some 32 bit processors need this? 
   
   In 32 bit before the merge, we use to have code that did:
   
 #if defined(CONFIG_4xx) || defined(CONFIG_E500)
  #define cvt_fd without save/restore fpscr
 #else
  #define cvt_fd with save/restore fpscr
 #end if
   
   Kumar; does this ring any bells?
  
  I don't see anything in the various 440 docs I have at hand that would
  hint at lfd/stfs adffecting FPSCR.
 
 The way the ifdefs are, it's the other way around.  4xx procs don't need
 to save/restore fpscr and others do.

Right, my bad. In any case, Paulus reckons it's all his mistake and we
really never need to save/restore fpscr.

Cheers,
Ben.


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] powerpc: remove fpscr use from [kvm_]cvt_{fd,df}

2010-08-24 Thread Michael Neuling
In message 1282699836.22370.566.ca...@pasglop you wrote:
 On Tue, 2010-08-24 at 15:15 +1000, Michael Neuling wrote:
Do some 32 bit processors need this? 

In 32 bit before the merge, we use to have code that did:

  #if defined(CONFIG_4xx) || defined(CONFIG_E500)
   #define cvt_fd without save/restore fpscr
  #else
   #define cvt_fd with save/restore fpscr
  #end if

Kumar; does this ring any bells?
   
   I don't see anything in the various 440 docs I have at hand that would
   hint at lfd/stfs adffecting FPSCR.
  
  The way the ifdefs are, it's the other way around.  4xx procs don't need
  to save/restore fpscr and others do.
 
 Right, my bad. In any case, Paulus reckons it's all his mistake and we
 really never need to save/restore fpscr.

ACK :-P

Mikey
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] powerpc: remove fpscr use from [kvm_]cvt_{fd,df}

2010-08-23 Thread Benjamin Herrenschmidt
On Mon, 2010-08-23 at 10:23 +1000, Michael Neuling wrote:
  Neither lfs nor stfs touch the fpscr, so remove the restore/save of it
  around them.
 
 Do some 32 bit processors need this? 
 
 In 32 bit before the merge, we use to have code that did:
 
   #if defined(CONFIG_4xx) || defined(CONFIG_E500)
#define cvt_fd without save/restore fpscr
   #else
#define cvt_fd with save/restore fpscr
   #end if
 
 Kumar; does this ring any bells?

I don't see anything in the various 440 docs I have at hand that would
hint at lfd/stfs adffecting FPSCR.

Cheers,
Ben.

 (The addition of this predates even bitkeeper)
 
 Mikey
  
  Signed-off-by: Andreas Schwab sch...@linux-m68k.org
  ---
   arch/powerpc/include/asm/kvm_fpu.h   |4 +-
   arch/powerpc/include/asm/system.h|4 +-
   arch/powerpc/kernel/align.c  |4 +-
   arch/powerpc/kernel/fpu.S|   10 ---
   arch/powerpc/kvm/book3s_paired_singles.c |   44 
  +---
 -
   arch/powerpc/kvm/fpu.S   |8 -
   6 files changed, 26 insertions(+), 48 deletions(-)
  
  diff --git a/arch/powerpc/include/asm/kvm_fpu.h 
  b/arch/powerpc/include/asm/kv
 m_fpu.h
  index c3d4f05..92daae1 100644
  --- a/arch/powerpc/include/asm/kvm_fpu.h
  +++ b/arch/powerpc/include/asm/kvm_fpu.h
  @@ -82,7 +82,7 @@ FPD_THREE_IN(fmadd)
   FPD_THREE_IN(fnmsub)
   FPD_THREE_IN(fnmadd)
   
  -extern void kvm_cvt_fd(u32 *from, u64 *to, u64 *fpscr);
  -extern void kvm_cvt_df(u64 *from, u32 *to, u64 *fpscr);
  +extern void kvm_cvt_fd(u32 *from, u64 *to);
  +extern void kvm_cvt_df(u64 *from, u32 *to);
   
   #endif
  diff --git a/arch/powerpc/include/asm/system.h 
  b/arch/powerpc/include/asm/sys
 tem.h
  index 6c294ac..0b3fe78 100644
  --- a/arch/powerpc/include/asm/system.h
  +++ b/arch/powerpc/include/asm/system.h
  @@ -154,8 +154,8 @@ extern void enable_kernel_spe(void);
   extern void giveup_spe(struct task_struct *);
   extern void load_up_spe(struct task_struct *);
   extern int fix_alignment(struct pt_regs *);
  -extern void cvt_fd(float *from, double *to, struct thread_struct *thread);
  -extern void cvt_df(double *from, float *to, struct thread_struct *thread);
  +extern void cvt_fd(float *from, double *to);
  +extern void cvt_df(double *from, float *to);
   
   #ifndef CONFIG_SMP
   extern void discard_lazy_cpu_state(void);
  diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c
  index b876e98..8184ee9 100644
  --- a/arch/powerpc/kernel/align.c
  +++ b/arch/powerpc/kernel/align.c
  @@ -889,7 +889,7 @@ int fix_alignment(struct pt_regs *regs)
   #ifdef CONFIG_PPC_FPU
  preempt_disable();
  enable_kernel_fp();
  -   cvt_df(data.dd, (float *)data.v[4], current-thread)
 ;
  +   cvt_df(data.dd, (float *)data.v[4]);
  preempt_enable();
   #else
  return 0;
  @@ -933,7 +933,7 @@ int fix_alignment(struct pt_regs *regs)
   #ifdef CONFIG_PPC_FPU
  preempt_disable();
  enable_kernel_fp();
  -   cvt_fd((float *)data.v[4], data.dd, current-thread);
  +   cvt_fd((float *)data.v[4], data.dd);
  preempt_enable();
   #else
  return 0;
  diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S
  index fc8f5b1..e86c040 100644
  --- a/arch/powerpc/kernel/fpu.S
  +++ b/arch/powerpc/kernel/fpu.S
  @@ -163,24 +163,14 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
   /*
* These are used in the alignment trap handler when emulating
* single-precision loads and stores.
  - * We restore and save the fpscr so the task gets the same result
  - * and exceptions as if the cpu had performed the load or store.
*/
   
   _GLOBAL(cvt_fd)
  -   lfd 0,THREAD_FPSCR(r5)  /* load up fpscr value */
  -   MTFSF_L(0)
  lfs 0,0(r3)
  stfd0,0(r4)
  -   mffs0
  -   stfd0,THREAD_FPSCR(r5)  /* save new fpscr value */
  blr
   
   _GLOBAL(cvt_df)
  -   lfd 0,THREAD_FPSCR(r5)  /* load up fpscr value */
  -   MTFSF_L(0)
  lfd 0,0(r3)
  stfs0,0(r4)
  -   mffs0
  -   stfd0,THREAD_FPSCR(r5)  /* save new fpscr value */
  blr
  diff --git a/arch/powerpc/kvm/book3s_paired_singles.c 
  b/arch/powerpc/kvm/book
 3s_paired_singles.c
  index 474f2e2..35a701f 100644
  --- a/arch/powerpc/kvm/book3s_paired_singles.c
  +++ b/arch/powerpc/kvm/book3s_paired_singles.c
  @@ -159,7 +159,7 @@
   
   static inline void kvmppc_sync_qpr(struct kvm_vcpu *vcpu, int rt)
   {
  -   kvm_cvt_df(vcpu-arch.fpr[rt], vcpu-arch.qpr[rt], vcpu-arch.fpscr)
 ;
  +   kvm_cvt_df(vcpu-arch.fpr[rt], vcpu-arch.qpr[rt]);
   }
   
   static void kvmppc_inject_pf(struct kvm_vcpu *vcpu, ulong eaddr, bool 
  is_sto
 re)
  @@ -204,7 +204,7 @@ static int kvmppc_emulate_fpr_load(struct kvm_run *run, 
  s
 truct kvm_vcpu *vcpu,
  /* put in registers */
  switch (ls_type) {
  case FPU_LS_SINGLE:
  -   

Re: [PATCH] powerpc: remove fpscr use from [kvm_]cvt_{fd,df}

2010-08-23 Thread Michael Neuling
  Do some 32 bit processors need this? 
  
  In 32 bit before the merge, we use to have code that did:
  
#if defined(CONFIG_4xx) || defined(CONFIG_E500)
 #define cvt_fd without save/restore fpscr
#else
 #define cvt_fd with save/restore fpscr
#end if
  
  Kumar; does this ring any bells?
 
 I don't see anything in the various 440 docs I have at hand that would
 hint at lfd/stfs adffecting FPSCR.

The way the ifdefs are, it's the other way around.  4xx procs don't need
to save/restore fpscr and others do.

Mikey
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] powerpc: remove fpscr use from [kvm_]cvt_{fd,df}

2010-08-23 Thread Benjamin Herrenschmidt

 The way the ifdefs are, it's the other way around.  4xx procs don't need
 to save/restore fpscr and others do.

Hrm, oh well, 601 manual says FPSCR is unaffected too :-)

Cheers,
Ben. 

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] powerpc: remove fpscr use from [kvm_]cvt_{fd,df}

2010-08-23 Thread Kumar Gala

On Aug 22, 2010, at 7:23 PM, Michael Neuling wrote:

 Neither lfs nor stfs touch the fpscr, so remove the restore/save of it
 around them.
 
 Do some 32 bit processors need this? 
 
 In 32 bit before the merge, we use to have code that did:
 
  #if defined(CONFIG_4xx) || defined(CONFIG_E500)
   #define cvt_fd without save/restore fpscr
  #else
   #define cvt_fd with save/restore fpscr
  #end if
 
 Kumar; does this ring any bells?
 
 (The addition of this predates even bitkeeper)
 
 Mikey

Not really.  However if the ifdef is as you say that seems wrong to me.  We 
should be using CONFIG_PPC_FPU or !CONFIG_PPC_FPU.  As both 4xx and E500 have 
variants w/FPUs.

- k
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH] powerpc: remove fpscr use from [kvm_]cvt_{fd,df}

2010-08-23 Thread Michael Neuling
  Neither lfs nor stfs touch the fpscr, so remove the restore/save of =
 it
  around them.
 =20
  Do some 32 bit processors need this?=20
 =20
  In 32 bit before the merge, we use to have code that did:
 =20
   #if defined(CONFIG_4xx) || defined(CONFIG_E500)
#define cvt_fd without save/restore fpscr
   #else
#define cvt_fd with save/restore fpscr
   #end if
 =20
  Kumar; does this ring any bells?
 =20
  (The addition of this predates even bitkeeper)
 =20
  Mikey
 
 Not really.  However if the ifdef is as you say that seems wrong to
 me.  We should be using CONFIG_PPC_FPU or !CONFIG_PPC_FPU.  As both
 4xx and E500 have variants w/FPUs.

It actually got changed to CONFIG_PPC_FPU, then dwg merged it with some
other versions that were around.  

Mikey
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH] powerpc: remove fpscr use from [kvm_]cvt_{fd,df}

2010-08-21 Thread Andreas Schwab
Neither lfs nor stfs touch the fpscr, so remove the restore/save of it
around them.

Signed-off-by: Andreas Schwab sch...@linux-m68k.org
---
 arch/powerpc/include/asm/kvm_fpu.h   |4 +-
 arch/powerpc/include/asm/system.h|4 +-
 arch/powerpc/kernel/align.c  |4 +-
 arch/powerpc/kernel/fpu.S|   10 ---
 arch/powerpc/kvm/book3s_paired_singles.c |   44 +
 arch/powerpc/kvm/fpu.S   |8 -
 6 files changed, 26 insertions(+), 48 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_fpu.h 
b/arch/powerpc/include/asm/kvm_fpu.h
index c3d4f05..92daae1 100644
--- a/arch/powerpc/include/asm/kvm_fpu.h
+++ b/arch/powerpc/include/asm/kvm_fpu.h
@@ -82,7 +82,7 @@ FPD_THREE_IN(fmadd)
 FPD_THREE_IN(fnmsub)
 FPD_THREE_IN(fnmadd)
 
-extern void kvm_cvt_fd(u32 *from, u64 *to, u64 *fpscr);
-extern void kvm_cvt_df(u64 *from, u32 *to, u64 *fpscr);
+extern void kvm_cvt_fd(u32 *from, u64 *to);
+extern void kvm_cvt_df(u64 *from, u32 *to);
 
 #endif
diff --git a/arch/powerpc/include/asm/system.h 
b/arch/powerpc/include/asm/system.h
index 6c294ac..0b3fe78 100644
--- a/arch/powerpc/include/asm/system.h
+++ b/arch/powerpc/include/asm/system.h
@@ -154,8 +154,8 @@ extern void enable_kernel_spe(void);
 extern void giveup_spe(struct task_struct *);
 extern void load_up_spe(struct task_struct *);
 extern int fix_alignment(struct pt_regs *);
-extern void cvt_fd(float *from, double *to, struct thread_struct *thread);
-extern void cvt_df(double *from, float *to, struct thread_struct *thread);
+extern void cvt_fd(float *from, double *to);
+extern void cvt_df(double *from, float *to);
 
 #ifndef CONFIG_SMP
 extern void discard_lazy_cpu_state(void);
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c
index b876e98..8184ee9 100644
--- a/arch/powerpc/kernel/align.c
+++ b/arch/powerpc/kernel/align.c
@@ -889,7 +889,7 @@ int fix_alignment(struct pt_regs *regs)
 #ifdef CONFIG_PPC_FPU
preempt_disable();
enable_kernel_fp();
-   cvt_df(data.dd, (float *)data.v[4], current-thread);
+   cvt_df(data.dd, (float *)data.v[4]);
preempt_enable();
 #else
return 0;
@@ -933,7 +933,7 @@ int fix_alignment(struct pt_regs *regs)
 #ifdef CONFIG_PPC_FPU
preempt_disable();
enable_kernel_fp();
-   cvt_fd((float *)data.v[4], data.dd, current-thread);
+   cvt_fd((float *)data.v[4], data.dd);
preempt_enable();
 #else
return 0;
diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S
index fc8f5b1..e86c040 100644
--- a/arch/powerpc/kernel/fpu.S
+++ b/arch/powerpc/kernel/fpu.S
@@ -163,24 +163,14 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
 /*
  * These are used in the alignment trap handler when emulating
  * single-precision loads and stores.
- * We restore and save the fpscr so the task gets the same result
- * and exceptions as if the cpu had performed the load or store.
  */
 
 _GLOBAL(cvt_fd)
-   lfd 0,THREAD_FPSCR(r5)  /* load up fpscr value */
-   MTFSF_L(0)
lfs 0,0(r3)
stfd0,0(r4)
-   mffs0
-   stfd0,THREAD_FPSCR(r5)  /* save new fpscr value */
blr
 
 _GLOBAL(cvt_df)
-   lfd 0,THREAD_FPSCR(r5)  /* load up fpscr value */
-   MTFSF_L(0)
lfd 0,0(r3)
stfs0,0(r4)
-   mffs0
-   stfd0,THREAD_FPSCR(r5)  /* save new fpscr value */
blr
diff --git a/arch/powerpc/kvm/book3s_paired_singles.c 
b/arch/powerpc/kvm/book3s_paired_singles.c
index 474f2e2..35a701f 100644
--- a/arch/powerpc/kvm/book3s_paired_singles.c
+++ b/arch/powerpc/kvm/book3s_paired_singles.c
@@ -159,7 +159,7 @@
 
 static inline void kvmppc_sync_qpr(struct kvm_vcpu *vcpu, int rt)
 {
-   kvm_cvt_df(vcpu-arch.fpr[rt], vcpu-arch.qpr[rt], vcpu-arch.fpscr);
+   kvm_cvt_df(vcpu-arch.fpr[rt], vcpu-arch.qpr[rt]);
 }
 
 static void kvmppc_inject_pf(struct kvm_vcpu *vcpu, ulong eaddr, bool is_store)
@@ -204,7 +204,7 @@ static int kvmppc_emulate_fpr_load(struct kvm_run *run, 
struct kvm_vcpu *vcpu,
/* put in registers */
switch (ls_type) {
case FPU_LS_SINGLE:
-   kvm_cvt_fd((u32*)tmp, vcpu-arch.fpr[rs], vcpu-arch.fpscr);
+   kvm_cvt_fd((u32*)tmp, vcpu-arch.fpr[rs]);
vcpu-arch.qpr[rs] = *((u32*)tmp);
break;
case FPU_LS_DOUBLE:
@@ -230,7 +230,7 @@ static int kvmppc_emulate_fpr_store(struct kvm_run *run, 
struct kvm_vcpu *vcpu,
 
switch (ls_type) {
case FPU_LS_SINGLE:
-   kvm_cvt_df(vcpu-arch.fpr[rs], (u32*)tmp, vcpu-arch.fpscr);
+   kvm_cvt_df(vcpu-arch.fpr[rs], (u32*)tmp);
val = *((u32*)tmp);
len = sizeof(u32);
break;
@@ -296,7 +296,7 @@ static int