$NetBSD: patch-aa,v 1.6 1999/04/27 20:43:11 rvb Exp $ --- lib-src/mlwp/process.s~ Wed Oct 7 20:11:01 1998 +++ lib-src/mlwp/process.s Wed Feb 24 01:05:51 1999 @@ -590,5 +590,105 @@ jmp r1 #endif /* luna88k */ + +#ifdef arm32 + +@ r0-r3 call arguments +@ r4-r8 "saved over call" + +@ r9 frame pointer +@ r10 stack limit +@ r11 arg pointer +@ r12 temp +@ r13 sp +@ r14 link/temp +@ r15 pc + +@ +@ savecontext(f, area1, newsp) +@ int (*f)(); struct savearea *area1; char *newsp; +@ +@ set global _PRE_Block = 1 + +rfp .req r9 +sl .req r10 +fp .req r11 +ip .req r12 +sp .req r13 +lr .req r14 +pc .req r15 + + .text + .align 0 + + .global _savecontext + .type _savecontext,#function + +_savecontext: + mov ip, sp + stmfd sp!, {fp, ip, lr, pc} + + sub fp, ip, #4 + + ldr r3, Lpre_addr + mov lr, #1 + str lr, [r3, #0] @ stall here waiting for r3? + +@ push callee-saves registers + + stmfd sp!, { r4-r10, fp } + +@ save old sp in area1 + + str sp, [r1, #0] + +@ if newsp != 0, sp = newsp + + cmp r2, #0 + movne sp, r2 + +@ call f() with no arguments + + mov lr, pc + mov pc, r0 + bl _abort @ in case we fall down go boom + +Lpre_addr: + .word _PRE_Block + +Lfe1: + .size _savecontext,Lfe1-_savecontext + +@ +@ returnto(area2) +@ struct savearea *area2; +@ + +@ set _PRE_Block = 0 + .global _returnto + .type _returnto, #function +_returnto: + ldr r3, Lpre_addr + mov r2, #0 + str r2, [r3, #0] @ stall here waiting for r3? + +@ restore sp from area2 + ldr sp, [r0, #0] + +@ pop callee-saves registers + + ldmfd sp!, { r4-r10, fp } + +@ return. + + ldmea fp, {fp, sp, pc} + +Lfe2: + .size _returnto,Lfe2-_returnto + + + +#endif /* arm32 */ + #endif OLDLWP