hunter
hunter

Reputation: 308

why system call pread64 parameter differs between i386 and arm/EABI?

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

Answers (1)

KamilCuk
KamilCuk

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.

https://github.com/torvalds/linux/blob/4da9af0014b51c8b015ed8c622440ef28912efe6/arch/x86/kernel/sys_ia32.c#L68

and

https://github.com/torvalds/linux/blob/fcadab740480e0e0e9fa9bd272acd409884d431a/arch/arm64/kernel/sys32.c#L75

You can grep for SYSCALL_DEFINE in the tree or architecture sub-tree.

Upvotes: 1

Related Questions