[3/8] powerpc: fix vdso32 for ppc64le

Message ID 20191108203435.112759-4-arnd@arndb.de
State New
Headers show
Series
  • Untitled series #24835
Related show

Commit Message

Arnd Bergmann Nov. 8, 2019, 8:34 p.m.
On little-endian 32-bit application running on 64-bit kernels,
the current vdso would read the wrong half of the xtime seconds
field. Change it to return the lower half like it does on
big-endian.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
 arch/powerpc/kernel/vdso32/gettimeofday.S | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

-- 
2.20.0

Comments

Ben Hutchings Nov. 20, 2019, 7:13 p.m. | #1
On Fri, 2019-11-08 at 21:34 +0100, Arnd Bergmann wrote:
> On little-endian 32-bit application running on 64-bit kernels,

> the current vdso would read the wrong half of the xtime seconds

> field. Change it to return the lower half like it does on

> big-endian.


ppc64le doesn't have 32-bit compat so this is only theoretical.

Ben.

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> ---

>  arch/powerpc/kernel/vdso32/gettimeofday.S | 2 +-

>  1 file changed, 1 insertion(+), 1 deletion(-)

> 

> diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S

> index becd9f8767ed..4327665ad86f 100644

> --- a/arch/powerpc/kernel/vdso32/gettimeofday.S

> +++ b/arch/powerpc/kernel/vdso32/gettimeofday.S

> @@ -13,7 +13,7 @@

>  #include <asm/unistd.h>

>  

>  /* Offset for the low 32-bit part of a field of long type */

> -#ifdef CONFIG_PPC64

> +#if defined(CONFIG_PPC64) && defined(CONFIG_CPU_BIG_ENDIAN)

>  #define LOPART	4

>  #define TSPEC_TV_SEC	TSPC64_TV_SEC+LOPART

>  #else

-- 
Ben Hutchings, Software Developer                         Codethink Ltd
https://www.codethink.co.uk/                 Dale House, 35 Dale Street
                                     Manchester, M1 2HF, United Kingdom
Arnd Bergmann Nov. 20, 2019, 7:35 p.m. | #2
On Wed, Nov 20, 2019 at 8:13 PM Ben Hutchings
<ben.hutchings@codethink.co.uk> wrote:
>

> On Fri, 2019-11-08 at 21:34 +0100, Arnd Bergmann wrote:

> > On little-endian 32-bit application running on 64-bit kernels,

> > the current vdso would read the wrong half of the xtime seconds

> > field. Change it to return the lower half like it does on

> > big-endian.

>

> ppc64le doesn't have 32-bit compat so this is only theoretical.


That is probably true. I only looked at the kernel, which today still
supports compat mode for ppc64le, but I saw the patches to disable
it, and I don't think anyone has even attempted building user space
for it.

       Arnd
Ben Hutchings Nov. 20, 2019, 9:49 p.m. | #3
On Wed, 2019-11-20 at 20:35 +0100, Arnd Bergmann wrote:
> On Wed, Nov 20, 2019 at 8:13 PM Ben Hutchings

> <ben.hutchings@codethink.co.uk> wrote:

> > On Fri, 2019-11-08 at 21:34 +0100, Arnd Bergmann wrote:

> > > On little-endian 32-bit application running on 64-bit kernels,

> > > the current vdso would read the wrong half of the xtime seconds

> > > field. Change it to return the lower half like it does on

> > > big-endian.

> > 

> > ppc64le doesn't have 32-bit compat so this is only theoretical.

> 

> That is probably true. I only looked at the kernel, which today still

> supports compat mode for ppc64le, but I saw the patches to disable

> it, and I don't think anyone has even attempted building user space

> for it.


COMPAT is still enabled for some reason, but VDSO32 isn't (since 4.2).

Ben.

-- 
Ben Hutchings, Software Developer                         Codethink Ltd
https://www.codethink.co.uk/                 Dale House, 35 Dale Street
                                     Manchester, M1 2HF, United Kingdom
Arnd Bergmann Nov. 21, 2019, 10:02 a.m. | #4
On Wed, Nov 20, 2019 at 10:49 PM Ben Hutchings
<ben.hutchings@codethink.co.uk> wrote:
> On Wed, 2019-11-20 at 20:35 +0100, Arnd Bergmann wrote:

> > On Wed, Nov 20, 2019 at 8:13 PM Ben Hutchings

> > <ben.hutchings@codethink.co.uk> wrote:

> > > On Fri, 2019-11-08 at 21:34 +0100, Arnd Bergmann wrote:

> > > > On little-endian 32-bit application running on 64-bit kernels,

> > > > the current vdso would read the wrong half of the xtime seconds

> > > > field. Change it to return the lower half like it does on

> > > > big-endian.

> > >

> > > ppc64le doesn't have 32-bit compat so this is only theoretical.

> >

> > That is probably true. I only looked at the kernel, which today still

> > supports compat mode for ppc64le, but I saw the patches to disable

> > it, and I don't think anyone has even attempted building user space

> > for it.

>

> COMPAT is still enabled for some reason, but VDSO32 isn't (since 4.2).


Ok, I had missed that detail. Should I just drop my patch then?

      Arnd
Ben Hutchings Nov. 21, 2019, 3:56 p.m. | #5
On Thu, 2019-11-21 at 11:02 +0100, Arnd Bergmann wrote:
> On Wed, Nov 20, 2019 at 10:49 PM Ben Hutchings

> <ben.hutchings@codethink.co.uk> wrote:

> > On Wed, 2019-11-20 at 20:35 +0100, Arnd Bergmann wrote:

> > > On Wed, Nov 20, 2019 at 8:13 PM Ben Hutchings

> > > <ben.hutchings@codethink.co.uk> wrote:

> > > > On Fri, 2019-11-08 at 21:34 +0100, Arnd Bergmann wrote:

> > > > > On little-endian 32-bit application running on 64-bit kernels,

> > > > > the current vdso would read the wrong half of the xtime seconds

> > > > > field. Change it to return the lower half like it does on

> > > > > big-endian.

> > > > 

> > > > ppc64le doesn't have 32-bit compat so this is only theoretical.

> > > 

> > > That is probably true. I only looked at the kernel, which today still

> > > supports compat mode for ppc64le, but I saw the patches to disable

> > > it, and I don't think anyone has even attempted building user space

> > > for it.

> > 

> > COMPAT is still enabled for some reason, but VDSO32 isn't (since 4.2).

> 

> Ok, I had missed that detail. Should I just drop my patch then?


I think so.

Ben.

-- 
Ben Hutchings, Software Developer                         Codethink Ltd
https://www.codethink.co.uk/                 Dale House, 35 Dale Street
                                     Manchester, M1 2HF, United Kingdom

Patch

diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S
index becd9f8767ed..4327665ad86f 100644
--- a/arch/powerpc/kernel/vdso32/gettimeofday.S
+++ b/arch/powerpc/kernel/vdso32/gettimeofday.S
@@ -13,7 +13,7 @@ 
 #include <asm/unistd.h>
 
 /* Offset for the low 32-bit part of a field of long type */
-#ifdef CONFIG_PPC64
+#if defined(CONFIG_PPC64) && defined(CONFIG_CPU_BIG_ENDIAN)
 #define LOPART	4
 #define TSPEC_TV_SEC	TSPC64_TV_SEC+LOPART
 #else