unicorn/qemu
Joseph Myers e79024e0cf target/i386: fix IEEE x87 floating-point exception raising
Most x87 instruction implementations fail to raise the expected IEEE
floating-point exceptions because they do nothing to convert the
exception state from the softfloat machinery into the exception flags
in the x87 status word. There is special-case handling of division to
raise the divide-by-zero exception, but that handling is itself buggy:
it raises the exception in inappropriate cases (inf / 0 and nan / 0,
which should not raise any exceptions, and 0 / 0, which should raise
"invalid" instead).

Fix this by converting the floating-point exceptions raised during an
operation by the softfloat machinery into exceptions in the x87 status
word (passing through the existing fpu_set_exception function for
handling related to trapping exceptions). There are special cases
where some functions convert to integer internally but exceptions from
that conversion are not always correct exceptions for the instruction
to raise.

There might be scope for some simplification if the softfloat
exception state either could always be assumed to be in sync with the
state in the status word, or could always be ignored at the start of
each instruction and just set to 0 then; I haven't looked into that in
detail, and it might run into interactions with the various ways the
emulation does not yet handle trapping exceptions properly. I think
the approach taken here, of saving the softfloat state, setting
exceptions there to 0 and then merging the old exceptions back in
after carrying out the operation, is conservatively safe

Backports commit 975af797f1e04e4d1b1a12f1731141d3770fdbce from qemu
2020-06-15 13:19:27 -04:00
..
accel tcg: Implement gvec support for rotate by vector 2020-06-14 21:43:46 -04:00
crypto
default-configs target/riscv: Initial introduction of the RISC-V target 2019-03-08 21:46:10 -05:00
docs docs/devel/memory.txt: Document _with_attrs accessors 2018-10-04 04:46:26 -04:00
fpu softfloat: Return bool from all classification predicates 2020-05-21 18:23:11 -04:00
hw Expose different 32-bit ARM CPU models to users via UC_MODE flags (#1165) 2020-01-14 09:37:21 -05:00
include softfloat: Return bool from all classification predicates 2020-05-21 18:23:11 -04:00
qapi qapi: Rewrite string-input-visitor's integer and list parsing 2018-12-18 04:57:25 -05:00
qobject qstring: Move qstring_from_substr()'s @end one to the right 2018-08-02 21:24:19 -04:00
qom cpu: Move icount_decr to CPUNegativeOffsetState 2019-06-13 15:34:28 -04:00
scripts decodetree: Multi-cleanup 2020-06-15 12:49:02 -04:00
target target/i386: fix IEEE x87 floating-point exception raising 2020-06-15 13:19:27 -04:00
tcg tcg: Improve move ops in liveness_pass_2 2020-06-14 22:13:04 -04:00
util util/cutils: Turn FIXME comment into QEMU_BUILD_BUG_ON() 2020-01-14 08:04:30 -05:00
aarch64.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
aarch64eb.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
accel.c
arm.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
armeb.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
CODING_STYLE.rst docs: split the CODING_STYLE doc into distinct groups 2019-11-28 02:54:44 -05:00
configure configure: Support -static-pie if requested 2020-04-30 07:09:34 -04:00
COPYING
COPYING.LIB
cpus.c
exec.c Memory: Enable writeback for given memory region 2020-01-14 07:44:24 -05:00
gen_all_header.sh
glib_compat.c target/arm: Add VHE system register redirection and aliasing 2020-03-21 15:57:03 -04:00
header_gen.py target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
ioport.c
LICENSE
m68k.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
Makefile Makefile: Rename targets for make recursion 2019-08-08 17:26:49 -04:00
Makefile.objs qapi: Move qapi-schema.json to qapi/, rename generated files 2018-03-09 11:35:11 -05:00
Makefile.target configure: Remove old -fno-gcse workaround for GCC 4.6.x and 4.7.[012] 2018-12-18 03:52:36 -05:00
memory.c Memory: Enable writeback for given memory region 2020-01-14 07:44:24 -05:00
memory_ldst.inc.c memory: Single byte swap along the I/O path 2020-01-07 19:12:04 -05:00
memory_mapping.c
mips.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
mips64.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
mips64el.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
mipsel.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
powerpc.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
qemu-timer.c
riscv32.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
riscv64.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
rules.mak
sparc.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
sparc64.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00
unicorn_common.h unicorn_common: Fix unicorn memory functions failing 2018-09-03 10:40:14 -04:00
VERSION Open 5.1 development tree 2020-04-30 07:30:38 -04:00
vl.c Use cpu_create(type) instead of cpu_init(cpu_model) 2018-03-20 14:20:30 -04:00
vl.h
x86_64.h target/arm: Split helper_crypto_sm3tt 2020-06-14 23:24:21 -04:00