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_.
		
			
				
	
	
		
			32 lines
		
	
	
	
		
			829 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
	
		
			829 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.sect .text
 | 
						|
 | 
						|
! Get address of element of bounds-checked array.
 | 
						|
!
 | 
						|
! Stack: ( array-adr index descriptor-adr -- element-adr )
 | 
						|
! Sets r3 = size of element for .los4, .sts4
 | 
						|
! Preserves r10 for .lar4, .sar4
 | 
						|
 | 
						|
.define .aar4
 | 
						|
.aar4:
 | 
						|
	lwz r4, 0(sp)            ! r4 = address of descriptor
 | 
						|
	lwz r5, 4(sp)            ! r5 = index
 | 
						|
	lwz r6, 8(sp)            ! r6 = address of array
 | 
						|
 | 
						|
	lwz r0, 0(r4)
 | 
						|
	subf. r5, r0, r5         ! subtract lower bound from index
 | 
						|
	blt .trap_earray         ! check lower bound
 | 
						|
 | 
						|
	lwz r0, 4(r4)
 | 
						|
	cmplw r5, r0
 | 
						|
	bgt .trap_earray         ! check upper bound
 | 
						|
 | 
						|
	lwz r3, 8(r4)            ! r3 = size of element
 | 
						|
	mullw r5, r5, r3         ! scale index by size
 | 
						|
	add r6, r6, r5
 | 
						|
	stw r6, 8(sp)            ! push address of element
 | 
						|
	addi sp, sp, 8
 | 
						|
	blr
 | 
						|
 | 
						|
.trap_earray:
 | 
						|
	li r3, 0                 ! EARRAY = 0 in h/em_abs.h
 | 
						|
	b .trp
 |