blob: c24f6fc9ff27980a4a6d7af7a2a7c7c362cbbf4a [file] [log] [blame]
J-Alves0e1e7ca2021-01-25 14:11:06 +00001/*
2 * Copyright (c) 2021, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
J-Alveseeb25472021-03-11 09:54:21 +00007#include "cactus_message_loop.h"
J-Alves0e1e7ca2021-01-25 14:11:06 +00008#include "cactus_test_cmds.h"
9#include <ffa_helpers.h>
J-Alveseeb25472021-03-11 09:54:21 +000010#include <debug.h>
11
J-Alves0e1e7ca2021-01-25 14:11:06 +000012
13/**
14 * Begin and end of command handler table, respectively. Both symbols defined by
15 * the linker.
16 */
17extern struct cactus_cmd_handler cactus_cmd_handler_begin[];
18extern struct cactus_cmd_handler cactus_cmd_handler_end[];
19
J-Alveseeb25472021-03-11 09:54:21 +000020#define PRINT_CMD(smc_ret) \
21 VERBOSE("cmd %lx; args: %lx, %lx, %lx, %lx\n", \
22 smc_ret.ret3, smc_ret.ret4, smc_ret.ret5, \
23 smc_ret.ret6, smc_ret.ret7)
24
J-Alves0e1e7ca2021-01-25 14:11:06 +000025/**
26 * Traverses command table from section ".cactus_handler", searches for a
27 * registered command and invokes the respective handler.
28 */
29bool cactus_handle_cmd(smc_ret_values *cmd_args, smc_ret_values *ret,
30 struct mailbox_buffers *mb)
31{
J-Alves4cb9dee2021-03-03 13:59:52 +000032 uint64_t in_cmd;
33
J-Alves0e1e7ca2021-01-25 14:11:06 +000034 if (cmd_args == NULL || ret == NULL) {
Madhukar Pappireddycd183ef2021-08-05 15:34:07 -050035 ERROR("Invalid arguments passed to %s!\n", __func__);
J-Alves0e1e7ca2021-01-25 14:11:06 +000036 return false;
37 }
38
J-Alveseeb25472021-03-11 09:54:21 +000039 PRINT_CMD((*cmd_args));
40
J-Alves4cb9dee2021-03-03 13:59:52 +000041 in_cmd = cactus_get_cmd(*cmd_args);
J-Alves0e1e7ca2021-01-25 14:11:06 +000042
43 for (struct cactus_cmd_handler *it_cmd = cactus_cmd_handler_begin;
44 it_cmd < cactus_cmd_handler_end;
45 it_cmd++) {
46 if (it_cmd->id == in_cmd) {
47 *ret = it_cmd->fn(cmd_args, mb);
48 return true;
49 }
50 }
51
J-Alves4cb9dee2021-03-03 13:59:52 +000052 *ret = cactus_error_resp(ffa_dir_msg_dest(*cmd_args),
53 ffa_dir_msg_source(*cmd_args),
54 CACTUS_ERROR_UNHANDLED);
55 return true;
J-Alves0e1e7ca2021-01-25 14:11:06 +000056}