From 4c1aba82cff95ab11f7fe4af8965a06703537288 Mon Sep 17 00:00:00 2001 From: Teddy Astie Date: Thu, 24 Sep 2026 13:59:49 +0200 Subject: [PATCH] x86emul: Fix AAM emulation AH output AAM is defined in APM as AH = (AL/10d) AL = (AL mod 10d) However, due to the order of operations, we're incorrectly computing it as AL = (AL mod 10d) AH = (AL/10d) = ((originalAL mod 10d)/10d) = 0 Fix it by reordering the operations to match what's defined in APM and avoid the unexpected dependency between the 2 operations. Fixes: 8993572b9c16 ("x86emul: fold/eliminate some local variables") Signed-off-by: Teddy Astie Reviewed-by: Andrew Cooper --- xen/arch/x86/x86_emulate/x86_emulate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index 89c37fea2c..f168f3ebcf 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -2511,8 +2511,8 @@ x86_emulate( else { generate_exception_if(!n, X86_EXC_DE); - _regs.al = _regs.al % n; _regs.ah = _regs.al / n; + _regs.al = _regs.al % n; } _regs.eflags &= ~(X86_EFLAGS_SF | X86_EFLAGS_ZF | X86_EFLAGS_PF); _regs.eflags |= !_regs.al ? X86_EFLAGS_ZF : 0;