|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH Xen 4.20] x86/apic: Fix asm() constraints in TMICT calculation
The encoded MUL is 64 bits, so writes %rdx too. At a minimum, this needs
expressing as a clobber.
Also fix a logical disconnect between 'overflow' being the carry flag not the
overflow flag. CF and OF are always the same for MUL instructions, so use the
flag which matches the variable name.
Fixes: d5c70a51bfbe ("x86/APIC: handle overflow in TMICT calculation")
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <jbeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
CC: Teddy Astie <teddy.astie@xxxxxxxxxx>
Only affects 4.20 (and earlier) where __builtin_umull_overflow() can't be
used.
I've kept this form because it produces best code generation for GCCs which
support flag outputs.
An alternative would be to capture product_hi and check the nonzero-ness, as
that's how OF/CF are produced in hardware, which would be better code
generation on very old GCCs.
---
xen/arch/x86/apic.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c
index daf597ed44b7..764ee1e98f77 100644
--- a/xen/arch/x86/apic.c
+++ b/xen/arch/x86/apic.c
@@ -1317,9 +1317,10 @@ int reprogram_timer(s_time_t timeout)
apic_tmict = UINT32_MAX;
asm ( "mul %[expire]\n\t"
- ASM_FLAG_OUT(, "setc %[cf]")
- : "=a" (product), [cf] ASM_FLAG_OUT("=@ccc", "=qm") (overflow)
- : "0" ((unsigned long)bus_scale), [expire] "r" (expire) );
+ ASM_FLAG_OUT(, "seto %[of]")
+ : "=a" (product), [of] ASM_FLAG_OUT("=@cco", "=qm") (overflow)
+ : "0" ((unsigned long)bus_scale), [expire] "r" (expire)
+ : "rdx" );
if ( !overflow &&
(product >>= BUS_SCALE_SHIFT) < apic_tmict )
apic_tmict = product;
base-commit: 5f7054258c6937b74aee411f16db5eb54ce9fda1
--
2.39.5
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |