summary refs log tree commit diff stats
path: root/results/classifier/user-mode-bugs/1416988
blob: c84a31313b556cdfb203e11cda35d73f51389980 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Wrong signal handling in qemu-aarch64.

Running GCC 5.0 testsuite under qemu-aarch64, I noticed that tests connected with stack unwinding fail with:

qemu: uncaught target signal 11 (Segmentation fault) - core dumped

or run into infinite loop.

Here is one example:

$ /home/max/build/gcc-aarch64/gcc/xgcc -B/home/max/build/gcc-aarch64/gcc/ /home/max/src/toolchain/gcc/gcc/testsuite/gcc.dg/cleanup-11.c -fexceptions -fnon-call-exceptions -O2 -lm -o ./cleanup-11.exe

$ qemu-aarch64 -L /home/max/install/aarch64/aarch64-linux/sys-root/ -R 0 -/cleanup-11.exe
qemu: uncaught target signal 11 (Segmentation fault) - core dumped.

Actually, this caused by ABI incompatibility between Linux Kernel (trunk) and qemu-aarch64. In fact, size of siginfo structure in Linux and target_siginfo structure in qemu-aarch64 differ:

sizeof (struct target_siginfo) = 136  // QEMU
sizeof (struct siginfo) = 128               // Linux Kernel


This caused by wrong TARGET_SI_PAD_SIZE defined in  linux-user/syscall_defs.h:

#define TARGET_SI_PAD_SIZE	((TARGET_SI_MAX_SIZE/sizeof(int)) - 3)

In Kernel respective value is:

#define SI_PAD_SIZE     ((SI_MAX_SIZE - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
.............................................
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))  // for Aarch64

Trivial fix, changing TARGET_SI_PAD_SIZE to right value, is attached.