static bool process_one_request(struct thread_arg *arg) { union tee_rpc_invoke request; size_t num_params; size_t num_meta; struct tee_ioctl_param *params; uint32_t func; uint32_t ret; DMSG("looping"); memset(&request, 0, sizeof(request)); request.recv.num_params = RPC_NUM_PARAMS; /* Let it be known that we can deal with meta parameters */ params = (struct tee_ioctl_param *)(&request.send + 1); params->attr = TEE_IOCTL_PARAM_ATTR_META; num_waiters_inc(arg); if (!read_request(arg->fd, &request)) return false; if (!find_params(&request, &func, &num_params, ¶ms, &num_meta)) return false; if (num_meta && !num_waiters_dec(arg) && !spawn_thread(arg)) return false; switch (func) { case OPTEE_MSG_RPC_CMD_LOAD_TA: ret = load_ta(num_params, params); break; case OPTEE_MSG_RPC_CMD_FS: ret = tee_supp_fs_process(num_params, params); break; case OPTEE_MSG_RPC_CMD_RPMB: ret = process_rpmb(num_params, params); break; case OPTEE_MSG_RPC_CMD_SHM_ALLOC: ret = process_alloc(arg, num_params, params); break; case OPTEE_MSG_RPC_CMD_SHM_FREE: ret = process_free(num_params, params); break; case OPTEE_MSG_RPC_CMD_GPROF: ret = gprof_process(num_params, params); break; case OPTEE_MSG_RPC_CMD_SOCKET: ret = tee_socket_process(num_params, params); break; default: EMSG("Cmd [0x%" PRIx32 "] not supported", func); /* Not supported. */ ret = TEEC_ERROR_NOT_SUPPORTED; break; } request.send.ret = ret; return write_response(arg->fd, &request); }
int main(int argc, char **argv) { int fd; unsigned int cmd; char *progname, *p; progname = argv[0]; if ((p = strrchr(progname, '/')) != NULL) progname = p+1; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); if (argc == 2 && (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version"))) { printf(_("%s from %s\n"), progname, util_linux_version); exit(0); } if (argc < 2) usage(progname); cmd = FDSETPRM; if (*argv[1] == '-') { switch (argv[1][1]) { case 'c': cmd = FDCLRPRM; break; case 'p': cmd = FDDEFPRM; break; case 'y': cmd = FDMSGON; break; case 'n': cmd = FDMSGOFF; break; #ifdef FDMEDCNG case 'd': cmd = FDMEDCNG; break; #endif default: usage(progname); } argc--; argv++; } if ((fd = open(argv[1],3)) < 0) { /* O_WRONLY needed in a few kernels */ perror(argv[1]); exit(1); } if (cmd != FDSETPRM && cmd != FDDEFPRM) { if (argc != 2) usage(progname); cmd_without_param(cmd,fd); } if (argc != 11 && argc != 3) usage(progname); else if (argc == 11) set_params(cmd,fd,&argv[2]); else find_params(cmd,fd,argv[2]); /* not reached */ return 0; }