mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 18:13:04 +00:00
3ddb3fd8cd
The alignment of a structure is that of its largest member. On
architectures like 32-bit Arm (but not e.g. 32-bit x86) 64-bit integers
will require 64-bit alignment and not its natural word size.
This means that there is no portable way to add 64-bit integers to
siginfo_t on 32-bit architectures without breaking the ABI, because
siginfo_t does not yet (and therefore likely never will) contain 64-bit
fields on 32-bit architectures. Adding a 64-bit integer could change the
alignment of the union after the 3 initial int si_signo, si_errno,
si_code, thus introducing 4 bytes of padding shifting the entire union,
which would break the ABI.
One alternative would be to use the __packed attribute, however, it is
non-standard C. Given siginfo_t has definitions outside the Linux kernel
in various standard libraries that can be compiled with any number of
different compilers (not just those we rely on), using non-standard
attributes on siginfo_t should be avoided to ensure portability.
In the case of the si_perf field, word size is sufficient since there is
no exact requirement on size, given the data it contains is user-defined
via perf_event_attr::sig_data. On 32-bit architectures, any excess bits
of perf_event_attr::sig_data will therefore be truncated when copying
into si_perf.
Since si_perf is intended to disambiguate events (e.g. encoding relevant
information if there are more events of the same type), 32 bits should
provide enough entropy to do so on 32-bit architectures.
For 64-bit architectures, no change is intended.
Fixes:
|
||
---|---|---|
.. | ||
auxvec.h | ||
bitsperlong.h | ||
bpf_perf_event.h | ||
errno-base.h | ||
errno.h | ||
fcntl.h | ||
hugetlb_encode.h | ||
int-l64.h | ||
int-ll64.h | ||
ioctl.h | ||
ioctls.h | ||
ipcbuf.h | ||
Kbuild | ||
kvm_para.h | ||
mman-common.h | ||
mman.h | ||
msgbuf.h | ||
param.h | ||
poll.h | ||
posix_types.h | ||
resource.h | ||
sembuf.h | ||
setup.h | ||
shmbuf.h | ||
siginfo.h | ||
signal-defs.h | ||
signal.h | ||
socket.h | ||
sockios.h | ||
stat.h | ||
statfs.h | ||
swab.h | ||
termbits.h | ||
termios.h | ||
types.h | ||
ucontext.h | ||
unistd.h |