#include "tz_ndbg.h" #ifdef CC_ENABLE_NDBG #include #include #include #include #include #include #include #include #include "trustzone/tz_cross/trustzone.h" #include "trustzone/tz_cross/ta_test.h" #include "trustzone/tz_cross/ta_mem.h" #include "trustzone/tz_cross/ta_ndbg.h" #include "trustzone/kree/system.h" #include "trustzone/kree/mem.h" #include "kree_int.h" #ifdef CONFIG_MTK_SMART_BATTERY extern int g_bat_init_flag; static int get_bat_sense_volt(int times) { if(g_bat_init_flag != 0) { return battery_meter_get_battery_voltage(KAL_TRUE); } return 0; } static int get_i_sense_volt(int times) { if(g_bat_init_flag != 0) { return battery_meter_get_VSense(); } return 0; } static int get_charger_volt(int times) { if(g_bat_init_flag != 0) { return battery_meter_get_charger_voltage(); } return 0; } #endif static int get_urandom_value(uint8_t *pu1Buf, int size) { mm_segment_t old_fs; struct file *filp = filp_open("/dev/urandom", O_RDONLY, 0444); if( IS_ERR(filp) ) { printk("Failed to open /dev/urandom\n"); return -1; } old_fs = get_fs(); set_fs( KERNEL_DS ); filp->f_op->read(filp, pu1Buf, size, &(filp->f_pos)); set_fs(old_fs); filp_close(filp, NULL); return 0; } 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; } #ifdef CC_NDBG_TEST_PROGRAM 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; } #endif void tz_ndbg_init(void) { kthread_run(entropy_thread, NULL, "entropy_thread"); #ifdef CC_NDBG_TEST_PROGRAM kthread_run(test_random_thread, NULL, "test_random_thread"); #endif } #endif