[COMMON] iommu/exynos: fix prevent issue
authorJanghyuck Kim <janghyuck.kim@samsung.com>
Thu, 23 Nov 2017 08:10:50 +0000 (17:10 +0900)
committerSangwook Ju <sw.ju@samsung.com>
Mon, 14 May 2018 10:45:21 +0000 (19:45 +0900)
This patch fixed below prevent issue which are other violation types.

CID 201989,201988,201971,201965,201958,201937,201925,201912,200894

Change-Id: Ic43a796b3f159a8f6cd36756b5e7b42df97a1ec2
Signed-off-by: Janghyuck Kim <janghyuck.kim@samsung.com>
drivers/iommu/exynos-iommu.c
drivers/iommu/exynos-iovmm.c

index bfb4a47167208c7110a86c8ba8107df43d33faca..bdc86e9c8c73cf55107e3e99688edb47a1b17dbc 100644 (file)
@@ -135,7 +135,7 @@ void exynos_sysmmu_tlb_invalidate(struct iommu_domain *iommu_domain,
 static void sysmmu_get_interrupt_info(struct sysmmu_drvdata *data,
                        int *flags, unsigned long *addr, bool is_secure)
 {
-       unsigned int itype;
+       unsigned long itype;
        u32 info;
 
        itype =  __ffs(__sysmmu_get_intr_status(data, is_secure));
@@ -1308,7 +1308,7 @@ static int sysmmu_fault_notifier(struct notifier_block *nb,
 
        if (owner && owner->fault_handler)
                owner->fault_handler(owner->domain, owner->master,
-                       fault_addr, (unsigned long)data, owner->token);
+                       fault_addr, *(int *)data, owner->token);
 
        return 0;
 }
@@ -1576,7 +1576,7 @@ static int sysmmu_map_pte(struct mm_struct *mm,
                        set_lv2ent_shareable(ent);
 
                ent++;
-               iova += PAGE_SIZE;
+               iova += (sysmmu_iova_t)PAGE_SIZE;
 
                if ((iova & SECT_MASK) != ((iova - 1) & SECT_MASK)) {
                        pgtable_flush(ent_beg, ent);
@@ -1611,7 +1611,7 @@ static inline int sysmmu_map_pmd(struct mm_struct *mm,
                next = pmd_addr_end(addr, end);
                if (sysmmu_map_pte(mm, pmd, addr, next, domain, iova, prot))
                        return -ENOMEM;
-               iova += (next - addr);
+               iova += (sysmmu_iova_t)(next - addr);
        } while (pmd++, addr = next, addr != end);
        return 0;
 }
@@ -1629,7 +1629,7 @@ static inline int sysmmu_map_pud(struct mm_struct *mm,
                next = pud_addr_end(addr, end);
                if (sysmmu_map_pmd(mm, pud, addr, next, domain, iova, prot))
                        return -ENOMEM;
-               iova += (next - addr);
+               iova += (sysmmu_iova_t)(next - addr);
        } while (pud++, addr = next, addr != end);
        return 0;
 }
@@ -1654,7 +1654,7 @@ int exynos_iommu_map_userptr(struct iommu_domain *dom, unsigned long addr,
                ret = sysmmu_map_pud(mm, pgd, addr, next, domain, iova, prot);
                if (ret)
                        goto err;
-               iova += (next - addr);
+               iova += (sysmmu_iova_t)(next - addr);
        } while (pgd++, addr = next, addr != end);
 
        return 0;
@@ -1673,7 +1673,7 @@ void exynos_iommu_unmap_userptr(struct iommu_domain *dom,
        struct exynos_iommu_domain *domain = to_exynos_domain(dom);
        sysmmu_iova_t iova = (sysmmu_iova_t)d_iova;
        sysmmu_pte_t *sent = section_entry(domain->pgtable, iova);
-       unsigned int entries = size >> SPAGE_ORDER;
+       unsigned int entries = (unsigned int)(size >> SPAGE_ORDER);
        dma_addr_t start = d_iova;
 
        while (entries > 0) {
index 4e5cdf01c80fd311b0a1b8413e044114f11c5749..df48570490945bc61e60d513f3a781eff654e7ea 100644 (file)
@@ -110,7 +110,7 @@ again:
        region->start = vstart;
        region->size = vsize << PAGE_SHIFT;
        region->dummy_size = region->size - size;
-       region->section_off = section_offset << PAGE_SHIFT;
+       region->section_off = (unsigned int)(section_offset << PAGE_SHIFT);
 
        spin_lock(&vmm->vmlist_lock);
        list_add_tail(&region->node, &vmm->regions_list);
@@ -194,7 +194,7 @@ static dma_addr_t add_iovm_region(struct exynos_iovmm *vmm,
 
        INIT_LIST_HEAD(&region->node);
        region->start = start;
-       region->size = size;
+       region->size = (u32)size;
 
        spin_lock(&vmm->vmlist_lock);