Re: [PATCH] powerpc: remove fpscr use from [kvm_]cvt_{fd,df}
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}
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}
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}
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}
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}
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}
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}
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