patch-1.3.71 linux/arch/sparc/mm/s4ckflt.S
Next file: linux/arch/sparc/mm/s4clow.h
Previous file: linux/arch/sparc/mm/s4cflush.S
Back to the patch index
Back to the overall index
- Lines: 106
- Date:
Mon Mar 4 08:49:58 1996
- Orig file:
v1.3.70/linux/arch/sparc/mm/s4ckflt.S
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v1.3.70/linux/arch/sparc/mm/s4ckflt.S linux/arch/sparc/mm/s4ckflt.S
@@ -0,0 +1,105 @@
+/* s4ckflt.S: Quick in window kernel faults on the sun4c.
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caipfs.rutgers.edu)
+ */
+
+#include "s4clow.h"
+
+ .text
+ .align 8
+ .globl sun4c_quick_kernel_fault
+sun4c_quick_kernel_fault:
+ sethi %hi(REAL_PGDIR_MASK), %l5
+ and %l7, %l5, %l7
+ sethi %hi(C_LABEL(invalid_segment)), %l5
+ lduba [%l7] 0x3, %l4
+ ld [%l5 + %lo(C_LABEL(invalid_segment))], %l5
+ cmp %l4, %l5
+ bne segment_loaded
+ nop
+
+ /* We need some breathing room to pull this off, save
+ * away some globals.
+ */
+ std %g0, [REGSAVE_BASE + KFLTREGS + 0x00]
+ std %g2, [REGSAVE_BASE + KFLTREGS + 0x08]
+ std %g4, [REGSAVE_BASE + KFLTREGS + 0x10]
+ std %g6, [REGSAVE_BASE + KFLTREGS + 0x18]
+ std %l0, [REGSAVE_BASE + KFLTREGS + 0x20]
+ std %l2, [REGSAVE_BASE + KFLTREGS + 0x28]
+
+ set C_LABEL(sun4c_kfree_ring), %g1
+ ld [%g1 + RING_NENTRIES], %g2
+ cmp %g2, 0x0
+ be,a pseg_steal
+ nop
+
+ b distribute_segmap
+ ld [%g1 + RING_RINGHD + MMU_ENTRY_NEXT], %g2
+
+pseg_steal:
+ /* This is the hard case. */
+ set C_LABEL(sun4c_kernel_ring), %g1
+ ld [%g1 + RING_RINGHD + MMU_ENTRY_PREV], %g2
+ b kernel_segment_cache_flush
+ ld [%g2 + MMU_ENTRY_VADDR], %l0
+
+pseg_steal_after_flush:
+ ld [%g2 + MMU_ENTRY_VADDR], %l0
+ sethi %hi(0x30000000), %l1
+ lduba [%l1] 0x02, %g7
+ sethi %hi(C_LABEL(num_contexts)), %g6
+ mov 0, %g5
+ ld [%g6 + %lo(C_LABEL(num_contexts))], %g6
+1:
+ stba %g5, [%l1] 0x02
+ add %g5, 1, %g5
+ cmp %g5, %g6
+ bl 1b
+ stba %l5, [%l0] 0x03
+
+ stba %g7, [%l1] 0x02
+
+
+
+distribute_segmap:
+ st %l7, [%g2 + MMU_ENTRY_VADDR]
+ ldub [%g2 + MMU_ENTRY_PSEG], %g3
+ sethi %hi(0x30000000), %l0
+ lduba [%l0] 0x02, %g7
+ sethi %hi(C_LABEL(num_contexts)), %g6
+ mov 0, %g5
+ ld [%g6 + %lo(C_LABEL(num_contexts))], %g6
+1:
+ stba %g5, [%l0] 0x02
+ add %g5, 1, %g5
+ cmp %g5, %g6
+ bl 1b
+ stba %g3, [%l7] 0x03
+
+ stba %g7, [%l0] 0x02
+
+segment_loaded:
+ sethi %hi(VMALLOC_START), %l4
+ cmp %l7, %l4
+ bge vmalloc_kernel_fault
+ nop
+
+
+
+
+
+vmalloc_kernel_fault:
+
+
+qkf_exit:
+ /* Fault serviced, return from trap, but reload
+ * registers first.
+ */
+ ldd [REGSAVE_BASE + KFLTREGS + 0x00], %g0
+ ldd [REGSAVE_BASE + KFLTREGS + 0x08], %g2
+ ldd [REGSAVE_BASE + KFLTREGS + 0x10], %g4
+ ldd [REGSAVE_BASE + KFLTREGS + 0x18], %g6
+ ldd [REGSAVE_BASE + KFLTREGS + 0x20], %l0
+ ldd [REGSAVE_BASE + KFLTREGS + 0x28], %l2
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this