|
Message-ID: <CAJ86T=XGHYkCba20Dy5yFeRMWaTWtM8BJtJnSP6mExYDfkbfYA@mail.gmail.com> Date: Fri, 15 Mar 2019 01:32:48 -0700 From: Andre McCurdy <armccurdy@...il.com> To: musl@...ts.openwall.com Subject: Re: do we need different definition of __SYSCALL_LL_E for different endian? On Thu, Mar 14, 2019 at 9:15 PM wangjianjian (C) <wangjianjian3@...wei.com> wrote: > > This is arm definition of macro __SYSCALL_LL_E: > #define __SYSCALL_LL_E(x) \ > 2 ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \ > 3 ((union { long long ll; long l[2]; }){ .ll = x }).l[1] > > But do we need to deferent definitions for different endian? > From Linux man page, > > For example, on the ARM architecture Embedded ABI (EABI), a 64-bit value (e.g., long long) must be aligned to an even register pair. Thus, using > syscall() instead of the wrapper provided by glibc, the readahead() system call would be invoked as follows on the ARM architecture with the EABI: > > syscall(SYS_readahead, fd, 0, > (unsigned int) (offset >> 32), > (unsigned int) (offset & 0xFFFFFFFF), > count); You seem to be looking at an out of date version of the man page. Later versions have been fixed to make it clearer that the order is endian specific: http://man7.org/linux/man-pages/man2/syscall.2.html > Seems the third argument is the high 32 bit and the fourth argument is the low 32 bit. So do we need below fix? > #ifdef __ARM_BIG_ENDIAN > #define __SYSCALL_LL_E(x) \ > 2 ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \ > 3 ((union { long long ll; long l[2]; }){ .ll = x }).l[1] > #else > #define __SYSCALL_LL_E(x) \ > 2 ((union { long long ll; long l[2]; }){ .ll = x }).l[1], \ > 3 ((union { long long ll; long l[2]; }){ .ll = x }).l[0] > #endif > > Thanks. > > BR, > Wang Jianjian >
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.