e7bbb7cb71
ALU instructions can write to both memory and flags. If the CC_SRC* and CC_DST locations have been written already when a memory access causes a fault, the value in CC_SRC* and CC_DST might be interpreted with the wrong CC_OP (the one that is in effect before the instruction. Besides just using the wrong result for the flags, something like subtracting -1 can have disastrous effects if the current CC_OP is CC_OP_EFLAGS: this is because QEMU does not expect bits outside the ALU flags to be set in CC_SRC, and env->eflags can end up set to all-ones. In the case of the attached testcase, this sets IOPL to 3 and would cause an assertion failure if SUB is moved to the new decoder. This mechanism is not really needed for BMI instructions, which can only write to a register, but put it to use anyway for cleanliness. In the case of BZHI, the code has to be modified slightly to ensure that decode->cc_src is written, otherwise the new assertions trigger. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
||
---|---|---|
.. | ||
system | ||
float_convd.conf | ||
float_convs.ref | ||
hello-i386.c | ||
Makefile.softmmu-target | ||
Makefile.target | ||
README | ||
test-3dnow.c | ||
test-aes.c | ||
test-avx.c | ||
test-avx.py | ||
test-flags.c | ||
test-i386-adcox.c | ||
test-i386-bmi2.c | ||
test-i386-code16.S | ||
test-i386-f2xm1.c | ||
test-i386-fbstp.c | ||
test-i386-fisttp.c | ||
test-i386-fldcst.c | ||
test-i386-fp-exceptions.c | ||
test-i386-fpatan.c | ||
test-i386-fprem.c | ||
test-i386-fscale.c | ||
test-i386-fxam.c | ||
test-i386-fxtract.c | ||
test-i386-fyl2x.c | ||
test-i386-fyl2xp1.c | ||
test-i386-muldiv.h | ||
test-i386-pcmpistri.c | ||
test-i386-pseudo-denormal.c | ||
test-i386-shift.h | ||
test-i386-snan-convert.c | ||
test-i386-sse-exceptions.c | ||
test-i386-ssse3.c | ||
test-i386-vm86.S | ||
test-i386.c | ||
test-i386.h | ||
test-mmx.c | ||
test-mmx.py | ||
x86.csv |
These are i386 specific guest programs test-i386 --------- This program executes most of the 16 bit and 32 bit x86 instructions and generates a text output, for comparison with the output obtained with a real CPU or another emulator. The Linux system call modify_ldt() is used to create x86 selectors to test some 16 bit addressing and 32 bit with segmentation cases. The Linux system call vm86() is used to test vm86 emulation. Various exceptions are raised to test most of the x86 user space exception reporting. test-avx -------- This program executes most SSE/AVX instructions and generates a text output, for comparison with the output obtained with a real CPU or another emulator. test-avx.h is generate from x86.csv by test-avx.py x86.csv comes from https://github.com/quasilyte/avx512test linux-test ---------- This program tests various Linux system calls. It is used to verify that the system call parameters are correctly converted between target and host CPUs. test-i386-fprem --------------- test-mmap --------- sha1 ---- hello-i386 ----------