Example #1
0
int main(int argc, char *argv[])
{
    TZ_RESULT ret;
    UREE_SESSION_HANDLE dbg_session;
    UREE_SECUREMEM_INFO info;

    printf ("Run memory CA\n");

    ret = UREE_CreateSession(TZ_TA_DBG_UUID, &dbg_session);
    if (ret != TZ_RESULT_SUCCESS)
    {
        // Should provide strerror style error string in UREE.
        printf("CreateSession Error: %s\n", TZ_GetErrorString(ret));
        return 1;
    }

    // get secure memory information
    ret = UREE_GetSecurememinfo (dbg_session, &info);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printf("UREE_GetSecurememinfo Error: %s\n", TZ_GetErrorString(ret));
        return 0;
    }
    printf ("secure memory: Used = 0x%x bytes, Total = 0x%x bytes,\n"
            "               Max free continuous mem sz = 0x%x bytes\n"
            "               Max foot print = 0x%x bytes\n"
            , info.used_byte, info.total_byte, info.max_free_cont_mem_sz, info.max_foot_print);


    // get secure chunk memory information
    ret = UREE_GetSecurechunkmeminfo (dbg_session, &info);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printf("UREE_GetSecurechunkmeminfo Error: %s\n", TZ_GetErrorString(ret));
        return 0;
    }
    printf ("secure chunk memory: Used = 0x%x bytes, Total = 0x%x bytes,\n"
            "                     Max free continuous mem sz = 0x%x bytes\n"
            "                     Max foot print = 0x%x bytes\n"
            , info.used_byte, info.total_byte, info.max_free_cont_mem_sz, info.max_foot_print);


    ret = UREE_CloseSession(dbg_session);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printf("CloseSeesion dbg_session_A Error: %d\n", ret);
    }

    printf ("Memory CA done\n");

    return 0;
}
Example #2
0
int kree_set_fiq(int irq, unsigned long irq_flags)
{
    MTEEC_PARAM param[4];
    TZ_RESULT ret;
    unsigned long tz_irq_flags = 0;
    
    if (irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) {
        tz_irq_flags |= TZ_IRQF_EDGE_SENSITIVE;
        tz_irq_flags |= (irq_flags & IRQF_TRIGGER_FALLING) ? TZ_IRQF_LOW : TZ_IRQF_HIGH;
    } else if (irq_flags & (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW)) {
        tz_irq_flags |= TZ_IRQF_LEVEL_SENSITIVE;
        tz_irq_flags |= (irq_flags & IRQF_TRIGGER_LOW) ? TZ_IRQF_LOW : TZ_IRQF_HIGH;
    }

    param[0].value.a = irq;
    param[1].value.a = tz_irq_flags;
    ret = KREE_TeeServiceCall(irq_session, TZCMD_IRQ_SET_FIQ,
                              TZ_ParamTypes2(TZPT_VALUE_INPUT, TZPT_VALUE_INPUT),
                              param);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printk("%s error: %s\n", __FUNCTION__, TZ_GetErrorString(ret));
    }
    return ret;
}
Example #3
0
TZ_RESULT UREE_ReleaseTzmem (int *fd_p)
{
    int fd;
    int ret = TZ_RESULT_SUCCESS;    
    UREE_SESSION_HANDLE session;
    uint32_t size;

    if (fd_p == NULL)
    {
        return TZ_RESULT_ERROR_BAD_PARAMETERS;
    }

    pthread_mutex_lock(&mtee_tzmemInfo.mutex);

    if (mtee_tzmemInfo.control != 0)
    {
        ret = TZ_RESULT_ERROR_GENERIC;
        goto out;
    }
    
	ret = UREE_CreateSession(TZ_TA_MEM_UUID, &session);
	if (ret != TZ_RESULT_SUCCESS)
	{
	    printf("UREE_ReleaseTzmem: CreateSession Error = %s\n", TZ_GetErrorString(ret));
	    goto out;
	}  

    ret = UREE_ReleaseSecurechunkmem (session, 0x0, &size);
    printf ("released size = 0x%x\n", size);
    if (ret != TZ_RESULT_SUCCESS)
    {
        ret = TZ_RESULT_ERROR_GENERIC;
        goto out_release_fail;
    }
    
    fd = open("/dev/tzmem", O_RDWR);
    if (fd < 0)
    {
        ret = TZ_RESULT_ERROR_GENERIC;
        goto out_release_fail;
    }
    else
    {
        *fd_p = fd;
    }

    mtee_tzmemInfo.session = session;
    mtee_tzmemInfo.control = 1;
    
    pthread_mutex_unlock(&mtee_tzmemInfo.mutex);    
    return ret;
    
out_release_fail:
    UREE_CloseSession (session);
out:
    pthread_mutex_unlock(&mtee_tzmemInfo.mutex);
    
    return ret;
}
Example #4
0
int kree_pm_device_ops(int state)
{
    MTEEC_PARAM param[4];
    TZ_RESULT ret;

    param[0].value.a = (uint32_t)state;
    ret = KREE_TeeServiceCall(pm_session, TZCMD_PM_DEVICE_OPS,
                              TZ_ParamTypes1(TZPT_VALUE_INPUT), param);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printk("%s error: %s\n", __FUNCTION__, TZ_GetErrorString(ret));
    }
    return ret;
}
Example #5
0
int kree_pm_cpu_dormant(int mode)
{
    MTEEC_PARAM param[4];
    TZ_RESULT ret;

    param[0].value.a = mode;
    ret = KREE_TeeServiceCall(pm_session, TZCMD_PM_CPU_DORMANT,
                              TZ_ParamTypes1(TZPT_VALUE_INPUT), param);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printk("%s error: %s\n", __FUNCTION__, TZ_GetErrorString(ret));
    }

    return 0;
}
Example #6
0
void kree_pm_cpu_lowpower(volatile int *ppen_release, int logical_cpuid)
{
    MTEEC_PARAM param[4];
    TZ_RESULT ret;

    param[0].value.a = (unsigned int)ppen_release;
    param[1].value.a = logical_cpuid;
    ret = KREE_TeeServiceCall(pm_session, TZCMD_PM_CPU_LOWPOWER,
                              TZ_ParamTypes2(TZPT_VALUE_INPUT, TZPT_VALUE_INPUT),
                              param);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printk("%s error: %s\n", __FUNCTION__, TZ_GetErrorString(ret));
    }
}
Example #7
0
void kree_irq_mask_restore(unsigned int *pmask, unsigned int size)
{
    MTEEC_PARAM param[4];
    TZ_RESULT ret;

    param[0].mem.buffer = pmask;
    param[0].mem.size = size;
    ret = KREE_TeeServiceCall(irq_session, TZCMD_IRQ_MASK_RESTORE,
                              TZ_ParamTypes1(TZPT_MEM_INPUT),
                              param);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printk("%s error: %s\n", __FUNCTION__, TZ_GetErrorString(ret));
    }
}
Example #8
0
static void __kree_enable_fiq(int irq, int enable)
{
    MTEEC_PARAM param[4];
    TZ_RESULT ret;

    param[0].value.a = irq;
    param[1].value.a = enable;
    ret = KREE_TeeServiceCall(irq_session, TZCMD_IRQ_ENABLE_FIQ,
                              TZ_ParamTypes2(TZPT_VALUE_INPUT, TZPT_VALUE_INPUT),
                              param);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printk("%s error: %s\n", __FUNCTION__, TZ_GetErrorString(ret));
    }
}
Example #9
0
void kree_query_fiq(int irq, int *enable, int *pending)
{
    MTEEC_PARAM param[4];
    TZ_RESULT ret;

    param[0].value.a = irq;
    ret = KREE_TeeServiceCall(irq_session, TZCMD_IRQ_QUERY_FIQ,
                              TZ_ParamTypes2(TZPT_VALUE_INPUT, TZPT_VALUE_OUTPUT),
                              param);
    if (ret != TZ_RESULT_SUCCESS)
    {
        printk("%s error: %s\n", __FUNCTION__, TZ_GetErrorString(ret));
        param[1].value.a = 0;
    }

    *enable = param[1].value.a & 1;
    *pending = (param[1].value.a & 2) != 0;
}
Example #10
0
TZ_RESULT UREE_AppendTzmem (int fd)
{
    int ret = TZ_RESULT_SUCCESS;
    UREE_SESSION_HANDLE session;

    if (fd == 0)
    {
        return TZ_RESULT_ERROR_BAD_PARAMETERS;
    }

    pthread_mutex_lock(&mtee_tzmemInfo.mutex);  

    if (mtee_tzmemInfo.control == 0)
    {
        ret = TZ_RESULT_ERROR_GENERIC;
        goto out;
    }

    close (fd);

    session = mtee_tzmemInfo.session;
    ret = UREE_AppendSecurechunkmem (session);
    if (ret != TZ_RESULT_SUCCESS)
    {
        ret = TZ_RESULT_ERROR_GENERIC;
    }

    ret = UREE_CloseSession(session);
	if (ret != TZ_RESULT_SUCCESS)
	{
	    printf("UREE_AppendTzmem: UREE_CloseSession Error = %s\n", TZ_GetErrorString(ret));
	    goto out;
	}

    mtee_tzmemInfo.control = 0;

out:
    pthread_mutex_unlock(&mtee_tzmemInfo.mutex);    
    return ret;
}
int entropy_thread(void * arg)
{
    TZ_RESULT ret;
    KREE_SESSION_HANDLE ndbg_session;
    KREE_SESSION_HANDLE mem_session;
    KREE_SHAREDMEM_HANDLE shm_handle;
    KREE_SHAREDMEM_PARAM shm_param;
    MTEEC_PARAM param[4];
    uint8_t* ptr;

    ptr = (uint8_t*)kmalloc(NDBG_REE_ENTROPY_SZ, GFP_KERNEL);
    memset(ptr, 0, NDBG_REE_ENTROPY_SZ);

    while(!kthread_should_stop())
    {
        ret = KREE_CreateSession(TZ_TA_NDBG_UUID, &ndbg_session);
        if (ret != TZ_RESULT_SUCCESS)
        {
            printk("CreateSession error %d\n", ret);
            return 1;
        }

        ret = KREE_CreateSession(TZ_TA_MEM_UUID, &mem_session);
        if (ret != TZ_RESULT_SUCCESS)
        {
            printk("Create memory session error %d\n", ret);
            return 1;
        }

        shm_param.buffer = ptr;
        shm_param.size = NDBG_REE_ENTROPY_SZ;
        ret = KREE_RegisterSharedmem(mem_session, &shm_handle, &shm_param);
        if (ret != TZ_RESULT_SUCCESS)
        {
            printk("KREE_RegisterSharedmem Error: %s\n", TZ_GetErrorString(ret));
            return 1;
        }

#ifdef CONFIG_MTK_SMART_BATTERY
        *((uint32_t*)(ptr+0))  = get_bat_sense_volt(1);
        *((uint32_t*)(ptr+4))  = get_i_sense_volt(1);
        *((uint32_t*)(ptr+8))  = get_charger_volt(1);
        *((uint32_t*)(ptr+12)) = get_charger_volt(1);
        get_urandom_value(ptr+NDBG_BAT_ST_SIZE, URAN_SIZE);
#else
        /* without battery, any other good source for nondetermined #? */
        get_urandom_value(ptr, NDBG_REE_ENTROPY_SZ);
#endif

        param[0].memref.handle = (uint32_t) shm_handle;
        param[0].memref.offset = 0;
        param[0].memref.size   = NDBG_REE_ENTROPY_SZ;
        param[1].value.a       = NDBG_REE_ENTROPY_SZ;

        ret = KREE_TeeServiceCall((KREE_SESSION_HANDLE)ndbg_session,
                TZCMD_NDBG_INIT,
                TZ_ParamTypes3(TZPT_MEMREF_INPUT, TZPT_VALUE_INPUT, TZPT_VALUE_OUTPUT), param);

        printk ("Start to wait reseed.\n");
        ret = KREE_TeeServiceCall((KREE_SESSION_HANDLE)ndbg_session,
                TZCMD_NDBG_WAIT_RESEED,
                TZ_ParamTypes3(TZPT_MEMREF_INPUT, TZPT_VALUE_INPUT, TZPT_VALUE_OUTPUT), param);
        printk ("OK to send reseed.\n");

        ret = KREE_UnregisterSharedmem(mem_session, shm_handle);
        if (ret != TZ_RESULT_SUCCESS)
        {
            printk("KREE_UnregisterSharedmem Error: %s\n", TZ_GetErrorString(ret));
            return 1;
        }

        ret = KREE_CloseSession(ndbg_session);
        if (ret != TZ_RESULT_SUCCESS)
            printk("CloseSession error %d\n", ret);

        ret = KREE_CloseSession(mem_session);
        if (ret != TZ_RESULT_SUCCESS)
            printk("Close memory session error %d\n", ret);

    }

    kfree(ptr);

    return 0;
}
int test_random_thread(void * arg)
{
    TZ_RESULT ret;
    KREE_SESSION_HANDLE ndbg_session;
    KREE_SESSION_HANDLE mem_session;
    KREE_SHAREDMEM_HANDLE shm_handle;
    KREE_SHAREDMEM_PARAM shm_param;
    MTEEC_PARAM param[4];
    uint32_t *ptr;
    int size = 32;

    ptr = (uint32_t *)kmalloc(size, GFP_KERNEL);
    memset(ptr, 0, size);

    while(!kthread_should_stop())
    {
        ret = KREE_CreateSession(TZ_TA_NDBG_UUID, &ndbg_session);
        if (ret != TZ_RESULT_SUCCESS)
        {
            printk("CreateSession error %d\n", ret);
            return 1;
        }

        ret = KREE_CreateSession(TZ_TA_MEM_UUID, &mem_session);
        if (ret != TZ_RESULT_SUCCESS)
        {
            printk("Create memory session error %d\n", ret);
            return 1;
        }

        shm_param.buffer = ptr;
        shm_param.size = size;
        ret = KREE_RegisterSharedmem(mem_session, &shm_handle, &shm_param);
        if (ret != TZ_RESULT_SUCCESS)
        {
            printk("KREE_RegisterSharedmem Error: %s\n", TZ_GetErrorString(ret));
            return 1;
        }

        param[0].memref.handle = (uint32_t) shm_handle;
        param[0].memref.offset = 0;
        param[0].memref.size = size/4;
        param[1].value.a = size/4;

        ret = KREE_TeeServiceCall((KREE_SESSION_HANDLE)ndbg_session,
                TZCMD_NDBG_RANDOM,
                TZ_ParamTypes3(TZPT_MEMREF_INPUT, TZPT_VALUE_INPUT, TZPT_VALUE_OUTPUT), param);

        ret = KREE_UnregisterSharedmem(mem_session, shm_handle);
        if (ret != TZ_RESULT_SUCCESS)
        {
            printk("KREE_UnregisterSharedmem Error: %s\n", TZ_GetErrorString(ret));
            return 1;
        }

        ret = KREE_CloseSession(ndbg_session);
        if (ret != TZ_RESULT_SUCCESS)
            printk("CloseSession error %d\n", ret);

        ret = KREE_CloseSession(mem_session);
        if (ret != TZ_RESULT_SUCCESS)
            printk("Close memory session error %d\n", ret);

        ssleep(5);
    }

    kfree(ptr);

    return 0;
}