ack/mach/powerpc/libem/trp.s

57 lines
1 KiB
ArmAsm
Raw Normal View History

.sect .text
.define .trap_ecase
.trap_ecase:
li r3, 20 ! ECASE = 20 in h/em_abs.h
! FALLTHROUGH to .trp
! Raises an EM trap.
! Expects r3 = trap number.
.define .trp
.trp:
cmplwi r3, 15 ! traps > 15 can't be ignored
bgt 1f
lis r4, ha16[.ignmask]
lwz r4, lo16[.ignmask](r4) ! load ignore mask
srw r4, r4, r3
andi. r4, r4, 1
bnelr ! return if ignoring trap
1: lis r4, ha16[.trppc]
lwz r5, lo16[.trppc](r4) ! r5 = user trap routine
mr. r5, r5
beq 2f ! if no user trap routine, bail out
mtspr ctr, r5
mfspr r6, lr
li r0, 0
stwu r3, -8(sp) ! push trap number
stw r0, lo16[.trppc](r4) ! reset trap routine
stw r6, 4(sp) ! save old lr
bctrl ! call trap routine
lwz r0, 4(sp)
mtspr lr, r0
addi sp, sp, 8 ! retract over stack usage
blr
2: ! No trap handler. Write error message, exit.
li r3, 2
stwu r3, -12(sp)
lis r4, ha16[message]
addi r4, r4, lo16[message]
li r5, 6
stw r4, 4(sp)
stw r5, 8(sp)
bl _write ! write(2, message, 6)
li r3, 1
stw r3, 0(sp)
bl __exit ! _exit(1)
.sect .rom
message:
.ascii "TRAP!\n"