summaryrefslogtreecommitdiffstats
path: root/drivers/soc/ux500/ux500-soc-id.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2022-11-08 13:37:55 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-01-07 12:07:36 +0100
commit4be6501204c604a3b7a9aeeb96531fb3ab3beb29 (patch)
tree0b23f4c025abcd08da54dfaa2be9bb746612a42d /drivers/soc/ux500/ux500-soc-id.c
parent2d308bd0ba32942aead0b67474e40b89a23150cf (diff)
downloadlinux-stable-4be6501204c604a3b7a9aeeb96531fb3ab3beb29.tar.gz
linux-stable-4be6501204c604a3b7a9aeeb96531fb3ab3beb29.tar.bz2
linux-stable-4be6501204c604a3b7a9aeeb96531fb3ab3beb29.zip
ARM: ux500: do not directly dereference __iomem
commit 65b0e307a1a9193571db12910f382f84195a3d29 upstream. Sparse reports that calling add_device_randomness() on `uid` is a violation of address spaces. And indeed the next usage uses readl() properly, but that was left out when passing it toadd_device_ randomness(). So instead copy the whole thing to the stack first. Fixes: 4040d10a3d44 ("ARM: ux500: add DB serial number to entropy pool") Cc: Linus Walleij <linus.walleij@linaro.org> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/all/202210230819.loF90KDh-lkp@intel.com/ Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Link: https://lore.kernel.org/r/20221108123755.207438-1-Jason@zx2c4.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/soc/ux500/ux500-soc-id.c')
-rw-r--r--drivers/soc/ux500/ux500-soc-id.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/soc/ux500/ux500-soc-id.c b/drivers/soc/ux500/ux500-soc-id.c
index 6c1be74e5fcc..86a1a3c408df 100644
--- a/drivers/soc/ux500/ux500-soc-id.c
+++ b/drivers/soc/ux500/ux500-soc-id.c
@@ -159,20 +159,18 @@ static ssize_t ux500_get_process(struct device *dev,
static const char *db8500_read_soc_id(struct device_node *backupram)
{
void __iomem *base;
- void __iomem *uid;
const char *retstr;
+ u32 uid[5];
base = of_iomap(backupram, 0);
if (!base)
return NULL;
- uid = base + 0x1fc0;
+ memcpy_fromio(uid, base + 0x1fc0, sizeof(uid));
/* Throw these device-specific numbers into the entropy pool */
- add_device_randomness(uid, 0x14);
+ add_device_randomness(uid, sizeof(uid));
retstr = kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x",
- readl((u32 *)uid+0),
- readl((u32 *)uid+1), readl((u32 *)uid+2),
- readl((u32 *)uid+3), readl((u32 *)uid+4));
+ uid[0], uid[1], uid[2], uid[3], uid[4]);
iounmap(base);
return retstr;
}