summary refs log tree commit diff stats
path: root/gitlab/issues_text/target_riscv/host_missing/accel_missing/1093
blob: e7f74b5e5db3303532c198a555794c77e3b75b9d (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
RISC-V: signal frame is misaligned in signal handlers
Description of problem:
`qemu-user` misaligns the signal frame (to 4 bytes rather than 16 bytes) on RISC-V 64, e.g causing pointer misalignment diagnostics to be triggered by UBSan.
Steps to reproduce:
1. Create a C file with the following contents:
```c
#include <signal.h>
#include <stdio.h>

void handler(int sig, siginfo_t *info, void *context) {
	printf("signal occurred, info: %p, context: %p\n", info, context);
}

int main() {
	struct sigaction act;
	act.sa_flags = SA_SIGINFO;
	act.sa_sigaction = handler;
	sigaction(SIGINT, &act, NULL);

	// Deliberately misalign the stack
	asm volatile ("addi sp, sp, -4");

	while(1);
	// Unreachable
}
```
2. Compile with an appropriate RISC-V toolchain and run with `qemu-riscv64 ./a.out`.
3. Send a `SIGINT` (e.g by hitting Ctrl-C), and observe that the signal frame will be misaligned:
```
signal occurred, info: 0x400080025c, context: 0x40008002dc
```
Additional information:
This issue is alluded to in the source code, see https://gitlab.com/qemu-project/qemu/-/blob/master/linux-user/riscv/signal.c#L68-69. It should be sufficient to change that constant to 15.