RE: [PATCH net] net: fman: Use physical address for userspace interfaces

From: Madalin Bucur
Date: Tue Oct 18 2022 - 02:46:05 EST


> -----Original Message-----
> From: Sean Anderson <sean.anderson@xxxxxxxx>
> Sent: 17 October 2022 19:28
> To: David S . Miller <davem@xxxxxxxxxxxxx>; netdev@xxxxxxxxxxxxxxx
> Cc: linux-kernel@xxxxxxxxxxxxxxx; Madalin Bucur <madalin.bucur@xxxxxxx>;
> Jakub Kicinski <kuba@xxxxxxxxxx>; Eric Dumazet <edumazet@xxxxxxxxxx>;
> Paolo Abeni <pabeni@xxxxxxxxxx>; Camelia Alexandra Groza
> <camelia.groza@xxxxxxx>; Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>; Sean
> Anderson <sean.anderson@xxxxxxxx>
> Subject: [PATCH net] net: fman: Use physical address for userspace
> interfaces
>
> For whatever reason, the address of the MAC is exposed to userspace in
> several places. We need to use the physical address for this purpose to
> avoid leaking information about the kernel's memory layout, and to keep
> backwards compatibility.
>
> Fixes: 262f2b782e25 ("net: fman: Map the base address once")
> Reported-by: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
> Signed-off-by: Sean Anderson <sean.anderson@xxxxxxxx>
> ---
>
> drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 4 ++--
> drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c | 2 +-
> drivers/net/ethernet/freescale/fman/mac.c | 12 ++++++------
> drivers/net/ethernet/freescale/fman/mac.h | 2 +-
> 4 files changed, 10 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
> b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
> index 31cfa121333d..fc68a32ce2f7 100644
> --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
> +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
> @@ -221,8 +221,8 @@ static int dpaa_netdev_init(struct net_device *net_dev,
> net_dev->netdev_ops = dpaa_ops;
> mac_addr = mac_dev->addr;
>
> - net_dev->mem_start = (unsigned long)mac_dev->vaddr;
> - net_dev->mem_end = (unsigned long)mac_dev->vaddr_end;
> + net_dev->mem_start = (unsigned long)priv->mac_dev->res->start;
> + net_dev->mem_end = (unsigned long)priv->mac_dev->res->end;
>
> net_dev->min_mtu = ETH_MIN_MTU;
> net_dev->max_mtu = dpaa_get_max_mtu();
> diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c
> b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c
> index 258eb6c8f4c0..4fee74c024bd 100644
> --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c
> +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c
> @@ -18,7 +18,7 @@ static ssize_t dpaa_eth_show_addr(struct device *dev,
>
> if (mac_dev)
> return sprintf(buf, "%llx",
> - (unsigned long long)mac_dev->vaddr);
> + (unsigned long long)mac_dev->res->start);
> else
> return sprintf(buf, "none");
> }
> diff --git a/drivers/net/ethernet/freescale/fman/mac.c
> b/drivers/net/ethernet/freescale/fman/mac.c
> index 7b7526fd7da3..65df308bad97 100644
> --- a/drivers/net/ethernet/freescale/fman/mac.c
> +++ b/drivers/net/ethernet/freescale/fman/mac.c
> @@ -279,7 +279,6 @@ static int mac_probe(struct platform_device *_of_dev)
> struct device_node *mac_node, *dev_node;
> struct mac_device *mac_dev;
> struct platform_device *of_dev;
> - struct resource *res;
> struct mac_priv_s *priv;
> struct fman_mac_params params;
> u32 val;
> @@ -338,24 +337,25 @@ static int mac_probe(struct platform_device *_of_dev)
> of_node_put(dev_node);
>
> /* Get the address of the memory mapped registers */
> - res = platform_get_mem_or_io(_of_dev, 0);
> - if (!res) {
> + mac_dev->res = platform_get_mem_or_io(_of_dev, 0);
> + if (!mac_dev->res) {
> dev_err(dev, "could not get registers\n");
> return -EINVAL;
> }
>
> - err = devm_request_resource(dev, fman_get_mem_region(priv->fman),
> res);
> + err = devm_request_resource(dev, fman_get_mem_region(priv->fman),
> + mac_dev->res);
> if (err) {
> dev_err_probe(dev, err, "could not request resource\n");
> return err;
> }
>
> - mac_dev->vaddr = devm_ioremap(dev, res->start, resource_size(res));
> + mac_dev->vaddr = devm_ioremap(dev, mac_dev->res->start,
> + resource_size(mac_dev->res));
> if (!mac_dev->vaddr) {
> dev_err(dev, "devm_ioremap() failed\n");
> return -EIO;
> }
> - mac_dev->vaddr_end = mac_dev->vaddr + resource_size(res);
>
> if (!of_device_is_available(mac_node))
> return -ENODEV;
> diff --git a/drivers/net/ethernet/freescale/fman/mac.h
> b/drivers/net/ethernet/freescale/fman/mac.h
> index b95d384271bd..13b69ca5f00c 100644
> --- a/drivers/net/ethernet/freescale/fman/mac.h
> +++ b/drivers/net/ethernet/freescale/fman/mac.h
> @@ -20,8 +20,8 @@ struct mac_priv_s;
>
> struct mac_device {
> void __iomem *vaddr;
> - void __iomem *vaddr_end;
> struct device *dev;
> + struct resource *res;
> u8 addr[ETH_ALEN];
> struct fman_port *port[2];
> u32 if_support;
> --
> 2.35.1.1320.gc452695387.dirty

Thanks for the fix,

Acked-by: Madalin Bucur <madalin.bucur@xxxxxxxxxxx>