mirror of https://github.com/xemu-project/xemu.git
* x86 bugfixes
* OpenBSD support for naming threads * Refined Python support policy -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmP0wtkUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroNI6QgAjMvEV0N5FZYMpiuQdjebBeV+uHM6 LThewCQa0cW5jb1X1NFBbOxYlNfE3WQeZqQF+BiVJr5wT2UsyNsPH7wTjsP387vV juoD7D/XZo8P4Qi+vJWo8XVBrzWEK8QS1P+NxWr+ZnsAhDx2+MR87fVmHtVBW1pI oDO0iyRrvVtaTAIVyNWSgZ59SLMmcH/6L4aYv5nrKYuAWx7fTneGGheKuqk55RsV sMv+fHolmmwKVm8tMFksw0atPwL7ZmSm1uObNHCQKdDNSoakC7YpaXa3y8LEzU7I B4h/PsmRpN33ggvsiuzFp9kfEHMy4QazfpoVFFqTLalhTr+XuiNTxj8xdA== =6eNN -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging * x86 bugfixes * OpenBSD support for naming threads * Refined Python support policy # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmP0wtkUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroNI6QgAjMvEV0N5FZYMpiuQdjebBeV+uHM6 # LThewCQa0cW5jb1X1NFBbOxYlNfE3WQeZqQF+BiVJr5wT2UsyNsPH7wTjsP387vV # juoD7D/XZo8P4Qi+vJWo8XVBrzWEK8QS1P+NxWr+ZnsAhDx2+MR87fVmHtVBW1pI # oDO0iyRrvVtaTAIVyNWSgZ59SLMmcH/6L4aYv5nrKYuAWx7fTneGGheKuqk55RsV # sMv+fHolmmwKVm8tMFksw0atPwL7ZmSm1uObNHCQKdDNSoakC7YpaXa3y8LEzU7I # B4h/PsmRpN33ggvsiuzFp9kfEHMy4QazfpoVFFqTLalhTr+XuiNTxj8xdA== # =6eNN # -----END PGP SIGNATURE----- # gpg: Signature made Tue 21 Feb 2023 13:10:49 GMT # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: target/i386/gdbstub: Fix a bug about order of FPU stack in 'g' packets. docs: build-platforms: refine requirements on Python build dependencies thread-posix: add support for setting threads name on OpenBSD target/i386: Fix 32-bit AD[CO]X insns in 64-bit mode Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
3f21065f09
|
@ -86,6 +86,38 @@ respective ports repository, while NetBSD will use the pkgsrc repository.
|
||||||
For macOS, `Homebrew`_ will be used, although `MacPorts`_ is expected to carry
|
For macOS, `Homebrew`_ will be used, although `MacPorts`_ is expected to carry
|
||||||
similar versions.
|
similar versions.
|
||||||
|
|
||||||
|
Some build dependencies may follow less conservative rules:
|
||||||
|
|
||||||
|
Python runtime
|
||||||
|
Distributions with long-term support often provide multiple versions
|
||||||
|
of the Python runtime. While QEMU will initially aim to support the
|
||||||
|
distribution's default runtime, it may later increase its minimum version
|
||||||
|
to any newer python that is available as an option from the vendor.
|
||||||
|
In this case, it will be necessary to use the ``--python`` command line
|
||||||
|
option of the ``configure`` script to point QEMU to a supported
|
||||||
|
version of the Python runtime.
|
||||||
|
|
||||||
|
As of QEMU |version|, the minimum supported version of Python is 3.6.
|
||||||
|
|
||||||
|
Python build dependencies
|
||||||
|
Some of QEMU's build dependencies are written in Python. Usually these
|
||||||
|
are only packaged by distributions for the default Python runtime.
|
||||||
|
If QEMU bumps its minimum Python version and a non-default runtime is
|
||||||
|
required, it may be necessary to fetch python modules from the Python
|
||||||
|
Package Index (PyPI) via ``pip``, in order to build QEMU.
|
||||||
|
|
||||||
|
Optional build dependencies
|
||||||
|
Build components whose absence does not affect the ability to build
|
||||||
|
QEMU may not be available in distros, or may be too old for QEMU's
|
||||||
|
requirements. Many of these, such as the Avocado testing framework
|
||||||
|
or various linters, are written in Python and therefore can also
|
||||||
|
be installed using ``pip``. Cross compilers are another example
|
||||||
|
of optional build-time dependency; in this case it is possible to
|
||||||
|
download them from repositories such as EPEL, to use container-based
|
||||||
|
cross compilation using ``docker`` or ``podman``, or to use pre-built
|
||||||
|
binaries distributed with QEMU.
|
||||||
|
|
||||||
|
|
||||||
Windows
|
Windows
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
|
12
meson.build
12
meson.build
|
@ -2129,6 +2129,18 @@ config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_pre
|
||||||
pthread_create(&thread, 0, f, 0);
|
pthread_create(&thread, 0, f, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}''', dependencies: threads))
|
}''', dependencies: threads))
|
||||||
|
config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <pthread_np.h>
|
||||||
|
|
||||||
|
static void *f(void *p) { return NULL; }
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
pthread_t thread;
|
||||||
|
pthread_create(&thread, 0, f, 0);
|
||||||
|
pthread_set_name_np(thread, "QEMU");
|
||||||
|
return 0;
|
||||||
|
}''', dependencies: threads))
|
||||||
config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
|
config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
|
@ -121,7 +121,9 @@ int x86_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
|
||||||
return gdb_get_reg32(mem_buf, env->regs[gpr_map32[n]]);
|
return gdb_get_reg32(mem_buf, env->regs[gpr_map32[n]]);
|
||||||
}
|
}
|
||||||
} else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
|
} else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
|
||||||
floatx80 *fp = (floatx80 *) &env->fpregs[n - IDX_FP_REGS];
|
int st_index = n - IDX_FP_REGS;
|
||||||
|
int r_index = (st_index + env->fpstt) % 8;
|
||||||
|
floatx80 *fp = &env->fpregs[r_index].d;
|
||||||
int len = gdb_get_reg64(mem_buf, cpu_to_le64(fp->low));
|
int len = gdb_get_reg64(mem_buf, cpu_to_le64(fp->low));
|
||||||
len += gdb_get_reg16(mem_buf, cpu_to_le16(fp->high));
|
len += gdb_get_reg16(mem_buf, cpu_to_le16(fp->high));
|
||||||
return len;
|
return len;
|
||||||
|
|
|
@ -1037,6 +1037,8 @@ static void gen_ADCOX(DisasContext *s, CPUX86State *env, MemOp ot, int cc_op)
|
||||||
#ifdef TARGET_X86_64
|
#ifdef TARGET_X86_64
|
||||||
case MO_32:
|
case MO_32:
|
||||||
/* If TL is 64-bit just do everything in 64-bit arithmetic. */
|
/* If TL is 64-bit just do everything in 64-bit arithmetic. */
|
||||||
|
tcg_gen_ext32u_tl(s->T0, s->T0);
|
||||||
|
tcg_gen_ext32u_tl(s->T1, s->T1);
|
||||||
tcg_gen_add_i64(s->T0, s->T0, s->T1);
|
tcg_gen_add_i64(s->T0, s->T0, s->T1);
|
||||||
tcg_gen_add_i64(s->T0, s->T0, carry_in);
|
tcg_gen_add_i64(s->T0, s->T0, carry_in);
|
||||||
tcg_gen_shri_i64(carry_out, s->T0, 32);
|
tcg_gen_shri_i64(carry_out, s->T0, 32);
|
||||||
|
|
|
@ -12,11 +12,14 @@ ifeq ($(filter %-linux-user, $(TARGET)),$(TARGET))
|
||||||
X86_64_TESTS += vsyscall
|
X86_64_TESTS += vsyscall
|
||||||
X86_64_TESTS += noexec
|
X86_64_TESTS += noexec
|
||||||
X86_64_TESTS += cmpxchg
|
X86_64_TESTS += cmpxchg
|
||||||
|
X86_64_TESTS += adox
|
||||||
TESTS=$(MULTIARCH_TESTS) $(X86_64_TESTS) test-x86_64
|
TESTS=$(MULTIARCH_TESTS) $(X86_64_TESTS) test-x86_64
|
||||||
else
|
else
|
||||||
TESTS=$(MULTIARCH_TESTS)
|
TESTS=$(MULTIARCH_TESTS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
adox: CFLAGS=-O2
|
||||||
|
|
||||||
run-test-i386-ssse3: QEMU_OPTS += -cpu max
|
run-test-i386-ssse3: QEMU_OPTS += -cpu max
|
||||||
run-plugin-test-i386-ssse3-%: QEMU_OPTS += -cpu max
|
run-plugin-test-i386-ssse3-%: QEMU_OPTS += -cpu max
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
/* See if ADOX give expected results */
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
static uint64_t adoxq(bool *c_out, uint64_t a, uint64_t b, bool c)
|
||||||
|
{
|
||||||
|
asm ("addl $0x7fffffff, %k1\n\t"
|
||||||
|
"adoxq %2, %0\n\t"
|
||||||
|
"seto %b1"
|
||||||
|
: "+r"(a), "=&r"(c) : "r"(b), "1"((int)c));
|
||||||
|
*c_out = c;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint64_t adoxl(bool *c_out, uint64_t a, uint64_t b, bool c)
|
||||||
|
{
|
||||||
|
asm ("addl $0x7fffffff, %k1\n\t"
|
||||||
|
"adoxl %k2, %k0\n\t"
|
||||||
|
"seto %b1"
|
||||||
|
: "+r"(a), "=&r"(c) : "r"(b), "1"((int)c));
|
||||||
|
*c_out = c;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
uint64_t r;
|
||||||
|
bool c;
|
||||||
|
|
||||||
|
r = adoxq(&c, 0, 0, 0);
|
||||||
|
assert(r == 0);
|
||||||
|
assert(c == 0);
|
||||||
|
|
||||||
|
r = adoxl(&c, 0, 0, 0);
|
||||||
|
assert(r == 0);
|
||||||
|
assert(c == 0);
|
||||||
|
|
||||||
|
r = adoxl(&c, 0x100000000, 0, 0);
|
||||||
|
assert(r == 0);
|
||||||
|
assert(c == 0);
|
||||||
|
|
||||||
|
r = adoxq(&c, 0, 0, 1);
|
||||||
|
assert(r == 1);
|
||||||
|
assert(c == 0);
|
||||||
|
|
||||||
|
r = adoxl(&c, 0, 0, 1);
|
||||||
|
assert(r == 1);
|
||||||
|
assert(c == 0);
|
||||||
|
|
||||||
|
r = adoxq(&c, -1, -1, 0);
|
||||||
|
assert(r == -2);
|
||||||
|
assert(c == 1);
|
||||||
|
|
||||||
|
r = adoxl(&c, -1, -1, 0);
|
||||||
|
assert(r == 0xfffffffe);
|
||||||
|
assert(c == 1);
|
||||||
|
|
||||||
|
r = adoxq(&c, -1, -1, 1);
|
||||||
|
assert(r == -1);
|
||||||
|
assert(c == 1);
|
||||||
|
|
||||||
|
r = adoxl(&c, -1, -1, 1);
|
||||||
|
assert(r == 0xffffffff);
|
||||||
|
assert(c == 1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -18,6 +18,10 @@
|
||||||
#include "qemu/tsan.h"
|
#include "qemu/tsan.h"
|
||||||
#include "qemu/bitmap.h"
|
#include "qemu/bitmap.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_PTHREAD_SET_NAME_NP
|
||||||
|
#include <pthread_np.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool name_threads;
|
static bool name_threads;
|
||||||
|
|
||||||
void qemu_thread_naming(bool enable)
|
void qemu_thread_naming(bool enable)
|
||||||
|
@ -25,7 +29,8 @@ void qemu_thread_naming(bool enable)
|
||||||
name_threads = enable;
|
name_threads = enable;
|
||||||
|
|
||||||
#if !defined CONFIG_PTHREAD_SETNAME_NP_W_TID && \
|
#if !defined CONFIG_PTHREAD_SETNAME_NP_W_TID && \
|
||||||
!defined CONFIG_PTHREAD_SETNAME_NP_WO_TID
|
!defined CONFIG_PTHREAD_SETNAME_NP_WO_TID && \
|
||||||
|
!defined CONFIG_PTHREAD_SET_NAME_NP
|
||||||
/* This is a debugging option, not fatal */
|
/* This is a debugging option, not fatal */
|
||||||
if (enable) {
|
if (enable) {
|
||||||
fprintf(stderr, "qemu: thread naming not supported on this host\n");
|
fprintf(stderr, "qemu: thread naming not supported on this host\n");
|
||||||
|
@ -480,6 +485,8 @@ static void *qemu_thread_start(void *args)
|
||||||
pthread_setname_np(pthread_self(), qemu_thread_args->name);
|
pthread_setname_np(pthread_self(), qemu_thread_args->name);
|
||||||
# elif defined(CONFIG_PTHREAD_SETNAME_NP_WO_TID)
|
# elif defined(CONFIG_PTHREAD_SETNAME_NP_WO_TID)
|
||||||
pthread_setname_np(qemu_thread_args->name);
|
pthread_setname_np(qemu_thread_args->name);
|
||||||
|
# elif defined(CONFIG_PTHREAD_SET_NAME_NP)
|
||||||
|
pthread_set_name_np(pthread_self(), qemu_thread_args->name);
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
QEMU_TSAN_ANNOTATE_THREAD_NAME(qemu_thread_args->name);
|
QEMU_TSAN_ANNOTATE_THREAD_NAME(qemu_thread_args->name);
|
||||||
|
|
Loading…
Reference in New Issue