With those two patches applied I can no longer reproduce the problem, thanks!
For posterity, this is how I've been reproducing the problem:
1. Build a Linux kernel with this patch applied: https://patchwork.kernel.org/patch/11435077/ 2. Run this program under the kernel:
#include <stdint.h> #include <stdio.h> #include <signal.h>
void handler(int signo, siginfo_t *siginfo, void *context) { uint32_t *begin = (uint32_t *)context; uint32_t *end = ((uint32_t *)context) + (sizeof(ucontext_t)/4); for (uint32_t *i = begin; i != end; ++i) { printf("%08p %08x\n", i, *i); } _exit(0); }
int main() { struct sigaction sa; sa.sa_sigaction = handler; sa.sa_flags = SA_SIGINFO; sigaction(SIGSEGV, &sa, 0);
return *(int *)((1ULL << 56) + 0x123456); }
I would expect this program's output to include something like the following:
0xffffd5869bd0 46415201 0xffffd5869bd4 00000010 0xffffd5869bd8 00123456 0xffffd5869bdc 01000000
But the output that I was seeing with the bad qemu looked like this:
0xffffd5869bd0 46415201 0xffffd5869bd4 00000010 0xffffd5869bd8 00123456 0xffffd5869bdc 00000000
With those two patches applied I can no longer reproduce the problem, thanks!
For posterity, this is how I've been reproducing the problem:
1. Build a Linux kernel with this patch applied: https:/ /patchwork. kernel. org/patch/ 11435077/
2. Run this program under the kernel:
#include <stdint.h>
#include <stdio.h>
#include <signal.h>
void handler(int signo, siginfo_t *siginfo, void *context) { ucontext_ t)/4);
uint32_t *begin = (uint32_t *)context;
uint32_t *end = ((uint32_t *)context) + (sizeof(
for (uint32_t *i = begin; i != end; ++i) {
printf("%08p %08x\n", i, *i);
}
_exit(0);
}
int main() { SIGSEGV, &sa, 0);
struct sigaction sa;
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;
sigaction(
return *(int *)((1ULL << 56) + 0x123456);
}
I would expect this program's output to include something like the following:
0xffffd5869bd0 46415201
0xffffd5869bd4 00000010
0xffffd5869bd8 00123456
0xffffd5869bdc 01000000
But the output that I was seeing with the bad qemu looked like this:
0xffffd5869bd0 46415201
0xffffd5869bd4 00000010
0xffffd5869bd8 00123456
0xffffd5869bdc 00000000