powerpc: Put FP/VSX and VR state into structures
This creates new 'thread_fp_state' and 'thread_vr_state' structures to store FP/VSX state (including FPSCR) and Altivec/VSX state (including VSCR), and uses them in the thread_struct. In the thread_fp_state, the FPRs and VSRs are represented as u64 rather than double, since we rarely perform floating-point computations on the values, and this will enable the structures to be used in KVM code as well. Similarly FPSCR is now a u64 rather than a structure of two 32-bit values. This takes the offsets out of the macros such as SAVE_32FPRS, REST_32FPRS, etc. This enables the same macros to be used for normal and transactional state, enabling us to delete the transactional versions of the macros. This also removes the unused do_load_up_fpu and do_load_up_altivec, which were in fact buggy since they didn't create large enough stack frames to account for the fact that load_up_fpu and load_up_altivec are not designed to be called from C and assume that their caller's stack frame is an interrupt frame. Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:

committed by
Benjamin Herrenschmidt

parent
8e0a1611cb
commit
de79f7b9f6
@@ -144,8 +144,20 @@ typedef struct {
|
||||
|
||||
#define TS_FPROFFSET 0
|
||||
#define TS_VSRLOWOFFSET 1
|
||||
#define TS_FPR(i) fpr[i][TS_FPROFFSET]
|
||||
#define TS_TRANS_FPR(i) transact_fpr[i][TS_FPROFFSET]
|
||||
#define TS_FPR(i) fp_state.fpr[i][TS_FPROFFSET]
|
||||
#define TS_TRANS_FPR(i) transact_fp.fpr[i][TS_FPROFFSET]
|
||||
|
||||
/* FP and VSX 0-31 register set */
|
||||
struct thread_fp_state {
|
||||
u64 fpr[32][TS_FPRWIDTH] __attribute__((aligned(16)));
|
||||
u64 fpscr; /* Floating point status */
|
||||
};
|
||||
|
||||
/* Complete AltiVec register set including VSCR */
|
||||
struct thread_vr_state {
|
||||
vector128 vr[32] __attribute__((aligned(16)));
|
||||
vector128 vscr __attribute__((aligned(16)));
|
||||
};
|
||||
|
||||
struct thread_struct {
|
||||
unsigned long ksp; /* Kernel stack pointer */
|
||||
@@ -198,13 +210,7 @@ struct thread_struct {
|
||||
unsigned long dvc2;
|
||||
#endif
|
||||
#endif
|
||||
/* FP and VSX 0-31 register set */
|
||||
double fpr[32][TS_FPRWIDTH] __attribute__((aligned(16)));
|
||||
struct {
|
||||
|
||||
unsigned int pad;
|
||||
unsigned int val; /* Floating point status */
|
||||
} fpscr;
|
||||
struct thread_fp_state fp_state;
|
||||
int fpexc_mode; /* floating-point exception mode */
|
||||
unsigned int align_ctl; /* alignment handling control */
|
||||
#ifdef CONFIG_PPC64
|
||||
@@ -222,10 +228,7 @@ struct thread_struct {
|
||||
struct arch_hw_breakpoint hw_brk; /* info on the hardware breakpoint */
|
||||
unsigned long trap_nr; /* last trap # on this thread */
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
/* Complete AltiVec register set */
|
||||
vector128 vr[32] __attribute__((aligned(16)));
|
||||
/* AltiVec status */
|
||||
vector128 vscr __attribute__((aligned(16)));
|
||||
struct thread_vr_state vr_state;
|
||||
unsigned long vrsave;
|
||||
int used_vr; /* set if process has used altivec */
|
||||
#endif /* CONFIG_ALTIVEC */
|
||||
@@ -262,13 +265,8 @@ struct thread_struct {
|
||||
* transact_fpr[] is the new set of transactional values.
|
||||
* VRs work the same way.
|
||||
*/
|
||||
double transact_fpr[32][TS_FPRWIDTH];
|
||||
struct {
|
||||
unsigned int pad;
|
||||
unsigned int val; /* Floating point status */
|
||||
} transact_fpscr;
|
||||
vector128 transact_vr[32] __attribute__((aligned(16)));
|
||||
vector128 transact_vscr __attribute__((aligned(16)));
|
||||
struct thread_fp_state transact_fp;
|
||||
struct thread_vr_state transact_vr;
|
||||
unsigned long transact_vrsave;
|
||||
#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
|
||||
#ifdef CONFIG_KVM_BOOK3S_32_HANDLER
|
||||
@@ -322,8 +320,6 @@ struct thread_struct {
|
||||
.ksp = INIT_SP, \
|
||||
.regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \
|
||||
.fs = KERNEL_DS, \
|
||||
.fpr = {{0}}, \
|
||||
.fpscr = { .val = 0, }, \
|
||||
.fpexc_mode = 0, \
|
||||
.ppr = INIT_PPR, \
|
||||
}
|
||||
|
Reference in New Issue
Block a user