Message ID | 20180516081910.10067-8-ynorov@caviumnetworks.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed 2018-05-16 11:18:52, Yury Norov wrote: > Based on Andrew Pinski's patch-series. > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> So Andrew's signoff should be here? > --- > Documentation/arm64/ilp32.txt | 45 +++++++++++++++++++++++++++++++++++ > 1 file changed, 45 insertions(+) > create mode 100644 Documentation/arm64/ilp32.txt > > diff --git a/Documentation/arm64/ilp32.txt b/Documentation/arm64/ilp32.txt > new file mode 100644 > index 000000000000..d0fd5109c4b2 > --- /dev/null > +++ b/Documentation/arm64/ilp32.txt > @@ -0,0 +1,45 @@ > +ILP32 AARCH64 SYSCALL ABI > +========================= > + > +This document describes the ILP32 syscall ABI and where it differs > +from the generic compat linux syscall interface. I was hoping to learn what ILP32 is / what is it good for, but no, this does not tell me... it would be good to do a short explanation here, and maybe reference it from cover letter of the series... Pavel
Hi Pavel, On Wed, May 23, 2018 at 04:06:20PM +0200, Pavel Machek wrote: > On Wed 2018-05-16 11:18:52, Yury Norov wrote: > > Based on Andrew Pinski's patch-series. > > > > Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> > > So Andrew's signoff should be here? Yes it should, but it lost since v4. I'll restore it. > > --- > > Documentation/arm64/ilp32.txt | 45 +++++++++++++++++++++++++++++++++++ > > 1 file changed, 45 insertions(+) > > create mode 100644 Documentation/arm64/ilp32.txt > > > > diff --git a/Documentation/arm64/ilp32.txt b/Documentation/arm64/ilp32.txt > > new file mode 100644 > > index 000000000000..d0fd5109c4b2 > > --- /dev/null > > +++ b/Documentation/arm64/ilp32.txt > > @@ -0,0 +1,45 @@ > > +ILP32 AARCH64 SYSCALL ABI > > +========================= > > + > > +This document describes the ILP32 syscall ABI and where it differs > > +from the generic compat linux syscall interface. > > I was hoping to learn what ILP32 is / what is it good for, but no, > this does not tell me... it would be good to do a short explanation > here, and maybe reference it from cover letter of the series... > Pavel ILP32 is ABI acronym that means "Integers, Longs and Pointers are 32-bit". And LP64 means "Longs and Pointers are 64-bit". There's AN490 - "ILP32 for AArch64 Whitepaper" from ARM which covers the topic: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0490a/ar01s01.html And some talks: http://connect.linaro.org/resource/bkk16/bkk16-305b/ Briefly, ILP32 is 32-bit ABI that works with AARCH64 instruction set. It looks better in some performance tests, and is useful for compatibility with 32-bit legacy code. If you're more familiar with x86 terminology, in ARM world LP64 corresponds to x86_64, AARCH32_EL0 corresponds to x86_32, and ILP32 corresponds to x32 ABI. I'll add link to AN490 in next submission. Yury > -- > (english) http://www.livejournal.com/~pavelmachek > (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Yury & Pavel, > On 24 May 2018, at 14:15, Yury Norov <ynorov@caviumnetworks.com> wrote: > > Hi Pavel, > > On Wed, May 23, 2018 at 04:06:20PM +0200, Pavel Machek wrote: >> On Wed 2018-05-16 11:18:52, Yury Norov wrote: >>> Based on Andrew Pinski's patch-series. >>> >>> Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> >> >> So Andrew's signoff should be here? > > Yes it should, but it lost since v4. I'll restore it. > >>> --- >>> Documentation/arm64/ilp32.txt | 45 +++++++++++++++++++++++++++++++++++ >>> 1 file changed, 45 insertions(+) >>> create mode 100644 Documentation/arm64/ilp32.txt >>> >>> diff --git a/Documentation/arm64/ilp32.txt b/Documentation/arm64/ilp32.txt >>> new file mode 100644 >>> index 000000000000..d0fd5109c4b2 >>> --- /dev/null >>> +++ b/Documentation/arm64/ilp32.txt >>> @@ -0,0 +1,45 @@ >>> +ILP32 AARCH64 SYSCALL ABI >>> +========================= >>> + >>> +This document describes the ILP32 syscall ABI and where it differs >>> +from the generic compat linux syscall interface. >> >> I was hoping to learn what ILP32 is / what is it good for, but no, >> this does not tell me... it would be good to do a short explanation >> here, and maybe reference it from cover letter of the series... >> Pavel > > ILP32 is ABI acronym that means "Integers, Longs and Pointers are 32-bit". > And LP64 means "Longs and Pointers are 64-bit”. Just a nitpick: ILP32 is in fact just the memory model, but calling from ILP32 code into the Linux kernel requires modifications to the syscall-ABI due to datastructure layout changing (every time a pointer or a ‘long’ is present in a structure). As such structures are passed between the userspace and the kernel (and also due to the fact that time_t is an ‘unsigned long’ in the C language standard), modifications to the syscall ABI in Linux are needed to support ILP32 processes calling into the kernel. Things get a bit more involved, as the final consensus was to pass 64bit quantities in the lower half of 2 64bit registers instead of as a single register: this makes the way (on AArch64) that an ILP32 process calls into the kernel more dissimilar from a LP64 process calling the same syscall. What this rambling boils down to is: “ILP32" is the memory model, whereas this series deals with the “Linux/AArch64 syscall ABI for ILP32 processes”. Thanks, Phil. > > There's AN490 - "ILP32 for AArch64 Whitepaper" from ARM which covers > the topic: > http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0490a/ar01s01.html > > And some talks: > http://connect.linaro.org/resource/bkk16/bkk16-305b/ > > Briefly, ILP32 is 32-bit ABI that works with AARCH64 instruction set. It looks > better in some performance tests, and is useful for compatibility with 32-bit > legacy code. > > If you're more familiar with x86 terminology, in ARM world LP64 corresponds > to x86_64, AARCH32_EL0 corresponds to x86_32, and ILP32 corresponds to x32 > ABI. > > I'll add link to AN490 in next submission. > > Yury > >> -- >> (english) http://www.livejournal.com/~pavelmachek >> (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
diff --git a/Documentation/arm64/ilp32.txt b/Documentation/arm64/ilp32.txt new file mode 100644 index 000000000000..d0fd5109c4b2 --- /dev/null +++ b/Documentation/arm64/ilp32.txt @@ -0,0 +1,45 @@ +ILP32 AARCH64 SYSCALL ABI +========================= + +This document describes the ILP32 syscall ABI and where it differs +from the generic compat linux syscall interface. + +AARCH64/ILP32 userspace can pass garbage in the top halve of w0-w7 registers +(syscall arguments). So top 32 bits are zeroed for them. + +Comparing to AARCH32, AARCH64/ILP32 has 64-bit length of following types: +ino_t is u64 type. +off_t is s64 type. +blkcnt_t is s64 type. +fsblkcnt_t is u64 type. +fsfilcnt_t is u64 type. +rlim_t is u64 type. + +AARCH64/ILP32 ABI uses standard syscall table which can be found at +include/uapi/asm-generic/unistd.h, with the exceptions listed below. + +Syscalls which pass 64-bit values are handled by the code shared from +AARCH32 and pass that value as a pair. Following syscalls are affected: +fadvise64_64() +fallocate() +ftruncate64() +pread64() +pwrite64() +readahead() +sync_file_range() +truncate64() + +ptrace() syscall is handled by compat version. + +shmat() syscall is handled by non-compat handler as aarch64/ilp32 has no +limitation on 4-pages alignment for shared memory. + +statfs() and fstatfs() take the size of struct statfs as an argument. +It is calculated differently in kernel and user spaces. So AARCH32 handlers +are taken to handle it. + +struct rt_sigframe is redefined and contains struct compat_siginfo, +as compat syscalls expect, and struct ilp32_ucontext, to handle +AARCH64 register set and 32-bit userspace register representation. + +elf_gregset_t is taken from lp64 to handle registers properly.
Based on Andrew Pinski's patch-series. Signed-off-by: Yury Norov <ynorov@caviumnetworks.com> --- Documentation/arm64/ilp32.txt | 45 +++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Documentation/arm64/ilp32.txt