// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <zircon/syscalls/smc.h>

#include <gtest/gtest.h>

#include "tools/fidlcat/interception_tests/interception_workflow_test.h"

namespace fidlcat {

// zx_smc_call tests.

std::unique_ptr<SystemCallTest> ZxSmcCall(int64_t result, std::string_view result_name,
                                          zx_handle_t handle, const zx_smc_parameters_t* parameters,
                                          zx_smc_result_t* out_smc_result) {
  auto value = std::make_unique<SystemCallTest>("zx_smc_call", result, result_name);
  value->AddInput(handle);
  value->AddInput(reinterpret_cast<uint64_t>(parameters));
  value->AddInput(reinterpret_cast<uint64_t>(out_smc_result));
  return value;
}

#define SMC_CALL_DISPLAY_TEST_CONTENT(result, expected)                                     \
  zx_smc_parameters_t parameters = {.func_id = 1,                                           \
                                    .arg1 = 2,                                              \
                                    .arg2 = 3,                                              \
                                    .arg3 = 4,                                              \
                                    .arg4 = 5,                                              \
                                    .arg5 = 6,                                              \
                                    .arg6 = 7,                                              \
                                    .client_id = 8,                                         \
                                    .secure_os_id = 9};                                     \
  zx_smc_result_t out_smc_result = {.arg0 = 1, .arg1 = 2, .arg2 = 3, .arg3 = 3, .arg6 = 4}; \
  PerformDisplayTest("$plt(zx_smc_call)",                                                   \
                     ZxSmcCall(result, #result, kHandle, &parameters, &out_smc_result), expected)

#define SMC_CALL_DISPLAY_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { SMC_CALL_DISPLAY_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { SMC_CALL_DISPLAY_TEST_CONTENT(errno, expected); }

SMC_CALL_DISPLAY_TEST(ZxSmcCall, ZX_OK,
                      "\n"
                      "\x1B[32m0.000000\x1B[0m "
                      "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                      "zx_smc_call(handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m)\n"
                      "  parameters: \x1B[32mzx_smc_parameters_t\x1B[0m = {\n"
                      "    func_id: \x1B[32muint32\x1B[0m = \x1B[34m1\x1B[0m\n"
                      "    arg1: \x1B[32muint64\x1B[0m = \x1B[34m2\x1B[0m\n"
                      "    arg2: \x1B[32muint64\x1B[0m = \x1B[34m3\x1B[0m\n"
                      "    arg3: \x1B[32muint64\x1B[0m = \x1B[34m4\x1B[0m\n"
                      "    arg4: \x1B[32muint64\x1B[0m = \x1B[34m5\x1B[0m\n"
                      "    arg5: \x1B[32muint64\x1B[0m = \x1B[34m6\x1B[0m\n"
                      "    arg6: \x1B[32muint64\x1B[0m = \x1B[34m7\x1B[0m\n"
                      "    client_id: \x1B[32muint16\x1B[0m = \x1B[34m8\x1B[0m\n"
                      "    secure_os_id: \x1B[32muint16\x1B[0m = \x1B[34m9\x1B[0m\n"
                      "  }\n"
                      "\x1B[32m0.000000\x1B[0m "
                      "  -> \x1B[32mZX_OK\x1B[0m\n"
                      "    out_smc_result: \x1B[32mzx_smc_result_t\x1B[0m = { "
                      "arg0: \x1B[32muint64\x1B[0m = \x1B[34m1\x1B[0m, "
                      "arg1: \x1B[32muint64\x1B[0m = \x1B[34m2\x1B[0m, "
                      "arg2: \x1B[32muint64\x1B[0m = \x1B[34m3\x1B[0m, "
                      "arg3: \x1B[32muint64\x1B[0m = \x1B[34m3\x1B[0m, "
                      "arg6: \x1B[32muint64\x1B[0m = \x1B[34m4\x1B[0m "
                      "}\n")

}  // namespace fidlcat
