Subject: Re: RFC: Change SWI number base?
To: None <Richard.Earnshaw@arm.com>
From: Ben Harris <bjh21@netbsd.org>
List: port-arm
Date: 01/04/2002 12:05:41
On Fri, 4 Jan 2002, Richard Earnshaw wrote:

> > Long ago, Acorn decreed that the top four bits of a (24-bit) SWI number
> > should indicate which operating system the SWI was for.  RISC OS set this
> > field to 0, and RISC iX set it to 8.  Later, Linux used 9, and ARM use F
> > for OS-independent SWIs.  Until now, NetBSD/arm has used 0, but I'd like
> > to change this.
[...]
> This sounds like a sensible idea, though I wouldn't have thought it was
> necessary to make emulations work (I'd be surprised if this is how FreeBSD
> and Linux emulations work on other NetBSD platforms).  Surely we need to
> know what we are emulating as we start to exec a new binary.  Once that
> has been determined (via the files magic number, I would have thought), we
> can remember this and use it to control SWI interpretation.

Indeed, but emulating things like Linux in the kernel is relatively easy,
since most of the syscalls have a 1:1 mapping to NetBSD ones.  Mapping
RISC OS SWIs is harder, and hence probably better done in user space (with
the kernel just seeing a normal NetBSD process).  This is how Riscose does
things, and I believe it's how Wine works too.

> While on the subject of SWI numbers, did we reach a decision on support
> for SWI calls from Thumb code?  Thumb is limited to 256 SWI values, so it
> might make sense for us to switch to using SWI 0, r0=syscall across the
> board when we jump to ELF.

Why?  What's wrong with keeping the ARM veneers as they are, and just
making the Thumb veneers indirect through SYS_syscall when they need to
(or even all the time, which would make SYS.h easier to write).

Remember, using SYS_syscall all the time will change a typical veneer
from:

	swi	SYS_foo
	bcs	__cerror
	mov	pc, lr

to:

	str	r3, [sp, #-4]!
	mov	r3, r2
	mov	r2, r1
	mov	r1, r0
	mov	r0, #SYS_foo
	swi	SYS_syscall
	bcs	__cerror
	mov	pc, lr

-- 
Ben Harris                                                   <bjh21@netbsd.org>
Portmaster, NetBSD/arm26               <URL:http://www.netbsd.org/Ports/arm26/>