[FOSS_TLK]tlk: task: fix task map ID handling
Chris Johnson [Tue, 30 Dec 2014 20:19:15 +0000 (12:19 -0800)]
The task bootloader during init builds task_map_t structs
for the various sections of the TA binary and also based
on the manifest adds MMIO mappings.

These MMIO mappings specify an ID, which is later used by
the TA to retrieve the virtual address for this mapping.
To work properly these IDs need to be unique.

Previously, callers of task_add_mapping didn't init all
the fields of the malloc-ed task_map_t. This meant a later
request by ID for the virtual addr could match the wrong
mapping leading to data aborts (e.g. protection fault).

This change now callocs the task_map_t, so the ID of the
mapping is initialized and adds asserts/checks on the ID
coming from the manifest and during the IOCTL to retrieve
the mapping.

Change-Id: Ic68307fd9ca933437d23f77e6ffaba203394dd8b
Signed-off-by: Chris Johnson <cwj@nvidia.com>
Reviewed-on: http://git-master/r/715769
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Varun Wadekar <vwadekar@nvidia.com>
Tested-by: Varun Wadekar <vwadekar@nvidia.com>

arch/arm/arm/task.c
kernel/syscall.c
kernel/task.c

index 302dc7e..d497e60 100644 (file)
@@ -99,7 +99,7 @@ task_map_t *arch_task_map_memory(task_t *task, uint64_t addr, u_int size, u_int
                        return NULL;
        }
 
-       mptr = malloc(sizeof(task_map_t));
+       mptr = calloc(1, sizeof(task_map_t));
        if (mptr == NULL)
                return NULL;
 
@@ -180,7 +180,7 @@ task_map_t *arch_task_setup_mmio(task_t *task, u_int id, addr_t paddr, u_int siz
        dprintf(SPEW, "%s: id 0x%x paddr 0x%x size 0x%x\n",
                __func__, id, (u_int)paddr, size);
 
-       mptr = malloc(sizeof(task_map_t));
+       mptr = calloc(1, sizeof(task_map_t));
        if (mptr == NULL)
                return NULL;
 
index 949c026..ca578d3 100644 (file)
@@ -133,6 +133,11 @@ static int platform_ioctl_handler(u_int cmd, void *cmdbuf)
                                return -EFAULT;
                        }
 
+                       /* only non-zero IDs are unique */
+                       if (!args->id) {
+                               return -EINVAL;
+                       }
+
                        mptr = task_find_mapping_by_id(taskp, args->id);
                        if (mptr == NULL) {
                                return -EINVAL;
index 94f65b2..2496160 100644 (file)
@@ -236,6 +236,10 @@ static void task_setup_mmio(task_t *taskp)
                        offset = taskp->props.config_blob[++i];
                        size = taskp->props.config_blob[++i];
 
+                       /* check mapping ID is non-zero and unique */
+                       ASSERT(id);
+                       ASSERT(!task_find_mapping_by_id(taskp, id));
+
                        arch_task_setup_mmio(taskp, id, offset, size);
                } else {
                        /* all other config options take 1 data value */
@@ -292,6 +296,8 @@ void task_add_mapping(task_t *taskp, task_map_t *new_mptr)
        ASSERT(taskp);
        ASSERT(new_mptr);
        ASSERT(new_mptr->vaddr && new_mptr->size);
+       ASSERT(!new_mptr->id || (new_mptr->flags & TM_IO));
+
        list_for_every_entry(&taskp->map_list, mptr, task_map_t, node) {
                if (mptr->vaddr > new_mptr->vaddr) {
                        ASSERT((new_mptr->vaddr + new_mptr->size) <= mptr->vaddr);
@@ -367,7 +373,7 @@ static status_t task_init_stack(task_t *taskp)
 {
        task_map_t *mptr;
 
-       mptr = malloc(sizeof(task_map_t));
+       mptr = calloc(1, sizeof(task_map_t));
        if (mptr == NULL)
                return ERR_NO_MEMORY;
 
@@ -424,7 +430,7 @@ static status_t task_init_brk(u_int task_image_addr, task_t *taskp, Elf32_Ehdr *
 
        /* increase user mode heap (if not enough remains) */
        if ((taskp->end_brk - taskp->curr_brk) < taskp->props.min_heap_size) {
-               mptr = malloc(sizeof(task_map_t));
+               mptr = calloc(1, sizeof(task_map_t));
                if (mptr == NULL)
                        return ERR_NO_MEMORY;
 
@@ -504,7 +510,7 @@ static status_t task_alloc_address_map(task_t *taskp)
                if((prg_hdr->p_vaddr & PAGE_MASK) || (prg_hdr->p_offset & PAGE_MASK))
                        return ERR_TASK_GENERIC;
 
-               mptr = malloc(sizeof(task_map_t));
+               mptr = calloc(1, sizeof(task_map_t));
                if (mptr == NULL)
                        return ERR_NO_MEMORY;