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_.
		
			
				
	
	
		
			56 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			56 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"
 |