/******************************************************************************* * TSP fast smc handler. The secure monitor jumps to this function by * doing the ERET after populating X0-X7 registers. The arguments are received * in the function arguments in order. Once the service is rendered, this * function returns to Secure Monitor by raising SMC ******************************************************************************/ tsp_args *tsp_fast_smc_handler(uint64_t func, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t results[2]; uint64_t service_args[2]; uint64_t mpidr = read_mpidr(); uint32_t linear_id = platform_get_core_pos(mpidr); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; printf("SP: cpu 0x%x received fast smc 0x%x\n", read_mpidr(), func); INFO("cpu 0x%x: %d smcs, %d erets\n", mpidr, tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count); /* Render secure services and obtain results here */ results[0] = arg1; results[1] = arg2; /* * Request a service back from dispatcher/secure monitor. This call * return and thereafter resume exectuion */ tsp_get_magic(service_args); /* Determine the function to perform based on the function ID */ switch (func) { case TSP_FID_ADD: results[0] += service_args[0]; results[1] += service_args[1]; break; case TSP_FID_SUB: results[0] -= service_args[0]; results[1] -= service_args[1]; break; case TSP_FID_MUL: results[0] *= service_args[0]; results[1] *= service_args[1]; break; case TSP_FID_DIV: results[0] /= service_args[0] ? service_args[0] : 1; results[1] /= service_args[1] ? service_args[1] : 1; break; default: break; } return set_smc_args(func, results[0], results[1], 0, 0, 0, 0, 0); }
/******************************************************************************* * TSP fast smc handler. The secure monitor jumps to this function by * doing the ERET after populating X0-X7 registers. The arguments are received * in the function arguments in order. Once the service is rendered, this * function returns to Secure Monitor by raising SMC. ******************************************************************************/ tsp_args_t *tsp_smc_handler(uint64_t func, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7) { uint64_t results[2]; uint64_t service_args[2]; uint32_t linear_id = plat_my_core_pos(); /* Update this cpu's statistics */ tsp_stats[linear_id].smc_count++; tsp_stats[linear_id].eret_count++; INFO("TSP: cpu 0x%lx received %s smc 0x%lx\n", read_mpidr(), ((func >> 31) & 1) == 1 ? "fast" : "standard", func); INFO("TSP: cpu 0x%lx: %d smcs, %d erets\n", read_mpidr(), tsp_stats[linear_id].smc_count, tsp_stats[linear_id].eret_count); /* Render secure services and obtain results here */ results[0] = arg1; results[1] = arg2; /* * Request a service back from dispatcher/secure monitor. This call * return and thereafter resume exectuion */ tsp_get_magic(service_args); /* Determine the function to perform based on the function ID */ switch (TSP_BARE_FID(func)) { case TSP_ADD: results[0] += service_args[0]; results[1] += service_args[1]; break; case TSP_SUB: results[0] -= service_args[0]; results[1] -= service_args[1]; break; case TSP_MUL: results[0] *= service_args[0]; results[1] *= service_args[1]; break; case TSP_DIV: results[0] /= service_args[0] ? service_args[0] : 1; results[1] /= service_args[1] ? service_args[1] : 1; break; default: break; } return set_smc_args(func, 0, results[0], results[1], 0, 0, 0, 0); }