Re: [PATCH 2/3] vmsplice: make vmsplice a trivial wrapper for preadv2/pwritev2
Florian Weimer <[email protected]>
| Newsgroups | org.kernel.vger.linux-api,dev.linux.lists.patches,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.netdev,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
* Linus Torvalds: > On Fri, 5 Jun 2026 at 02:33, Florian Weimer <[email protected]> wrote: >> >> * Linus Torvalds: >> >> > x86 really doesn't *care*. If the caller zero-extends or leaves high >> > bits set randomly, according to the x86 ABI that's perfectly fine: the >> > callee will only care about the low 32 bits. So the high bits are >> > simply not relevant for the ABI. >> >> Please note that Clang does not implement the x86-64 ABI and requires >> zero extension. We see increasing problems from that, now that we have >> more C code calling Rust code. > > Uhhuh. But that is only specific to 'bool', right? Also char and short. This extern int a[]; int f (short i) { return a[i]; } gets turned into: f: movslq %edi, %rax movl a(,%rax,4), %eax retq This code assumes that the short value has been previously sign-extended into %edi. As I read the original psABI, this assumption was not valid, and the extra bits were unspecified by omission. And GCC tends to use shorter instruction encodings without extension if that does not result in partial register stalls. > If it were to have the same issue that powerpc(*) had - that 'unsigned > int' has to be passed to functions with well-defined high bits - that > would be bad. I would have to ask around. It's hard to tell from experiments what the expectations around int/unsigned arguments are. Clang and LLVM treat the upper bits from int/unsigned return values as undefined in some cases. > Anyway, for the kernel, this shouldn't be an issue simply because we > typically avoid 'bool' in arguments or structures that are exposed to > outside. Right, but array indexing with u8/u16/s8/s16 function arguments is impacted, too. Thanks, Florian