@@ -785,9 +785,13 @@ ENDPROC(ret_from_kernel_thread)
ENTRY(_switch_to)
STREG %r2, -RP_OFFSET(%r30)
- callee_save_float
callee_save
+ /* TODO: we could check TASK_FLAGS and only save the fpregs when
+ * switching away from a userspace task. */
+ ldo TASK_PT_FR0(%r26), %r1 /* save fpregs for task switch */
+ save_fp %r1
+
load32 _switch_to_ret, %r2
STREG %r2, TASK_PT_KPC(%r26)
@@ -795,6 +799,12 @@ ENTRY(_switch_to)
STREG %r30, TASK_PT_KSP(%r26)
LDREG TASK_PT_KSP(%r25), %r30
+
+ /* TODO: we could check TASK_FLAGS and restore the fpregs only when
+ * we return to a userspace task. */
+ ldo TASK_PT_FR31(%r25),%r1 /* reload fpregs */
+ rest_fp %r1
+
LDREG TASK_THREAD_INFO(%r25), %r25
bv %r0(%r2)
mtctl %r25,%cr30
@@ -802,7 +812,6 @@ ENTRY(_switch_to)
_switch_to_ret:
mtctl %r0, %cr0 /* Needed for single stepping */
callee_rest
- callee_rest_float
LDREG -RP_OFFSET(%r30), %r2
bv %r0(%r2)
@@ -913,8 +922,6 @@ intr_check_sig:
intr_restore:
copy %r16,%r29
- ldo PT_FR31(%r29),%r1
- rest_fp %r1
rest_general %r29
/* inverse of virt_map */
@@ -1013,9 +1020,6 @@ intr_extint:
virt_map
save_general %r29
- ldo PT_FR0(%r29), %r24
- save_fp %r24
-
loadgp
copy %r29, %r26 /* arg0 is pt_regs */
@@ -1094,9 +1098,6 @@ skip_save_ior:
virt_map
save_general %r29
- ldo PT_FR0(%r29), %r25
- save_fp %r25
-
loadgp
copy %r29, %r25 /* arg1 is pt_regs */
@@ -1856,9 +1857,6 @@ syscall_restore:
and,COND(=) %r19,%r2,%r0
b,n syscall_restore_rfi
- ldo TASK_PT_FR31(%r1),%r19 /* reload fpregs */
- rest_fp %r19
-
LDREG TASK_PT_SAR(%r1),%r19 /* restore SAR */
mtsar %r19
@@ -184,9 +184,6 @@ linux_gateway_entry:
STREG %r29, TASK_PT_GR29(%r1) /* return value 1 */
STREG %r31, TASK_PT_GR31(%r1) /* preserve syscall return ptr */
- ldo TASK_PT_FR0(%r1), %r27 /* save fpregs from the kernel */
- save_fp %r27 /* or potential task switch */
-
mfctl %cr11, %r27 /* i.e. SAR */
STREG %r27, TASK_PT_SAR(%r1)
@@ -310,6 +307,8 @@ tracesys:
STREG %r16,PT_GR16(%r2)
STREG %r17,PT_GR17(%r2)
STREG %r18,PT_GR18(%r2)
+ ldo PT_FR0(%r2), %r1 /* save fpregs */
+ save_fp %r1
/* Finished saving things for the debugger */
copy %r2,%r26
This is a work-in-progress patch to avoid unneccesary saving of floating point regs when entering syscalls (it still generates segfaults...!). The compiler option -mdisable-fpregs takes care that we don't use fp regs in kernel code by accident. Signed-off-by: Helge Deller <deller@gmx.de> -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html