summaryrefslogtreecommitdiffstats
path: root/linux-user
diff options
context:
space:
mode:
authorHelge Deller2022-09-24 13:45:01 +0200
committerLaurent Vivier2022-09-27 13:19:05 +0200
commit2319a53758efd0a2a1b45d94d3a3b721730cbc00 (patch)
treeb57418f44583ecab67edfed690a7510308e2e045 /linux-user
parentlinux-user/hppa: Allow PROT_GROWSUP and PROT_GROWSDOWN in mprotect() (diff)
downloadqemu-2319a53758efd0a2a1b45d94d3a3b721730cbc00.tar.gz
qemu-2319a53758efd0a2a1b45d94d3a3b721730cbc00.tar.xz
qemu-2319a53758efd0a2a1b45d94d3a3b721730cbc00.zip
linux-user/hppa: Fix setup_sigcontext()
We don't emulate a preemptive kernel on this level, and the hppa architecture doesn't allow context switches on the gateway page. So we always have to return to sc_iaoq[] and not to gr[31]. This fixes the remaining random segfaults which still occured. Signed-off-by: Helge Deller <deller@gmx.de> Message-Id: <20220924114501.21767-8-deller@gmx.de> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Diffstat (limited to 'linux-user')
-rw-r--r--linux-user/hppa/signal.c16
1 files changed, 3 insertions, 13 deletions
diff --git a/linux-user/hppa/signal.c b/linux-user/hppa/signal.c
index 396e310dc9..f253a15864 100644
--- a/linux-user/hppa/signal.c
+++ b/linux-user/hppa/signal.c
@@ -49,23 +49,13 @@ struct target_rt_sigframe {
static void setup_sigcontext(struct target_sigcontext *sc, CPUArchState *env)
{
- int flags = 0;
int i;
- /* ??? if on_sig_stack, flags |= 1 (PARISC_SC_FLAG_ONSTACK). */
-
- if (env->iaoq_f < TARGET_PAGE_SIZE) {
- /* In the gateway page, executing a syscall. */
- flags |= 2; /* PARISC_SC_FLAG_IN_SYSCALL */
- __put_user(env->gr[31], &sc->sc_iaoq[0]);
- __put_user(env->gr[31] + 4, &sc->sc_iaoq[1]);
- } else {
- __put_user(env->iaoq_f, &sc->sc_iaoq[0]);
- __put_user(env->iaoq_b, &sc->sc_iaoq[1]);
- }
+ __put_user(env->iaoq_f, &sc->sc_iaoq[0]);
+ __put_user(env->iaoq_b, &sc->sc_iaoq[1]);
__put_user(0, &sc->sc_iasq[0]);
__put_user(0, &sc->sc_iasq[1]);
- __put_user(flags, &sc->sc_flags);
+ __put_user(0, &sc->sc_flags);
__put_user(cpu_hppa_get_psw(env), &sc->sc_gr[0]);
for (i = 1; i < 32; ++i) {