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  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <20150727.142521.968868804720368489.davem@davemloft.net>
Date:	Mon, 27 Jul 2015 14:25:21 -0700 (PDT)
From:	David Miller <davem@...emloft.net>
To:	andriy.shevchenko@...ux.intel.com
Cc:	nicolas.ferre@...el.com, kbuild-all@...org, netdev@...r.kernel.org
Subject: Re: [net:master 41/49] drivers/net/ethernet/cadence/macb.c:164:1:
 error: macro "writel" passed 3 arguments, but takes just 2

From: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
Date: Mon, 27 Jul 2015 14:07:53 +0300

> I do use compiler from Debian for AVR32, didn't check this on other
> architectures.
> 
> Possible something like following will fix it:

That isn't going to fix it.  You misunderstand the nature of the problem
I think, the issue looks like this:

====================
#define readl(x, y)		((x) + (y))

struct foo {
	int (*readl)(int x, int y, int z);
};

int test(struct foo *p)
{
	p->readl(1, 2, 3);
}
====================

Archs typically define readl as a macro, so when you do things like
p->readl() CPP tries to expand the macro when it sees the "readl("
part, and that's the fundamental issue.

We have to rename the method names so that the macro expansion does't
interfere.

Here is the fix I am committing to fix this:

====================
[PATCH] macb: Fix build with macro'ized readl/writel.

If an architecture defines readl/writel using CPP macros, we
get the following kinds of build failure:

> > > drivers/net/ethernet/cadence/macb.c:164:1: error: macro "writel"
> > > passed 3 arguments, but takes just 2
>      macb_or_gem_writel(bp, SA1B, bottom);
>     ^

Rename the methods so that this doesn't happen.

Signed-off-by: David S. Miller <davem@...emloft.net>
---
 drivers/net/ethernet/cadence/macb.c | 14 +++++++-------
 drivers/net/ethernet/cadence/macb.h | 16 ++++++++--------
 2 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c
index c638757..bf9eb2e 100644
--- a/drivers/net/ethernet/cadence/macb.c
+++ b/drivers/net/ethernet/cadence/macb.c
@@ -506,7 +506,7 @@ static void macb_update_stats(struct macb *bp)
 	WARN_ON((unsigned long)(end - p - 1) != (MACB_TPF - MACB_PFR) / 4);
 
 	for(; p < end; p++, offset += 4)
-		*p += bp->readl(bp, offset);
+		*p += bp->macb_reg_readl(bp, offset);
 }
 
 static int macb_halt_tx(struct macb *bp)
@@ -1934,14 +1934,14 @@ static void gem_update_stats(struct macb *bp)
 
 	for (i = 0; i < GEM_STATS_LEN; ++i, ++p) {
 		u32 offset = gem_statistics[i].offset;
-		u64 val = bp->readl(bp, offset);
+		u64 val = bp->macb_reg_readl(bp, offset);
 
 		bp->ethtool_stats[i] += val;
 		*p += val;
 
 		if (offset == GEM_OCTTXL || offset == GEM_OCTRXL) {
 			/* Add GEM_OCTTXH, GEM_OCTRXH */
-			val = bp->readl(bp, offset + 4);
+			val = bp->macb_reg_readl(bp, offset + 4);
 			bp->ethtool_stats[i] += ((u64)val) << 32;
 			*(++p) += val;
 		}
@@ -2867,11 +2867,11 @@ static int macb_probe(struct platform_device *pdev)
 	bp->regs = mem;
 	bp->native_io = native_io;
 	if (native_io) {
-		bp->readl = hw_readl_native;
-		bp->writel = hw_writel_native;
+		bp->macb_reg_readl = hw_readl_native;
+		bp->macb_reg_writel = hw_writel_native;
 	} else {
-		bp->readl = hw_readl;
-		bp->writel = hw_writel;
+		bp->macb_reg_readl = hw_readl;
+		bp->macb_reg_writel = hw_writel;
 	}
 	bp->num_queues = num_queues;
 	bp->queue_mask = queue_mask;
diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cadence/macb.h
index 2aa102e..1895b6b 100644
--- a/drivers/net/ethernet/cadence/macb.h
+++ b/drivers/net/ethernet/cadence/macb.h
@@ -429,12 +429,12 @@
 	 | GEM_BF(name, value))
 
 /* Register access macros */
-#define macb_readl(port, reg)		(port)->readl((port), MACB_##reg)
-#define macb_writel(port, reg, value)	(port)->writel((port), MACB_##reg, (value))
-#define gem_readl(port, reg)		(port)->readl((port), GEM_##reg)
-#define gem_writel(port, reg, value)	(port)->writel((port), GEM_##reg, (value))
-#define queue_readl(queue, reg)		(queue)->bp->readl((queue)->bp, (queue)->reg)
-#define queue_writel(queue, reg, value)	(queue)->bp->writel((queue)->bp, (queue)->reg, (value))
+#define macb_readl(port, reg)		(port)->macb_reg_readl((port), MACB_##reg)
+#define macb_writel(port, reg, value)	(port)->macb_reg_writel((port), MACB_##reg, (value))
+#define gem_readl(port, reg)		(port)->macb_reg_readl((port), GEM_##reg)
+#define gem_writel(port, reg, value)	(port)->macb_reg_writel((port), GEM_##reg, (value))
+#define queue_readl(queue, reg)		(queue)->bp->macb_reg_readl((queue)->bp, (queue)->reg)
+#define queue_writel(queue, reg, value)	(queue)->bp->macb_reg_writel((queue)->bp, (queue)->reg, (value))
 
 /* Conditional GEM/MACB macros.  These perform the operation to the correct
  * register dependent on whether the device is a GEM or a MACB.  For registers
@@ -782,8 +782,8 @@ struct macb {
 	bool			native_io;
 
 	/* hardware IO accessors */
-	u32	(*readl)(struct macb *bp, int offset);
-	void	(*writel)(struct macb *bp, int offset, u32 value);
+	u32	(*macb_reg_readl)(struct macb *bp, int offset);
+	void	(*macb_reg_writel)(struct macb *bp, int offset, u32 value);
 
 	unsigned int		rx_tail;
 	unsigned int		rx_prepared_head;
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ