mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 07:03:03 +02:00
powerpc/time: Fix mftb()/get_tb() for use with the compat VDSO
When we're building the compat VDSO we are building 32-bit code but in the context of a 64-bit kernel configuration. To make this work we need to be careful in some places when using ifdefs to differentiate between CONFIG_PPC64 and __powerpc64__. CONFIG_PPC64 indicates the kernel we're building is 64-bit, but it doesn't tell us that we're currently building 64-bit code - we could be building 32-bit code for the compat VDSO. On the other hand __powerpc64__ tells us that we are currently building 64-bit code (and therefore we must also be building a 64-bit kernel). In the case of get_tb() we want to use the 32-bit code sequence regardless of whether the kernel we're building for is 64-bit or 32-bit, what matters is the word size of the current object. So we need to check __powerpc64__ to decide if we use mftb() or the mftbu()/mftb() sequence. For mftb() the logic for CPU_FTR_CELL_TB_BUG only makes sense if we're building 64-bit code, so guard that with a __powerpc64__ check. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20201126131006.2431205-4-mpe@ellerman.id.au
This commit is contained in:
parent
d26b3817d9
commit
5c189c523e
|
|
@ -8,7 +8,11 @@
|
|||
|
||||
#include <asm/reg.h>
|
||||
|
||||
#if defined(CONFIG_PPC_CELL) || defined(CONFIG_E500)
|
||||
/*
|
||||
* We use __powerpc64__ here because we want the compat VDSO to use the 32-bit
|
||||
* version below in the else case of the ifdef.
|
||||
*/
|
||||
#if defined(__powerpc64__) && (defined(CONFIG_PPC_CELL) || defined(CONFIG_E500))
|
||||
#define mftb() ({unsigned long rval; \
|
||||
asm volatile( \
|
||||
"90: mfspr %0, %2;\n" \
|
||||
|
|
@ -49,7 +53,11 @@ static inline u64 get_tb(void)
|
|||
{
|
||||
unsigned int tbhi, tblo, tbhi2;
|
||||
|
||||
if (IS_ENABLED(CONFIG_PPC64))
|
||||
/*
|
||||
* We use __powerpc64__ here not CONFIG_PPC64 because we want the compat
|
||||
* VDSO to use the 32-bit compatible version in the while loop below.
|
||||
*/
|
||||
if (__is_defined(__powerpc64__))
|
||||
return mftb();
|
||||
|
||||
do {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user