patch-2.3.35 linux/arch/sparc/kernel/entry.S
Next file: linux/arch/sparc/kernel/head.S
Previous file: linux/arch/sparc/kernel/ebus.c
Back to the patch index
Back to the overall index
- Lines: 178
- Date:
Mon Dec 20 22:05:52 1999
- Orig file:
v2.3.34/linux/arch/sparc/kernel/entry.S
- Orig date:
Tue Aug 31 17:29:13 1999
diff -u --recursive --new-file v2.3.34/linux/arch/sparc/kernel/entry.S linux/arch/sparc/kernel/entry.S
@@ -1,4 +1,4 @@
-/* $Id: entry.S,v 1.161 1999/08/14 03:51:05 anton Exp $
+/* $Id: entry.S,v 1.163 1999/11/19 04:11:24 davem Exp $
* arch/sparc/kernel/entry.S: Sparc trap low-level entry points.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -826,13 +826,13 @@
.globl C_LABEL(invalid_segment_patch1_ff)
.globl C_LABEL(invalid_segment_patch2_ff)
C_LABEL(invalid_segment_patch1_ff): cmp %l4, 0xff
-C_LABEL(invalid_segment_patch2_ff): mov 0xff, %l4
+C_LABEL(invalid_segment_patch2_ff): mov 0xff, %l3
.align 4
.globl C_LABEL(invalid_segment_patch1_1ff)
.globl C_LABEL(invalid_segment_patch2_1ff)
C_LABEL(invalid_segment_patch1_1ff): cmp %l4, 0x1ff
-C_LABEL(invalid_segment_patch2_1ff): mov 0x1ff, %l4
+C_LABEL(invalid_segment_patch2_1ff): mov 0x1ff, %l3
.align 4
.globl C_LABEL(num_context_patch1_16), C_LABEL(num_context_patch2_16)
@@ -853,7 +853,7 @@
#ifdef CONFIG_SUN4
C_LABEL(vac_hwflush_patch1_on): nop
#else
-C_LABEL(vac_hwflush_patch1_on): subcc %l7, (PAGE_SIZE - 4), %l7
+C_LABEL(vac_hwflush_patch1_on): addcc %l7, -PAGE_SIZE, %l7
#endif
C_LABEL(vac_hwflush_patch2_on): sta %g0, [%l3 + %l7] ASI_HWFLUSHSEG
@@ -969,12 +969,12 @@
bne 1f
sethi %hi(C_LABEL(sun4c_kfree_ring)), %l4
or %l4, %lo(C_LABEL(sun4c_kfree_ring)), %l4
- ld [%l4 + 0x10], %l3
+ ld [%l4 + 0x18], %l3
deccc %l3 ! do we have a free entry?
bcs,a 2f ! no, unmap one.
sethi %hi(C_LABEL(sun4c_kernel_ring)), %l4
- st %l3, [%l4 + 0x10] ! sun4c_kfree_ring.num_entries--
+ st %l3, [%l4 + 0x18] ! sun4c_kfree_ring.num_entries--
ld [%l4 + 0x00], %l6 ! entry = sun4c_kfree_ring.ringhd.next
st %l5, [%l6 + 0x08] ! entry->vaddr = address
@@ -997,10 +997,10 @@
st %l6, [%l4 + 0x00] ! head->next = entry
- ld [%l4 + 0x10], %l3
+ ld [%l4 + 0x18], %l3
inc %l3 ! sun4c_kernel_ring.num_entries++
b 4f
- st %l3, [%l4 + 0x10]
+ ld [%l6 + 0x08], %l5
2:
or %l4, %lo(C_LABEL(sun4c_kernel_ring)), %l4
@@ -1020,7 +1020,7 @@
C_LABEL(vac_hwflush_patch1):
C_LABEL(vac_linesize_patch):
subcc %l7, 16, %l7
- bg 9b
+ bne 9b
C_LABEL(vac_hwflush_patch2):
sta %g0, [%l3 + %l7] ASI_FLUSHSEG
@@ -1041,47 +1041,36 @@
mov %l3, %l5 ! address = tmp
+4:
C_LABEL(num_context_patch1):
mov 0x08, %l7
-C_LABEL(invalid_segment_patch2):
- mov 0x7f, %l4
+ ld [%l6 + 0x08], %l4
+ ldub [%l6 + 0x0c], %l3
+ or %l4, %l3, %l4 ! encode new vaddr/pseg into l4
sethi %hi(AC_CONTEXT), %l3
lduba [%l3] ASI_CONTROL, %l6
-3:
- deccc %l7
- stba %l7, [%l3] ASI_CONTROL
- bne 3b
- stXa %l4, [%l5] ASI_SEGMAP
-
- stba %l6, [%l3] ASI_CONTROL
-
- ! reload the entry
-
- sethi %hi(C_LABEL(sun4c_kernel_ring)), %l4
- ld [%l4 + %lo(C_LABEL(sun4c_kernel_ring))], %l6
-
- ld [%l6 + 0x08], %l5 ! restore address from entry->vaddr
-
-4:
-C_LABEL(num_context_patch2):
- mov 0x08, %l7
-
- ldub [%l6 + 0x0c], %l4 ! entry->pseg
-
+ /* Invalidate old mapping, instantiate new mapping,
+ * for each context. Registers l6/l7 are live across
+ * this loop.
+ */
+3: deccc %l7
sethi %hi(AC_CONTEXT), %l3
- lduba [%l3] ASI_CONTROL, %l6
-
-3:
- deccc %l7
stba %l7, [%l3] ASI_CONTROL
+C_LABEL(invalid_segment_patch2):
+ mov 0x7f, %l3
+ stXa %l3, [%l5] ASI_SEGMAP
+ andn %l4, 0x1ff, %l3
bne 3b
- stXa %l4, [%l5] ASI_SEGMAP
+ stXa %l4, [%l3] ASI_SEGMAP
+ sethi %hi(AC_CONTEXT), %l3
stba %l6, [%l3] ASI_CONTROL
+ andn %l4, 0x1ff, %l5
+
1:
sethi %hi(SUN4C_VMALLOC_START), %l4
cmp %l5, %l4
@@ -1149,6 +1138,7 @@
sun4c_fault_fromuser:
SAVE_ALL
+ nop
mov %l7, %o1 ! Decode the info from %l7
mov %l7, %o2
@@ -1199,6 +1189,7 @@
RESTORE_ALL
+#ifdef CONFIG_SUNOS_EMUL
/* SunOS uses syscall zero as the 'indirect syscall' it looks
* like indir_syscall(scall_num, arg0, arg1, arg2...); etc.
* This is complete brain damage.
@@ -1226,6 +1217,7 @@
mov %o5, %o4
call %l6
mov %l4, %o7
+#endif
.align 4
.globl C_LABEL(sys_nis_syscall)
@@ -1638,6 +1630,20 @@
sub %l1, 1, %l1
b ret_trap_entry
st %l1, [%sp + REGWIN_SZ + PT_NPC]
+
+#ifndef CONFIG_SUNOS_EMUL
+ .align 4
+ .globl sunos_syscall
+sunos_syscall:
+ SAVE_ALL_HEAD
+ rd %wim, %l3
+ wr %l0, PSR_ET, %psr
+ nop
+ nop
+ mov %i0, %l5
+ call C_LABEL(do_sunos_syscall)
+ add %sp, REGWIN_SZ, %o0
+#endif
/* {net, open}bsd system calls enter here... */
.align 4
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)