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_.
33 lines
865 B
ArmAsm
33 lines
865 B
ArmAsm
.sect .text
|
|
|
|
! this is not a subroutine, but just a
|
|
! piece of code that computes the jump-
|
|
! address and jumps to it.
|
|
! traps if resulting address is zero
|
|
!
|
|
! Stack: ( value tableaddr -- )
|
|
|
|
.define .csb
|
|
.csb:
|
|
lwz r3, 0(sp)
|
|
lwz r4, 4(sp)
|
|
addi sp, sp, 8
|
|
|
|
lwz r5, 0(r3) ! r5 = default target
|
|
|
|
lwz r6, 4(r3) ! fetch count
|
|
mr. r6, r6 ! skip loop if count is zero
|
|
beq 3f ! (needed by Modula-2 "CASE i OF END")
|
|
mtspr ctr, r6
|
|
1: lwzu r7, 8(r3) ! fetch target index, increment pointer
|
|
cmpw r4, r7 ! compare with value
|
|
beq 2f
|
|
bdnz 1b ! if not equal, go again
|
|
b 3f
|
|
|
|
2: lwz r5, 4(r3) ! r5 = new target
|
|
3: mtspr ctr, r5
|
|
mr. r5, r5 ! test target
|
|
bnectr ! jump to target if non-zero
|
|
b .trap_ecase ! otherwise trap
|