Port-arm archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: SVC (SWI) for Thumb



On Aug 14, 2013, at 12:32 AM, David Laight <david%l8s.co.uk@localhost> wrote:

> 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 ?

No.  The add can only take a 3 bit value (hence, the divide 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 ?

it just avoids an extra instruction in the Thumb2 case.

> 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?).

I don't have a problem with that.  


Home | Main Index | Thread Index | Old Index