Subject: Re: atomic write routine
To: Jonathan Cline <jcline@ieee.org>
From: Ben Harris <bjh21@netbsd.org>
List: port-arm
Date: 05/17/2003 13:54:07
On Fri, 16 May 2003, Jonathan Cline wrote:
> Question ahead of time: what regs are
> available for use when calling asm from C?
> I've guessed that args are passed in r0..rN
> respectively. In SetSYSCON below, I'm clobbering
> r3, r4, r5. What's the c-model to save them?
NetBSD currently more-or-less follows the old ARM Procedure Call Standard
(APCS), in 32-bit mode (even on 26-bit CPUs) with no floating point and an
implicit stack limit. When ARM finally complete their EABI (which was
called EABI-2001 until that started to be embarassing), we'll probably
follow that. Anyway, the short answer to your question is:
R0-R3: argument passing/caller-saved
R4-R10: callee-saved
R12, R14: caller-saved
R11: frame pointer
R13: stack pointer
The usual idiom for creating a stack frame is:
mov ip, sp
stmfd sp!, {r4-r10, fp, ip, lr, pc}
sub fp, ip, #4
And to return:
ldmdb fp, {r4-r10, fp, sp, pc}
Replace "r4-r10" with something appropriate to your function.
--
Ben Harris <bjh21@netbsd.org>
Portmaster, NetBSD/acorn26 <URL:http://www.netbsd.org/Ports/acorn26/>