Reputation: 308
i noticed my program acts different between i386 and arm/EABI i ran it with strace and saw pread64 parameter is not right on arm/EABI.
i ran program with gdb and looked catch syscall pread64
info registers
and didnt see anything wrong.
i bruteforced syscall parameters then noticed fourth parameter actually doesnt change anything in strace. changing parameter order/usage works for spectific architecture.
long syscall6_i386(long nr, long p0, long p1, long p2, long p3, long p4, long p5){
register long _r __asm__("eax");
register long _p0 __asm__("ebx") = p0;
register long _p1 __asm__("ecx") = p1;
register long _p2 __asm__("edx") = p2;
register long _p3 __asm__("esi") = p3;
register long _p4 __asm__("edi") = p4;
register long _p5 __asm__("ebp") = p5;
__asm__ __volatile__(
"int $0x80"
: "=r" (_r)
: "0" (nr), "r" (_p0), "r" (_p1), "r" (_p2), "r" (_p3), "r" (_p4), "r" (_p5)
: "memory"
);
return _r;
}
long syscall6_armeabi(long nr, long p0, long p1, long p2, long p3, long p4, long p5){
register long _nr __asm__("r7") = nr;
register long _r __asm__("r0"); /* also p0 */
register long _p1 __asm__("r1") = p1;
register long _p2 __asm__("r2") = p2;
register long _p3 __asm__("r3") = p3;
register long _p4 __asm__("r4") = p4;
register long _p5 __asm__("r5") = p5;
__asm__ __volatile__(
"swi 0x0"
: "=r" (_r)
: "0" (p0), "r" (_nr), "r" (_p1), "r" (_p2), "r" (_p3), "r" (_p4), "r" (_p5)
: "memory"
);
return _r;
}
with that syscall6 functions right usage is
syscall6_i386(__NR_pread64, fd, data, size, off, off >> 32, /* not used */);
syscall6_armeabi(__NR_pread64, fd, data, size, /* not used */, off, off >> 32);
where i can find right parameter order/usage for other system calls without bruteforce?
Upvotes: 0
Views: 267
Reputation: 141493
where i can find right parameter order/usage for other system calls without bruteforce?
Actually read kernel source code - most (all?) syscalls are in one place.
and
You can grep for SYSCALL_DEFINE
in the tree or architecture sub-tree.
Upvotes: 1