[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: SVC (SWI) for Thumb
On Tue, Aug 13, 2013 at 06:30:14PM -0700, Matt Thomas wrote:
> Currently, NetBSD/arm uses a "global" SVC space (see <arm/swi.h) but
> in Thumb mode, the SWI instruction can only hold an 8 bit value and
> we have nearly 512. The 0x00a0000. indicated the NetBSD SVC space.
> So my thought is to reserve svc codes in thumb mode, 254 and 255.
> In either case, if the syscall number is less than 254, it's used
> directly with svc.
> 255 is for thumb on systems with thumb2 available and any syscall
> number >= 254 is placed in the ip (r12) register via a movw
> instruction. This is simple and straight forward.
> 254 is for thumb on systems with just thumb1 and any system call
> number >= 254. The argument in r0 is moved to ip since ip isn't
> easily used. r0 will contain the syscall number - 254. This
> allows for a single addition movs r0, #<syscall - 254> for calls
> less than 510. For syscalls >= 512, this sequence is used.
> movs r0, #(syscall - 254)/8
> lsls r0, r0, #3
Shouldn't that be a shift by 8 ?
> adds r0, r0, #((syscall - 254) & 7)
> This allows up to 2047 syscalls which is plenty of room for growth.
> The SWI handler will do the adjustments needed when it encounters
> a thumb SVC 254 or 255.
Why not just use r0 for thumb v1 and v2 ?
And why not pass the syscall number in a register for all syscalls?
Setting an 8 bit value costs one instruction in userspace, but probably
removes one from the kernel side (does it have to read the swi instruction
word to get the value?).
David Laight: david%l8s.co.uk@localhost
Main Index |
Thread Index |