summaryrefslogtreecommitdiff
path: root/drivers/soc
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-02-15 06:11:24 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-02-15 06:11:23 -0800
commitafc7d9b398d623f777e85a2b6fd61b31a5214617 (patch)
treebb2d2351fd0b23f56cb1b1da093cca2e2904d2ab /drivers/soc
parent6923ea0a442b9bf97050656be90de94e0d2c71df (diff)
parentf36e381c12388e1e43be2b203d3326c02900feb7 (diff)
Merge "soc: qcom: pil: Clear elf memory on validation failure"
Diffstat (limited to 'drivers/soc')
-rw-r--r--drivers/soc/qcom/peripheral-loader.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c
index 2244c64d28af..4d9767b6f8a3 100644
--- a/drivers/soc/qcom/peripheral-loader.c
+++ b/drivers/soc/qcom/peripheral-loader.c
@@ -583,11 +583,35 @@ static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt)
return pil_init_entry_addr(priv, mdt);
}
+struct pil_map_fw_info {
+ void *region;
+ struct dma_attrs attrs;
+ phys_addr_t base_addr;
+ struct device *dev;
+};
+
static void pil_release_mmap(struct pil_desc *desc)
{
struct pil_priv *priv = desc->priv;
struct pil_seg *p, *tmp;
u64 zero = 0ULL;
+ u8 __iomem *buf;
+
+ struct pil_map_fw_info map_fw_info = {
+ .attrs = desc->attrs,
+ .region = priv->region,
+ .base_addr = priv->region_start,
+ .dev = desc->dev,
+ };
+
+ void *map_data = desc->map_data ? desc->map_data : &map_fw_info;
+
+ /* Clear memory so that unauthorized ELF code is not left behind */
+ buf = desc->map_fw_mem(priv->region_start, (priv->region_end -
+ priv->region_start), map_data);
+ pil_memset_io(buf, 0, (priv->region_end - priv->region_start));
+ desc->unmap_fw_mem(buf, (priv->region_end - priv->region_start),
+ map_data);
if (priv->info) {
__iowrite32_copy(&priv->info->start, &zero,
@@ -603,13 +627,6 @@ static void pil_release_mmap(struct pil_desc *desc)
#define IOMAP_SIZE SZ_1M
-struct pil_map_fw_info {
- void *region;
- struct dma_attrs attrs;
- phys_addr_t base_addr;
- struct device *dev;
-};
-
static void *map_fw_mem(phys_addr_t paddr, size_t size, void *data)
{
struct pil_map_fw_info *info = data;