From 5da7ea0a89a98478a4fd8879d4475238780b6588 Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 16 Sep 2008 16:28:51 +0000 Subject: [PATCH] In powerpc_get_pcpup(), make the inline assembly statement volatile so that the compiler won't perform CSE. For SMP, this may result in us accessing the wrong PCPU and as such results in a bogus curthread value. Note that getting curthread is not quite MP-safe in the sense that it requires two instructions that aren't performed atomically. The first instruction gets the address of the PCPU structure and the second instruction dereferences that pointer to get curthread. If a thread is switched-out in between these instructions and switched-in on a different CPU, we still get the wrong curthread. --- sys/powerpc/include/cpufunc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/powerpc/include/cpufunc.h b/sys/powerpc/include/cpufunc.h index caeceb3b707e..7e355621dc0e 100644 --- a/sys/powerpc/include/cpufunc.h +++ b/sys/powerpc/include/cpufunc.h @@ -158,7 +158,7 @@ powerpc_get_pcpup(void) { struct pcpu *ret; - __asm ("mfsprg %0, 0" : "=r"(ret)); + __asm __volatile("mfsprg %0, 0" : "=r"(ret)); return(ret); }