MIPS: Don't assume 64-bit FP registers for context switch
When saving or restoring scalar FP context we want to access the least significant 64 bits of each FP register. When the FP registers are 64 bits wide that is trivially the start of the registers value in memory. However when the FP registers are wider this equivalence will no longer be true for big endian systems. Define a new set of offset macros for the least significant 64 bits of each saved FP register within thread context, and make use of them when saving and restoring scalar FP context. Signed-off-by: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/6428/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Este cometimento está contido em:

cometido por
Ralf Baechle

ascendente
72b22bbad1
cometimento
02987633df
@@ -64,44 +64,44 @@
|
||||
|
||||
.macro fpu_save_16even thread tmp=t0
|
||||
cfc1 \tmp, fcr31
|
||||
sdc1 $f0, THREAD_FPR0(\thread)
|
||||
sdc1 $f2, THREAD_FPR2(\thread)
|
||||
sdc1 $f4, THREAD_FPR4(\thread)
|
||||
sdc1 $f6, THREAD_FPR6(\thread)
|
||||
sdc1 $f8, THREAD_FPR8(\thread)
|
||||
sdc1 $f10, THREAD_FPR10(\thread)
|
||||
sdc1 $f12, THREAD_FPR12(\thread)
|
||||
sdc1 $f14, THREAD_FPR14(\thread)
|
||||
sdc1 $f16, THREAD_FPR16(\thread)
|
||||
sdc1 $f18, THREAD_FPR18(\thread)
|
||||
sdc1 $f20, THREAD_FPR20(\thread)
|
||||
sdc1 $f22, THREAD_FPR22(\thread)
|
||||
sdc1 $f24, THREAD_FPR24(\thread)
|
||||
sdc1 $f26, THREAD_FPR26(\thread)
|
||||
sdc1 $f28, THREAD_FPR28(\thread)
|
||||
sdc1 $f30, THREAD_FPR30(\thread)
|
||||
sdc1 $f0, THREAD_FPR0_LS64(\thread)
|
||||
sdc1 $f2, THREAD_FPR2_LS64(\thread)
|
||||
sdc1 $f4, THREAD_FPR4_LS64(\thread)
|
||||
sdc1 $f6, THREAD_FPR6_LS64(\thread)
|
||||
sdc1 $f8, THREAD_FPR8_LS64(\thread)
|
||||
sdc1 $f10, THREAD_FPR10_LS64(\thread)
|
||||
sdc1 $f12, THREAD_FPR12_LS64(\thread)
|
||||
sdc1 $f14, THREAD_FPR14_LS64(\thread)
|
||||
sdc1 $f16, THREAD_FPR16_LS64(\thread)
|
||||
sdc1 $f18, THREAD_FPR18_LS64(\thread)
|
||||
sdc1 $f20, THREAD_FPR20_LS64(\thread)
|
||||
sdc1 $f22, THREAD_FPR22_LS64(\thread)
|
||||
sdc1 $f24, THREAD_FPR24_LS64(\thread)
|
||||
sdc1 $f26, THREAD_FPR26_LS64(\thread)
|
||||
sdc1 $f28, THREAD_FPR28_LS64(\thread)
|
||||
sdc1 $f30, THREAD_FPR30_LS64(\thread)
|
||||
sw \tmp, THREAD_FCR31(\thread)
|
||||
.endm
|
||||
|
||||
.macro fpu_save_16odd thread
|
||||
.set push
|
||||
.set mips64r2
|
||||
sdc1 $f1, THREAD_FPR1(\thread)
|
||||
sdc1 $f3, THREAD_FPR3(\thread)
|
||||
sdc1 $f5, THREAD_FPR5(\thread)
|
||||
sdc1 $f7, THREAD_FPR7(\thread)
|
||||
sdc1 $f9, THREAD_FPR9(\thread)
|
||||
sdc1 $f11, THREAD_FPR11(\thread)
|
||||
sdc1 $f13, THREAD_FPR13(\thread)
|
||||
sdc1 $f15, THREAD_FPR15(\thread)
|
||||
sdc1 $f17, THREAD_FPR17(\thread)
|
||||
sdc1 $f19, THREAD_FPR19(\thread)
|
||||
sdc1 $f21, THREAD_FPR21(\thread)
|
||||
sdc1 $f23, THREAD_FPR23(\thread)
|
||||
sdc1 $f25, THREAD_FPR25(\thread)
|
||||
sdc1 $f27, THREAD_FPR27(\thread)
|
||||
sdc1 $f29, THREAD_FPR29(\thread)
|
||||
sdc1 $f31, THREAD_FPR31(\thread)
|
||||
sdc1 $f1, THREAD_FPR1_LS64(\thread)
|
||||
sdc1 $f3, THREAD_FPR3_LS64(\thread)
|
||||
sdc1 $f5, THREAD_FPR5_LS64(\thread)
|
||||
sdc1 $f7, THREAD_FPR7_LS64(\thread)
|
||||
sdc1 $f9, THREAD_FPR9_LS64(\thread)
|
||||
sdc1 $f11, THREAD_FPR11_LS64(\thread)
|
||||
sdc1 $f13, THREAD_FPR13_LS64(\thread)
|
||||
sdc1 $f15, THREAD_FPR15_LS64(\thread)
|
||||
sdc1 $f17, THREAD_FPR17_LS64(\thread)
|
||||
sdc1 $f19, THREAD_FPR19_LS64(\thread)
|
||||
sdc1 $f21, THREAD_FPR21_LS64(\thread)
|
||||
sdc1 $f23, THREAD_FPR23_LS64(\thread)
|
||||
sdc1 $f25, THREAD_FPR25_LS64(\thread)
|
||||
sdc1 $f27, THREAD_FPR27_LS64(\thread)
|
||||
sdc1 $f29, THREAD_FPR29_LS64(\thread)
|
||||
sdc1 $f31, THREAD_FPR31_LS64(\thread)
|
||||
.set pop
|
||||
.endm
|
||||
|
||||
@@ -117,44 +117,44 @@
|
||||
|
||||
.macro fpu_restore_16even thread tmp=t0
|
||||
lw \tmp, THREAD_FCR31(\thread)
|
||||
ldc1 $f0, THREAD_FPR0(\thread)
|
||||
ldc1 $f2, THREAD_FPR2(\thread)
|
||||
ldc1 $f4, THREAD_FPR4(\thread)
|
||||
ldc1 $f6, THREAD_FPR6(\thread)
|
||||
ldc1 $f8, THREAD_FPR8(\thread)
|
||||
ldc1 $f10, THREAD_FPR10(\thread)
|
||||
ldc1 $f12, THREAD_FPR12(\thread)
|
||||
ldc1 $f14, THREAD_FPR14(\thread)
|
||||
ldc1 $f16, THREAD_FPR16(\thread)
|
||||
ldc1 $f18, THREAD_FPR18(\thread)
|
||||
ldc1 $f20, THREAD_FPR20(\thread)
|
||||
ldc1 $f22, THREAD_FPR22(\thread)
|
||||
ldc1 $f24, THREAD_FPR24(\thread)
|
||||
ldc1 $f26, THREAD_FPR26(\thread)
|
||||
ldc1 $f28, THREAD_FPR28(\thread)
|
||||
ldc1 $f30, THREAD_FPR30(\thread)
|
||||
ldc1 $f0, THREAD_FPR0_LS64(\thread)
|
||||
ldc1 $f2, THREAD_FPR2_LS64(\thread)
|
||||
ldc1 $f4, THREAD_FPR4_LS64(\thread)
|
||||
ldc1 $f6, THREAD_FPR6_LS64(\thread)
|
||||
ldc1 $f8, THREAD_FPR8_LS64(\thread)
|
||||
ldc1 $f10, THREAD_FPR10_LS64(\thread)
|
||||
ldc1 $f12, THREAD_FPR12_LS64(\thread)
|
||||
ldc1 $f14, THREAD_FPR14_LS64(\thread)
|
||||
ldc1 $f16, THREAD_FPR16_LS64(\thread)
|
||||
ldc1 $f18, THREAD_FPR18_LS64(\thread)
|
||||
ldc1 $f20, THREAD_FPR20_LS64(\thread)
|
||||
ldc1 $f22, THREAD_FPR22_LS64(\thread)
|
||||
ldc1 $f24, THREAD_FPR24_LS64(\thread)
|
||||
ldc1 $f26, THREAD_FPR26_LS64(\thread)
|
||||
ldc1 $f28, THREAD_FPR28_LS64(\thread)
|
||||
ldc1 $f30, THREAD_FPR30_LS64(\thread)
|
||||
ctc1 \tmp, fcr31
|
||||
.endm
|
||||
|
||||
.macro fpu_restore_16odd thread
|
||||
.set push
|
||||
.set mips64r2
|
||||
ldc1 $f1, THREAD_FPR1(\thread)
|
||||
ldc1 $f3, THREAD_FPR3(\thread)
|
||||
ldc1 $f5, THREAD_FPR5(\thread)
|
||||
ldc1 $f7, THREAD_FPR7(\thread)
|
||||
ldc1 $f9, THREAD_FPR9(\thread)
|
||||
ldc1 $f11, THREAD_FPR11(\thread)
|
||||
ldc1 $f13, THREAD_FPR13(\thread)
|
||||
ldc1 $f15, THREAD_FPR15(\thread)
|
||||
ldc1 $f17, THREAD_FPR17(\thread)
|
||||
ldc1 $f19, THREAD_FPR19(\thread)
|
||||
ldc1 $f21, THREAD_FPR21(\thread)
|
||||
ldc1 $f23, THREAD_FPR23(\thread)
|
||||
ldc1 $f25, THREAD_FPR25(\thread)
|
||||
ldc1 $f27, THREAD_FPR27(\thread)
|
||||
ldc1 $f29, THREAD_FPR29(\thread)
|
||||
ldc1 $f31, THREAD_FPR31(\thread)
|
||||
ldc1 $f1, THREAD_FPR1_LS64(\thread)
|
||||
ldc1 $f3, THREAD_FPR3_LS64(\thread)
|
||||
ldc1 $f5, THREAD_FPR5_LS64(\thread)
|
||||
ldc1 $f7, THREAD_FPR7_LS64(\thread)
|
||||
ldc1 $f9, THREAD_FPR9_LS64(\thread)
|
||||
ldc1 $f11, THREAD_FPR11_LS64(\thread)
|
||||
ldc1 $f13, THREAD_FPR13_LS64(\thread)
|
||||
ldc1 $f15, THREAD_FPR15_LS64(\thread)
|
||||
ldc1 $f17, THREAD_FPR17_LS64(\thread)
|
||||
ldc1 $f19, THREAD_FPR19_LS64(\thread)
|
||||
ldc1 $f21, THREAD_FPR21_LS64(\thread)
|
||||
ldc1 $f23, THREAD_FPR23_LS64(\thread)
|
||||
ldc1 $f25, THREAD_FPR25_LS64(\thread)
|
||||
ldc1 $f27, THREAD_FPR27_LS64(\thread)
|
||||
ldc1 $f29, THREAD_FPR29_LS64(\thread)
|
||||
ldc1 $f31, THREAD_FPR31_LS64(\thread)
|
||||
.set pop
|
||||
.endm
|
||||
|
||||
|
Criar uma nova questão referindo esta
Bloquear um utilizador