[systemd-devel] [PATCH] gummiboot: Add 32 bit compatible rdtsc asm

Darren Hart dvhart at linux.intel.com
Wed Aug 21 09:31:03 PDT 2013


Gcc's inline asm constraints have different meanings on x86_64 and ia32.
Include a 32 bit version for the rdtsc function. Drop the empty 32 bit
version of time_usec as it and the cpuid function both function properly
when compiled for 32 bit systems.

Tested on the following CPU:
Intel(R) Atom(TM) CPU E640   @ 1.00GHz

A value of 1000000000 was detected.

Signed-off-by: Darren Hart <dvhart at linux.intel.com>
Cc: "Ylinen, Mikko" <mikko.ylinen at intel.com>
---
 src/efi/gummiboot.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/efi/gummiboot.c b/src/efi/gummiboot.c
index 844ce5f..9f2f31d 100644
--- a/src/efi/gummiboot.c
+++ b/src/efi/gummiboot.c
@@ -90,6 +90,13 @@ static UINT64 ticks_read(void) {
         __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
         return (d << 32) | a;
 }
+#else
+static UINT64 ticks_read(void) {
+        UINT64 val;
+        __asm__ volatile ("rdtsc" : "=A" (val));
+        return val;
+}
+#endif
 
 static void cpuid_read(UINT32 info, UINT32 *eax, UINT32 *ebx, UINT32 *ecx, UINT32 *edx) {
         *eax = info;
@@ -187,9 +194,6 @@ static UINT64 time_usec(void) {
 
         return 1000 * 1000 * ticks / cpufreq;
 }
-#else
-static UINT64 time_usec(void) { return 0; }
-#endif
 
 static EFI_STATUS efivar_set_raw(const EFI_GUID *vendor, CHAR16 *name, CHAR8 *buf, UINTN size, BOOLEAN persistent) {
         UINT32 flags;
-- 
1.8.3.1



More information about the systemd-devel mailing list