Seebs <se...@seebs.net> writes: > On Tue, 27 Mar 2018 21:20:24 +0200 > Enrico Scholz <enrico.sch...@sigma-chemnitz.de> wrote: > >> SYS_readahead is one of a few syscalls which pass 64 bit arguments on >> 32 bit architectures. Without the manual splitting, the ABI will >> cause the compiler to insert a dummy argument so that registers are >> aligned for 64 bit values. > > I'm now even more confused. This sounds like the compiler *would* > insert the argument without being told to, because the ABI "will cause" > that, in which case the manual splitting wouldn't be necessary?
For example, by ARM EABI function arguments are transmitted in r0, r1, r2, r3. But 64 bit values must be aligned to even registers. So, assuming code like | void foo(int a, unsigned long long b) | { | } | | void bar(void) | { | foo(1, 2) | } The compiler generates mov r2, #2 mov r3, #0 mov r0, #1 bl foo e.g. it skips 'r1'. When you use the variadic syscall(2) function, you pass an extra argument at front (the syscall number) syscall(__NR_readahead, fd, offset_64bit, count); --> when doing the 'svc', fd goes into 'r0' and offset_64bit into 'r1' + 'r2' In-kernel function does not have have the syscall-number and is sys_readahead(int fd, loff_t, count) --> 'fd' is expected in 'r0', offset in 'r2' + 'r3' due to the ABI Enrico -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core