summaryrefslogtreecommitdiffstats
path: root/src/arch
diff options
context:
space:
mode:
authorPatrick Rudolph <patrick.rudolph@9elements.com>2023-09-30 15:12:17 +0200
committerFelix Held <felix-coreboot@felixheld.de>2023-10-02 14:01:59 +0000
commit699b1c4a66084049531bc59a392052b4251da1e0 (patch)
treed87d4263568e2edde85b30f473f61a26863f0af2 /src/arch
parent4c7e97b26a3492c5799edcfb3c3740870a6debf1 (diff)
downloadcoreboot-699b1c4a66084049531bc59a392052b4251da1e0.tar.gz
coreboot-699b1c4a66084049531bc59a392052b4251da1e0.tar.bz2
coreboot-699b1c4a66084049531bc59a392052b4251da1e0.zip
x86/include/arch/cpuid.h: Fix inline assembly
In the cpuid helper functions eax is always written to by the cpuid instruction, so add it to the output clobbered list. This prevents GCC from generating code with undefined behaviour when the function is inlined. Test: Verified that the generated assembly is sane and runtime tests showed no "strange" behaviour when calling cpuid functions. Change-Id: I5dc0bb620184a355716b9c8d4206d55554b41ab9 Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/78192 Reviewed-by: Felix Held <felix-coreboot@felixheld.de> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Krystian Hebel <krystian.hebel@3mdeb.com> Reviewed-by: Paul Menzel <paulepanter@mailbox.org>
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/include/arch/cpuid.h21
1 files changed, 9 insertions, 12 deletions
diff --git a/src/arch/x86/include/arch/cpuid.h b/src/arch/x86/include/arch/cpuid.h
index 70a5beb9b9b8..b2780bec472c 100644
--- a/src/arch/x86/include/arch/cpuid.h
+++ b/src/arch/x86/include/arch/cpuid.h
@@ -56,39 +56,36 @@ static inline uint32_t cpuid_eax(uint32_t eax)
return eax;
}
-static inline uint32_t cpuid_ebx(const uint32_t eax)
+static inline uint32_t cpuid_ebx(uint32_t eax)
{
uint32_t ebx;
asm volatile(
"cpuid;"
- : "=b" (ebx)
- : "a" (eax)
- : "ecx", "edx");
+ : "=b" (ebx), "+a" (eax)
+ :: "ecx", "edx");
return ebx;
}
-static inline uint32_t cpuid_ecx(const uint32_t eax)
+static inline uint32_t cpuid_ecx(uint32_t eax)
{
uint32_t ecx;
asm volatile(
"cpuid;"
- : "=c" (ecx)
- : "a" (eax)
- : "ebx", "edx");
+ : "=c" (ecx), "+a" (eax)
+ :: "ebx", "edx");
return ecx;
}
-static inline uint32_t cpuid_edx(const uint32_t eax)
+static inline uint32_t cpuid_edx(uint32_t eax)
{
uint32_t edx;
asm volatile(
"cpuid;"
- : "=d" (edx)
- : "a" (eax)
- : "ebx", "ecx");
+ : "=d" (edx), "+a" (eax)
+ :: "ebx", "ecx");
return edx;
}