[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 1/2] x86emul: correct EFLAGS testing for BMI1/BMI2
Apparently I blindly copied the constants from the BEXTR case, where SF indeed wants leaving out. For BLSI, BLSMSK, BLSR, and BZHI SF is defined, and hence wants checking. This is noticable in particular for BLSR, where with the input we use SF will be set in the result (and hence is being switched to be clear on input). Convert to using named constants we have available, while omitting DF, TF, as well as the MBZ bits 3 and 5 from the masking values in the checks of the produced output. For BZHI also set SF on input, expecting it to transition to clear. Fixes: 771daacd197a ("x86emul: support BMI1 insns") Fixes: 8e20924de13d ("x86emul: support BMI2 insns") Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- a/tools/tests/x86_emulator/test_x86_emulator.c +++ b/tools/tests/x86_emulator/test_x86_emulator.c @@ -1969,10 +1969,13 @@ int main(int argc, char **argv) *res = 0xfedcba98; regs.edx = (unsigned long)res; - regs.eflags = 0xac2; + regs.eflags = EFLAGS_ALWAYS_SET | X86_EFLAGS_OF | X86_EFLAGS_SF | \ + X86_EFLAGS_ZF; rc = x86_emulate(&ctxt, &emulops); if ( (rc != X86EMUL_OKAY) || regs.ecx != 8 || *res != 0xfedcba98 || - (regs.eflags & 0xf6b) != 0x203 || !check_eip(blsi) ) + (regs.eflags & (EFLAGS_MASK & ~(X86_EFLAGS_AF | X86_EFLAGS_PF))) != + (EFLAGS_ALWAYS_SET | X86_EFLAGS_CF) || + !check_eip(blsi) ) goto fail; printf("okay\n"); } @@ -1988,10 +1991,13 @@ int main(int argc, char **argv) :: "d" (NULL) ); set_insn(blsmsk); - regs.eflags = 0xac3; + regs.eflags = EFLAGS_ALWAYS_SET | X86_EFLAGS_OF | X86_EFLAGS_SF | \ + X86_EFLAGS_ZF | X86_EFLAGS_CF; rc = x86_emulate(&ctxt, &emulops); if ( (rc != X86EMUL_OKAY) || regs.ecx != 0xf || *res != 0xfedcba98 || - (regs.eflags & 0xf6b) != 0x202 || !check_eip(blsmsk) ) + (regs.eflags & (EFLAGS_MASK & ~(X86_EFLAGS_AF | X86_EFLAGS_PF))) != + EFLAGS_ALWAYS_SET || + !check_eip(blsmsk) ) goto fail; printf("okay\n"); } @@ -2007,10 +2013,13 @@ int main(int argc, char **argv) :: "d" (NULL) ); set_insn(blsr); - regs.eflags = 0xac3; + regs.eflags = EFLAGS_ALWAYS_SET | X86_EFLAGS_OF | X86_EFLAGS_ZF | \ + X86_EFLAGS_CF; rc = x86_emulate(&ctxt, &emulops); if ( (rc != X86EMUL_OKAY) || regs.ecx != 0xfedcba90 || - (regs.eflags & 0xf6b) != 0x202 || !check_eip(blsr) ) + (regs.eflags & (EFLAGS_MASK & ~(X86_EFLAGS_AF | X86_EFLAGS_PF))) != + (EFLAGS_ALWAYS_SET | X86_EFLAGS_SF) || + !check_eip(blsr) ) goto fail; printf("okay\n"); } @@ -2028,11 +2037,14 @@ int main(int argc, char **argv) regs.ecx = (unsigned long)res; regs.edx = 0xff13; - regs.eflags = 0xa43; + regs.eflags = EFLAGS_ALWAYS_SET | X86_EFLAGS_OF | X86_EFLAGS_SF | \ + X86_EFLAGS_ZF | X86_EFLAGS_CF; rc = x86_emulate(&ctxt, &emulops); if ( (rc != X86EMUL_OKAY) || regs.ebx != (*res & 0x7ffff) || regs.edx != 0xff13 || *res != 0xfedcba98 || - (regs.eflags & 0xf6b) != 0x202 || !check_eip(bzhi) ) + (regs.eflags & (EFLAGS_MASK & ~(X86_EFLAGS_AF | X86_EFLAGS_PF))) != + EFLAGS_ALWAYS_SET || + !check_eip(bzhi) ) goto fail; printf("okay\n"); }
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |