diff options
Diffstat (limited to 'arch/sparc/kernel/entry.S')
-rw-r--r-- | arch/sparc/kernel/entry.S | 80 |
1 files changed, 43 insertions, 37 deletions
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 0f1d1122e..226e53897 100644 --- a/arch/sparc/kernel/entry.S +++ b/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 @@ linux_trap_nmi_sun4c: .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 @@ C_LABEL(vac_linesize_patch_32): subcc %l7, 32, %l7 #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 @@ C_LABEL(invalid_segment_patch1): 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 @@ C_LABEL(invalid_segment_patch1): 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(invalid_segment_patch1): 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 @@ C_LABEL(vac_hwflush_patch2): 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 @@ C_LABEL(num_context_patch2): sun4c_fault_fromuser: SAVE_ALL + nop mov %l7, %o1 ! Decode the info from %l7 mov %l7, %o2 @@ -1199,6 +1189,7 @@ C_LABEL(srmmu_fault): 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 @@ C_LABEL(sunos_indir): mov %o5, %o4 call %l6 mov %l4, %o7 +#endif .align 4 .globl C_LABEL(sys_nis_syscall) @@ -1639,6 +1631,20 @@ solaris_syscall: 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 .globl bsd_syscall |