MALI: utgard: rockchip: walk around 'Understanding page domain faults'
authorchenzhen <chenzhen@rock-chips.com>
Tue, 14 Jun 2016 06:21:00 +0000 (14:21 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 27 Jul 2016 11:59:54 +0000 (19:59 +0800)
Change-Id: I89c935f9b309393b16fcb848ded6e665f525bd1c
Signed-off-by: chenzhen <chenzhen@rock-chips.com>
drivers/gpu/arm/mali400/mali/common/mali_gp_job.c

index 2a05f3f7d0894ef9eeba0ea0103268fffb8dfa37..81b46437af13fc79742d5c32bd09428224d14e5e 100755 (executable)
@@ -78,6 +78,7 @@ struct mali_gp_job *mali_gp_job_create(struct mali_session_data *session, _mali_
        u32 perf_counter_flag;
        u32 __user *memory_list = NULL;
        struct mali_gp_allocation_node *alloc_node, *tmp_node;
+       _mali_uk_gp_start_job_s copy_of_uargs;
 
        job = _mali_osk_calloc(1, sizeof(struct mali_gp_job));
        if (NULL != job) {
@@ -133,7 +134,11 @@ struct mali_gp_job *mali_gp_job_create(struct mali_session_data *session, _mali_
                                goto fail1;
                        }
 
-                       memory_list = (u32 __user *)(uintptr_t)uargs->varying_alloc_list;
+                       if (0 != _mali_osk_copy_from_user(&copy_of_uargs, uargs, sizeof(_mali_uk_gp_start_job_s))) {
+                               goto fail1;
+                       }
+
+                       memory_list = (u32 __user *)(uintptr_t)copy_of_uargs.varying_alloc_list;
 
                        if (0 != _mali_osk_copy_from_user(job->varying_list, memory_list, sizeof(u32) * job->uargs.varying_alloc_num)) {
                                MALI_PRINT_ERROR(("Mali GP job: Failed to copy varying list from user space!\n"));
@@ -173,7 +178,7 @@ struct mali_gp_job *mali_gp_job_create(struct mali_session_data *session, _mali_
                                }
                        }
 
-                       if (uargs->varying_memsize > MALI_UK_BIG_VARYING_SIZE) {
+                       if (copy_of_uargs.varying_memsize > MALI_UK_BIG_VARYING_SIZE) {
                                job->big_job = 1;
                        }
                }