]> xenbits.xensource.com Git - xen.git/commitdiff
x86/HVM: correct partial HPET_STATUS write emulation
authorJan Beulich <jbeulich@suse.com>
Tue, 24 Sep 2024 12:57:21 +0000 (14:57 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 24 Sep 2024 12:57:21 +0000 (14:57 +0200)
For partial writes the non-written parts of registers are folded into
the full 64-bit value from what they're presently set to. That's wrong
to do though when the behavior is write-1-to-clear: Writes not
including to low 3 bits would unconditionally clear all ISR bits which
are presently set. Re-calculate the value to use.

Fixes: be07023be115 ("x86/vhpet: add support for level triggered interrupts")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: 41d358d2f9607ba37c216effa39b9f1bc58de69d
master date: 2024-08-29 10:02:20 +0200

xen/arch/x86/hvm/hpet.c

index 80f323316c6c9d7959545812dacd7d6425586f69..21b30d29003a0454d65e390ab734cfb1b06e18bc 100644 (file)
@@ -405,7 +405,8 @@ static int cf_check hpet_write(
         break;
 
     case HPET_STATUS:
-        /* write 1 to clear. */
+        /* Write 1 to clear. Therefore don't use new_val directly here. */
+        new_val = val << ((addr & 7) * 8);
         while ( new_val )
         {
             bool active;