void-packages/srcpkgs/libgcrypt/patches/hwf-x86-fix-wrong-operand-type.patch
2021-04-30 12:53:41 -03:00

46 lines
1.7 KiB
Diff

From ec87511d9cd2dc31434e939b6351d74a38d4ceaa Mon Sep 17 00:00:00 2001
From: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Date: Wed, 28 Apr 2021 19:19:15 +0300
Subject: [PATCH] hwf-x86: fix use of wrong operand type
* src/hwf-x86.c (get_cpuid): Use xchg for swapping %ebx back
and forth between operand register.
--
HW feature routine was giving wrong results with certain compiler &
compiler flag combinations on i386. Issue was that "=g" operand was
used which caused problem if compiler allocated %ebx register for
this operand. CPUID assembly block attempts to save %ebx as in older
GCC versions this register was fixed for GOT pointer use and could
not be modified otherwise (could not be used as operand or clobber).
Reported-by: Iru Cai <vimacs@disroot.org>
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
---
src/hwf-x86.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/src/hwf-x86.c b/src/hwf-x86.c
index 91e4c411e..a1aa02e78 100644
--- a/src/hwf-x86.c
+++ b/src/hwf-x86.c
@@ -83,14 +83,12 @@ get_cpuid(unsigned int in, unsigned int *eax, unsigned int *ebx,
unsigned int regs[4];
asm volatile
- ("movl %%ebx, %%edi\n\t" /* Save GOT register. */
- "xorl %%ebx, %%ebx\n\t"
+ ("xchgl %%ebx, %1\n\t" /* Save GOT register. */
"cpuid\n\t"
- "movl %%ebx, %1\n\t"
- "movl %%edi, %%ebx\n\t" /* Restore GOT register. */
- : "=a" (regs[0]), "=g" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
- : "0" (in), "2" (0), "3" (0)
- : "cc", "edi"
+ "xchgl %%ebx, %1\n\t" /* Restore GOT register. */
+ : "=a" (regs[0]), "=D" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
+ : "0" (in), "1" (0), "2" (0), "3" (0)
+ : "cc"
);
if (eax)