diff options
author | Helge Deller | 2022-09-24 13:45:01 +0200 |
---|---|---|
committer | Laurent Vivier | 2022-09-27 13:19:05 +0200 |
commit | 2319a53758efd0a2a1b45d94d3a3b721730cbc00 (patch) | |
tree | b57418f44583ecab67edfed690a7510308e2e045 /linux-user | |
parent | linux-user/hppa: Allow PROT_GROWSUP and PROT_GROWSDOWN in mprotect() (diff) | |
download | qemu-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.c | 16 |
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) { |