26de4c1ab1
The new test rck_e.e segfaults on PowerPC unless I make some changes. The inline code for _rck_ was wrong because it didn't allow the trap handler to return. _sig_ forgot to push the old trap handler. Move plat/linuxppc/libsys/trap.s to mach/powerpc/libem/trp.s and rewrite it with simplified/extended mnemonics. Remove .trap alias for .trp procedure. Add a missing `mtspr lr, r0` so we can return from the trap handler. Call write() and _exit() so trp.s works with both linuxppc and osxppc. Before, Mac OS X was wrongly using the trap.s for Linux. In powerpc/libem, simplify .aar4; teach .csa and .csb to raise the trap if the default target is zero. C programs don't need these changes. You may relink your C programs with the changed .csa and .csb, but C code doesn't raise the trap. Modula-2 code can raise traps, so you may want to relink your Modula-2 programs with the changed libem, but you might keep your old .o files from Modula-2. You may need to recompile your Pascal programs (delete old .o files from Pascal) because the Pascal compiler might use _rck_.
57 lines
1 KiB
ArmAsm
57 lines
1 KiB
ArmAsm
.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"
|