| From 754fd932bedacfd7de35cf74da6adca89ba28089 Mon Sep 17 00:00:00 2001 |
| From: Peter Maydell <peter.maydell@linaro.org> |
| Date: Fri, 28 Oct 2011 10:52:40 +0100 |
| Subject: [PATCH 1/3] qemu-tls.h: Add abstraction layer for TLS variables |
| |
| Add an abstraction layer for defining and using thread-local |
| variables. For the moment this is implemented only for Linux, |
| which means they can only be used in restricted circumstances. |
| The abstraction layer allows us to add POSIX and Win32 support |
| later. |
| |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Peter Maydell <peter.maydell@linaro.org> |
| Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> |
| --- |
| qemu-tls.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| 1 files changed, 52 insertions(+), 0 deletions(-) |
| create mode 100644 qemu-tls.h |
| |
| diff --git a/qemu-tls.h b/qemu-tls.h |
| new file mode 100644 |
| index 0000000..5b70f10 |
| --- /dev/null |
| +++ b/qemu-tls.h |
| @@ -0,0 +1,52 @@ |
| +/* |
| + * Abstraction layer for defining and using TLS variables |
| + * |
| + * Copyright (c) 2011 Red Hat, Inc |
| + * Copyright (c) 2011 Linaro Limited |
| + * |
| + * Authors: |
| + * Paolo Bonzini <pbonzini@redhat.com> |
| + * Peter Maydell <peter.maydell@linaro.org> |
| + * |
| + * This program is free software; you can redistribute it and/or |
| + * modify it under the terms of the GNU General Public License as |
| + * published by the Free Software Foundation; either version 2 of |
| + * the License, or (at your option) any later version. |
| + * |
| + * This program is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License along |
| + * with this program; if not, see <http://www.gnu.org/licenses/>. |
| + */ |
| + |
| +#ifndef QEMU_TLS_H |
| +#define QEMU_TLS_H |
| + |
| +/* Per-thread variables. Note that we only have implementations |
| + * which are really thread-local on Linux; the dummy implementations |
| + * define plain global variables. |
| + * |
| + * This means that for the moment use should be restricted to |
| + * per-VCPU variables, which are OK because: |
| + * - the only -user mode supporting multiple VCPU threads is linux-user |
| + * - TCG system mode is single-threaded regarding VCPUs |
| + * - KVM system mode is multi-threaded but limited to Linux |
| + * |
| + * TODO: proper implementations via Win32 .tls sections and |
| + * POSIX pthread_getspecific. |
| + */ |
| +#ifdef __linux__ |
| +#define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x) |
| +#define DEFINE_TLS(type, x) __thread __typeof__(type) tls__##x |
| +#define get_tls(x) tls__##x |
| +#else |
| +/* Dummy implementations which define plain global variables */ |
| +#define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x) |
| +#define DEFINE_TLS(type, x) __typeof__(type) tls__##x |
| +#define get_tls(x) tls__##x |
| +#endif |
| + |
| +#endif |
| -- |
| 1.7.3.1 |
| |
| |
| From 8a5f7b03a0a711ec8e04aeebe339cdb8b876794b Mon Sep 17 00:00:00 2001 |
| From: Paolo Bonzini <pbonzini@redhat.com> |
| Date: Fri, 28 Oct 2011 10:52:41 +0100 |
| Subject: [PATCH 2/3] darwin-user/main.c: Drop unused cpu_single_env definition |
| |
| Drop the cpu_single_env definition as it is unused. |
| |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> |
| --- |
| darwin-user/main.c | 2 -- |
| 1 files changed, 0 insertions(+), 2 deletions(-) |
| |
| diff --git a/darwin-user/main.c b/darwin-user/main.c |
| index 1a881a0..c0f14f8 100644 |
| --- a/darwin-user/main.c |
| +++ b/darwin-user/main.c |
| @@ -729,8 +729,6 @@ static void usage(void) |
| |
| /* XXX: currently only used for async signals (see signal.c) */ |
| CPUState *global_env; |
| -/* used only if single thread */ |
| -CPUState *cpu_single_env = NULL; |
| |
| /* used to free thread contexts */ |
| TaskState *first_task_state; |
| -- |
| 1.7.3.1 |
| |
| |
| From b3c4bbe56dc707102d3abd969f51bb2aa9c6c53d Mon Sep 17 00:00:00 2001 |
| From: Paolo Bonzini <pbonzini@redhat.com> |
| Date: Fri, 28 Oct 2011 10:52:42 +0100 |
| Subject: [PATCH 3/3] Make cpu_single_env thread-local |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Make cpu_single_env thread-local. This fixes a regression |
| in handling of multi-threaded programs in linux-user mode |
| (bug 823902). |
| |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| [Peter Maydell: rename tls_cpu_single_env to cpu_single_env] |
| Signed-off-by: Peter Maydell <peter.maydell@linaro.org> |
| Reviewed-by: Andreas Fรคrber <afaerber@suse.de> |
| Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> |
| --- |
| cpu-all.h | 4 +++- |
| exec.c | 2 +- |
| 2 files changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/cpu-all.h b/cpu-all.h |
| index 42a5fa0..5f47ab8 100644 |
| --- a/cpu-all.h |
| +++ b/cpu-all.h |
| @@ -20,6 +20,7 @@ |
| #define CPU_ALL_H |
| |
| #include "qemu-common.h" |
| +#include "qemu-tls.h" |
| #include "cpu-common.h" |
| |
| /* some important defines: |
| @@ -334,7 +335,8 @@ void cpu_dump_statistics(CPUState *env, FILE *f, fprintf_function cpu_fprintf, |
| void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...) |
| GCC_FMT_ATTR(2, 3); |
| extern CPUState *first_cpu; |
| -extern CPUState *cpu_single_env; |
| +DECLARE_TLS(CPUState *,cpu_single_env); |
| +#define cpu_single_env get_tls(cpu_single_env) |
| |
| /* Flags for use in ENV->INTERRUPT_PENDING. |
| |
| diff --git a/exec.c b/exec.c |
| index 54ecbe7..6b92198 100644 |
| --- a/exec.c |
| +++ b/exec.c |
| @@ -120,7 +120,7 @@ static MemoryRegion *system_io; |
| CPUState *first_cpu; |
| /* current CPU in the current thread. It is only valid inside |
| cpu_exec() */ |
| -CPUState *cpu_single_env; |
| +DEFINE_TLS(CPUState *,cpu_single_env); |
| /* 0 = Do not count executed instructions. |
| 1 = Precise instruction counting. |
| 2 = Adaptive rate instruction counting. */ |
| -- |
| 1.7.3.1 |
| |
| |