patch-1.3.71 linux/arch/sparc/kernel/wuf.S
Next file: linux/arch/sparc/lib/Makefile
Previous file: linux/arch/sparc/kernel/wof.S
Back to the patch index
Back to the overall index
- Lines: 91
- Date:
Mon Mar 4 08:49:57 1996
- Orig file:
v1.3.70/linux/arch/sparc/kernel/wuf.S
- Orig date:
Sat Nov 25 19:04:37 1995
diff -u --recursive --new-file v1.3.70/linux/arch/sparc/kernel/wuf.S linux/arch/sparc/kernel/wuf.S
@@ -1,4 +1,4 @@
-/* $Id: wuf.S,v 1.13 1995/11/25 00:58:51 davem Exp $
+/* $Id: wuf.S,v 1.20 1996/02/20 07:45:22 davem Exp $
* wuf.S: Window underflow trap handler for the Sparc.
*
* Copyright (C) 1995 David S. Miller
@@ -19,7 +19,7 @@
#define t_pc l1
#define t_npc l2
#define t_wim l3
-/* Don`t touch the above registers or else you die horribly... */
+/* Don't touch the above registers or else you die horribly... */
/* Now macros for the available scratch registers in this routine. */
#define twin_tmp1 l4
@@ -141,15 +141,14 @@
/* Place a pt_regs frame on the kernel stack, save back
* to the trap window and call c-code to deal with this.
*/
- LOAD_CURRENT(l4)
- ld [%l4 + TASK_KSTACK_PG], %l5
- add %l5, (PAGE_SIZE - TRACEREG_SZ - STACKFRAME_SZ), %l5
+ LOAD_CURRENT(l4, l5)
+ ld [%l4 + TASK_SAVED_KSTACK], %l5
/* Store globals into pt_regs frame. */
STORE_PT_GLOBALS(l5)
STORE_PT_YREG(l5, g3)
- /* Save kernel %sp in global while we change windows */
+ /* Save kernel %sp in global while we change windows. */
mov %l5, %g2
save %g0, %g0, %g0
@@ -157,6 +156,7 @@
/* LOCATION: Window 'O' */
rd %psr, %g3 /* Read %psr in live user window */
+ mov %fp, %g6 /* Save bogus frame pointer. */
save %g0, %g0, %g0
@@ -166,7 +166,7 @@
/* Build rest of pt_regs. */
STORE_PT_INS(sp)
- STORE_PT_PRIV(sp, t_psr, t_pc, t_npc, t_wim)
+ STORE_PT_PRIV(sp, t_psr, t_pc, t_npc)
/* re-set trap time %wim value */
wr %t_wim, 0x0, %wim
@@ -174,22 +174,16 @@
/* Fix users window mask and buffer save count. */
mov 0x1, %g5
sll %g5, %g3, %g5
- LOAD_CURRENT(twin_tmp1)
+ LOAD_CURRENT(twin_tmp1, g1)
st %g5, [%twin_tmp1 + THREAD_UMASK] ! one live user window still
st %g0, [%twin_tmp1 + THREAD_W_SAVED] ! no windows in the buffer
- wr %t_psr, 0x0, %psr
wr %t_psr, PSR_ET, %psr ! enable traps
WRITE_PAUSE
- mov 2, %o1
- call C_LABEL(do_sparc_winfault) ! call c-code
- add %sp, STACKFRAME_SZ, %o0 ! pt_regs ptr is arg0
-
- /* Return from trap if C-code actually fixes things, if it
- * doesn't then we never get this far as the process will
- * be given the look of death from Commander Peanut.
- */
+ call C_LABEL(window_underflow_fault)
+ mov %g6, %o0
+
b ret_trap_entry
nop
@@ -347,5 +341,11 @@
be fwin_user_finish_up
nop
+ /* Did I ever tell you about my window labotomy?
+ * anyways... fwin_user_stack_is_bolixed expects
+ * to be in window 'W' so make it happy or else
+ * we watchdog badly.
+ */
+ restore %g0, %g0, %g0
b fwin_user_stack_is_bolixed ! oh well
- nop
+ restore %g0, %g0, %g0
FUNET's LINUX-ADM group, [email protected]
TCL-scripts by Sam Shen, [email protected]
with Sam's (original) version of this