powerpc Linux scv support and scv system call ABI proposal
Nicholas Piggin
npiggin at gmail.com
Wed Jan 29 15:41:27 AEDT 2020
Florian Weimer's on January 29, 2020 1:58 am:
> * Nicholas Piggin:
>
>> That gets the LR save/restore right when we're also using r0.
>
> Yes, I agree it looks good. Nice.
>
>>> But the kernel uses the -errno convention internally, so I think it
>>> would make sense to pass this to userspace and not convert back and
>>> forth. This would align with what most of the architectures do, and
>>> also avoids the GCC oddity.
>>
>> Yes I would be interested in opinions for this option. It seems like
>> matching other architectures is a good idea. Maybe there are some
>> reasons not to.
>
> If there were a POWER-specific system call that uses all result bits and
> doesn't have room for the 4096 error states (or an error number that's
> outside that range), that would be a blocker. I can't find such a
> system call wrapped in the glibc sources.
Nothing apparent in the kernel sources either.
> musl's inline syscalls always
> convert the errno state to -errno, so it's not possible to use such a
> system call there.
>
>>>> - Should this be for 64-bit only? 'scv 1' could be reserved for 32-bit
>>>> calls if there was interest in developing an ABI for 32-bit programs.
>>>> Marginal benefit in avoiding compat syscall selection.
>>>
>>> We don't have an ELFv2 ABI for 32-bit. I doubt it makes sense to
>>> provide an ELFv1 port for this given that it's POWER9-specific.
>>
>> Okay. There's no reason not to enable this for BE, at least for the
>> kernel it's no additional work so it probably remains enabled (unless
>> there is something really good we could do with the ABI if we exclude
>> ELFv1 but I don't see anything).
>>
>> But if glibc only builds for ELFv2 support that's probably reasonable.
>
> To be clear, we still support ELFv1 for POWER, but given that this
> feature is POWER9 and later, I expect the number of users benefiting
> from 32-bit support (or ELFv1 and thus big-endian support) to be quite
> small.
>
> Especially if we go the conditional branch route, I would restrict this
> to ELFv2 in glibc, at least for default builds.
>
>>> From the glibc perspective, the major question is how we handle run-time
>>> selection of the system call instruction sequence. On i386, we use a
>>> function pointer in the TCB to call an instruction sequence in the vDSO.
>>> That's problematic from a security perspective. I expect that on
>>> POWER9, using a pointer in read-only memory would be equally
>>> non-attractive due to a similar lack of PC-relative addressing. We
>>> could use the HWCAP bit in the TCB, but that would add another (easy to
>>> predict) conditional branch to every system call.
>>
>> I would have to defer to glibc devs on this. Conditional branch
>> should be acceptable I think, scv improves speed as much as several
>> mispredicted branches (about 90 cycles).
>
> But we'd have to pay for that branch (and likely the LR clobber) on
> legacy POWER, and that's something to consider, too.
We would that's true.
> Is there an additional performance hit if a process uses both the old
> and new system call sequence?
No state or logic required to switch between them or run them
concurrently. Just the extra instruction footprint.
Thanks,
Nick
More information about the Linuxppc-dev
mailing list