Files
Arquivotheca.SunOS-4.1.4/sys/boot/sun4m/trap.s
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

76 lines
1.7 KiB
ArmAsm

/*
* .seg "data"
* .asciz "@(#)trap.s 1.1 10/31/94 SMI"
* Copyright (c) 1986,1990 by Sun Microsystems, Inc.
*/
#include <machine/asm_linkage.h>
#include <machine/reg.h>
#include <machine/psl.h>
/*
* Make sure the vector for 'trap #0' is installed. Kadb in particular
* depends on this.
*
* set_vec(vbr)
* int vbr;
*/
ENTRY(set_vec)
bclr 0xfff, %o0 ! set tt field to 0x80 for trap #0
or %o0, 0x800, %o0
set trap_0, %o1
ldd [%o1], %o2 ! copy prototype to trap table
std %o2, [%o0]
ldd [%o1 + 8], %o2
std %o2, [%o0 + 8]
mov %psr, %o0 ! enable traps
or %o0, PSR_ET, %o0
mov %o0, %psr
nop
retl
mov %g0, %o0
.align 8
trap_0: sethi %hi(systrap), %l7
or %l7, %lo(systrap), %l7
jmp %l7
mov %psr, %l0
.align 4
/*
* System call handler. We get here after a 't 0' instruction, so we're
* trapped somewhere in a syscall stub. We won't rett directly back to the
* caller; instead we'll make it look like we simply called syscall().
* Syscall()'s return will pass control back to the stub right after
* the trap instruction.
*/
systrap:
!
! When we enter:
! %i0 : syscall code
! %i1 : arg 0
! %i2 : arg 1
! %i3 : arg 2
! %l1 : trapped %pc
! %l2 : trapped %npc
!
! Decrement the return address so the system call returns to the right place.
!
sub %l1, 4, %i7
!
! Push the args, then leave room for a window overflow. This must be
! based on CALLER'S current stack pointer (our frame pointer), not our
! current sp, since we want out of this window.
!
st %i1, [%fp + 0]
st %i2, [%fp + 4]
st %i3, [%fp + 8]
mov %fp, %i1
add %fp, -SA(MINFRAME), %fp
!
! Set up addresses so that when we leave the trap control passes to syscall().
!
set _syscall, %l1
add %l1, 4, %l2
jmp %l1
rett %l2