Fix RELOC_HIDE miscompilation

Message ID 20020901114242.21242@colin.muc.de
State New, archived
Headers show
Series
  • Fix RELOC_HIDE miscompilation
Related show

Commit Message

Andi Kleen Sept. 1, 2002, 9:42 a.m. UTC
[resend due to mailer problems]

RELOC_HIDE got miscompiled on gcc3.1/x86-64 in the access to softirq.c's per 
cpu variables.  This patch fixes the problem.

Clearly to hide the relocation the addition needs to be done after the 
value obfuscation, not before.

I don't know if it triggers on other architectures (x86-64 is especially 
stressf here because it has negative kernel addresses), but seems like the 
right thing to do.

Also does the arithmetic in unsigned long to avoid undue assumptions of the 
comp for pointers.

-Andi

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Patch

--- linux/include/linux/compiler.h-o	Sun Apr 14 21:18:44 2002
+++ linux/include/linux/compiler.h	Sun Sep  1 02:52:31 2002
@@ -16,7 +16,7 @@ 
 /* This macro obfuscates arithmetic on a variable address so that gcc
    shouldn't recognize the original var, and make assumptions about it */
 #define RELOC_HIDE(ptr, off)					\
-  ({ __typeof__(ptr) __ptr;					\
-    __asm__ ("" : "=g"(__ptr) : "0"((void *)(ptr) + (off)));	\
-    __ptr; })
+  ({ unsigned long __ptr;					\
+    __asm__ ("" : "=g"(__ptr) : "0"(ptr));		\
+    (typeof(ptr)) (__ptr + (off)); })
 #endif /* __LINUX_COMPILER_H */