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
		
	
	
	
		
			851 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
	
		
			851 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 .csa
 | |
| .csa:
 | |
| 	lwz r3, 0(sp)
 | |
| 	lwz r4, 4(sp)
 | |
| 	addi sp, sp, 8
 | |
| 
 | |
| 	lwz r5, 0(r3)            ! r5 = default target
 | |
| 
 | |
| 	lwz r6, 4(r3)            ! fetch lower bound
 | |
| 	subf. r4, r6, r4         ! adjust value
 | |
| 	blt 1f                   ! jump to default if out of range
 | |
| 
 | |
| 	lwz r6, 8(r3)            ! fetch range
 | |
| 	cmplw r4, r6
 | |
| 	bgt 1f                   ! jump to default if out of range
 | |
| 
 | |
| 	addi r3, r3, 12          ! skip header
 | |
| 	slwi r4, r4, 2           ! scale value (<<2)
 | |
| 	lwzx r5, r3, r4          ! r5 = new target
 | |
| 
 | |
| 1:	mtspr ctr, r5
 | |
| 	mr. r5, r5               ! test it
 | |
| 	bnectr                   ! jump to target if non-zero
 | |
| 	b .trap_ecase            ! otherwise trap
 |