lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Thu, 20 Jun 2019 17:40:04 +0000
From:   Paul Burton <paul.burton@...s.com>
To:     Serge Semin <fancer.lancer@...il.com>,
        "Maciej W. Rozycki" <macro@...ux-mips.org>
CC:     Ralf Baechle <ralf@...ux-mips.org>,
        James Hogan <jhogan@...nel.org>,
        Serge Semin <Sergey.Semin@...latforms.ru>,
        Arnd Bergmann <arnd@...db.de>,
        "Vadim V . Vlasov" <vadim.vlasov@...latforms.ru>,
        "linux-mips@...r.kernel.org" <linux-mips@...r.kernel.org>,
        "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH] mips: Remove q-accessors from non-64bit platforms

Hi Serge,

On Fri, Jun 14, 2019 at 09:33:42AM +0300, Serge Semin wrote:
> There are some generic drivers in the kernel, which make use of the
> q-accessors or their derivatives. While at current asm/io.h the accessors
> are defined, their implementation is only applicable either for 64bit
> systems, or for systems with cpu_has_64bits flag set. Obviously there
> are MIPS systems which are neither of these, but still need to have
> those drivers supported. In this case the solution is to define some
> generic versions of the q-accessors, but with a limitation to be
> non-atomic. Such accessors are defined in the
> io-64-nonatomic-{hi-lo,lo-hi}.h file. The drivers which utilize the
> q-suffixed IO-methods are supposed to include the header file, so
> in case if these accessors aren't defined for the platform, the generic
> non-atomic versions are utilized. Currently the MIPS-specific asm/io.h
> file provides the q-accessors for any MIPS system even for ones, which
> in fact don't support them and raise BUG() in case if any of them is
> called. Due to this the generic versions of the accessors are never
> used while an attempt to call the IO-methods causes the kernel BUG().
> In order to fix this we need to define the q-accessors only for
> the MIPS systems, which actually support them, and don't define them
> otherwise, so to let the corresponding drivers to use the non-atomic
> q-suffixed accessors.
> 
> Signed-off-by: Serge Semin <fancer.lancer@...il.com>
> Suggested-by: Arnd Bergmann <arnd@...db.de>
> Cc: Vadim V. Vlasov <vadim.vlasov@...latforms.ru>
> ---
>  arch/mips/include/asm/io.h | 11 +++++++++++
>  1 file changed, 11 insertions(+)

So this seems pretty reasonable. Build testing all our defconfigs only
showed up one issue for decstation_defconfig & decstation_r4k_defconfig:

  drivers/net/fddi/defza.c: In function 'fza_reads':
  drivers/net/fddi/defza.c:88:17: error: implicit declaration of
    function 'readq_relaxed'; did you mean 'readw_relaxed'?
    [-Werror=implicit-function-declaration]
   #define readq_u readq_relaxed
                   ^~~~~~~~~~~~~
  drivers/net/fddi/defza.c:126:13: note: in expansion of macro 'readq_u'
      *dst++ = readq_u(src++);
               ^~~~~~~
  drivers/net/fddi/defza.c: In function 'fza_writes':
  drivers/net/fddi/defza.c:92:18: error: implicit declaration of
    function 'writeq_relaxed'; did you mean 'writel_relaxed'?
    [-Werror=implicit-function-declaration]
   #define writeq_u writeq_relaxed
                    ^~~~~~~~~~~~~~
  drivers/net/fddi/defza.c:151:4: note: in expansion of macro 'writeq_u'
      writeq_u(*src++, dst++);
      ^~~~~~~~
    CC      net/core/scm.o
  cc1: some warnings being treated as errors
  make[4]: *** [scripts/Makefile.build:279: drivers/net/fddi/defza.o] Error 1

These uses of readq_relaxed & writeq_relaxed are both conditional upon
sizeof(unsigned long) == 8, ie. upon CONFIG_64BIT=y so they're not going
to present a runtime issue but we need to provide some implementation of
the *q accessors to keep the compiler happy.

I see a few options:

1) We could just have defza.c include <io-64-nonatomic-lo-hi.h> to get
   the appropriate declarations, which should then get optimized away by
   the compiler anyway & never actually be used.

2) We could have defza.h #define its readq_u & writeq_u macros
   differently for CONFIG_32BIT=y kernels, perhaps using
   __compiletime_error to catch any bogus use of them.

3) We could do the same in a generic header, though if nobody else has
   needed it so far & this is the only place we need it then maybe it's
   not worth it.

So I'm thinking option 2 might be best, as below. Having said that I
don't mind option 1 either - it's simple. Maciej do you have any
preference?

Thanks,
    Paul

---
diff --git a/drivers/net/fddi/defza.c b/drivers/net/fddi/defza.c
index c5cae8e74dc4..85d6a7f22fe7 100644
--- a/drivers/net/fddi/defza.c
+++ b/drivers/net/fddi/defza.c
@@ -85,11 +85,21 @@ static u8 hw_addr_beacon[8] = { 0x01, 0x80, 0xc2, 0x00, 0x01, 0x00 };
  */
 #define readw_u readw_relaxed
 #define readl_u readl_relaxed
-#define readq_u readq_relaxed
 
 #define writew_u writew_relaxed
 #define writel_u writel_relaxed
-#define writeq_u writeq_relaxed
+
+#ifdef CONFIG_32BIT
+extern u64 defza_readq_u(const void *ptr)
+	__compiletime_error("readq_u should not be used by 32b kernels");
+extern void defza_writeq_u(u64 val, void *ptr)
+	__compiletime_error("writeq_u should not be used by 32b kernels");
+# define readq_u defza_readq_u
+# define writeq_u defza_writeq_u
+#else
+# define readq_u readq_relaxed
+# define writeq_u writeq_relaxed
+#endif
 
 static inline struct sk_buff *fza_alloc_skb_irq(struct net_device *dev,
 						unsigned int length)

Powered by blists - more mailing lists