]> granicus.if.org Git - clang/commitdiff
intrin.h: Fix up bugs in the cr3 and msr intrinsics
authorReid Kleckner <reid@kleckner.net>
Tue, 8 Apr 2014 17:49:16 +0000 (17:49 +0000)
committerReid Kleckner <reid@kleckner.net>
Tue, 8 Apr 2014 17:49:16 +0000 (17:49 +0000)
Don't include input and output regs in clobbers.  Prefix some
identifiers with __.  Add a memory constraint to __readcr3 to prevent
reordering.  This constraint is heavy handed, but conservatively
correct.

Thanks to PaX Team for the suggestions.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@205778 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Headers/Intrin.h

index e18b1a658816b6f0be6f525940f98ae8532b3261..6a63b71605ccd3a80bec20bd3b4b2f09948dadac 100644 (file)
@@ -997,23 +997,20 @@ __readmsr(unsigned long __register) {
   // undefined.
   unsigned long __edx;
   unsigned long __eax;
-  __asm__ ("rdmsr"
-          : "=d"(__edx), "=a"(__eax)
-          : "c"(__register)
-          : "%ecx", "%edx", "%eax");
+  __asm__ ("rdmsr" : "=d"(__edx), "=a"(__eax) : "c"(__register));
   return (((unsigned __int64)__edx) << 32) | (unsigned __int64)__eax;
 }
 
 static __inline__ unsigned long __attribute__((always_inline, __nodebug__))
 __readcr3(void) {
-  unsigned long value;
-  __asm__ __volatile__("mov %%cr3, %0" : "=q"(value));
-  return value;
+  unsigned long __cr3_val;
+  __asm__ __volatile__ ("mov %%cr3, %0" : "=q"(__cr3_val) : : "memory");
+  return __cr3_val;
 }
 
 static __inline__ void __attribute__((always_inline, __nodebug__))
-__writecr3(unsigned int Data) {
-  __asm__("mov %0, %%cr3" : : "q"(Data) : "memory");
+__writecr3(unsigned int __cr3_val) {
+  __asm__ ("mov %0, %%cr3" : : "q"(__cr3_val) : "memory");
 }
 
 #ifdef __cplusplus