// 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 <atomic>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>

#include <fbl/algorithm.h>
#include <lib/zx/thread.h>
#include <pretty/hexdump.h>
#include <test-utils/test-utils.h>
#include <unittest/unittest.h>
#include <zircon/types.h>
#include <zircon/syscalls/debug.h>
#include <zircon/syscalls/port.h>

#include "debugger.h"
#include "inferior.h"
#include "inferior-control.h"
#include "utils.h"

namespace {

constexpr uint64_t kMagicRegisterValue = 0x0123456789abcdefull;

// State that is maintained across the register access tests.

struct reg_access_test_state_t {
    // The PC of the first thread can't be validated until we can get the
    // inferior's libc load address. Save it here for later validation.
    zx_vaddr_t inferior_libc_entry_point;

    // The load addresses of libc and executable are obtained from the
    // inferior after it has started.
    zx_vaddr_t inferior_libc_load_addr;
    zx_vaddr_t inferior_exec_load_addr;
};

typedef void (raw_thread_func_t)(void* arg1, void* arg2);

// Worker thread entry point so that we can exercise the setting of register
// values. We want to grab the register values at the start of the thread to
// see if they were set correctly, but we can't (or at least shouldn't) make
// any assumptions about what libc's thread entry will do to them before we're
// able to see them.

__NO_RETURN void raw_capture_regs_thread_func(void* arg1, void* arg2,
                                              raw_thread_func_t* func,
                                              uint64_t magic_value) {
    // We can't do much in this function, at this point all we have is a
    // raw thread. If |magic_value| is wrong then crash.
    if (magic_value != kMagicRegisterValue) {
        undefined_insn();
    }
    func(arg1, arg2);
    __UNREACHABLE;
}

// Helper function to test register access when a thread starts.

bool test_thread_start_register_access(reg_access_test_state_t* test_state,
                                       zx_handle_t inferior, zx_koid_t tid) {
    BEGIN_HELPER;

    zx::thread thread{tu_process_get_thread(inferior, tid)};
    ASSERT_TRUE(thread.is_valid());

    zx_info_thread_t info = tu_thread_get_info(thread.get());
    EXPECT_EQ(info.state, ZX_THREAD_STATE_BLOCKED_EXCEPTION, "");

    zx_thread_state_general_regs_t regs;
    read_inferior_gregs(thread.get(), &regs);
    uint64_t pc = extract_pc_reg(&regs);

    // If we're the first thread the pc should be the ELF entry point.
    // If not the pc should be the thread's entry point.
    zx_koid_t threads[1 + kNumExtraThreads];
    size_t num_threads = tu_process_get_threads(inferior, threads, fbl::count_of(threads));
    if (num_threads == 1) {
        // We don't know the inferior's load address yet so we can't do a full
        // validation of the PC yet. Save it for later when we can.
        test_state->inferior_libc_entry_point = pc;
    }

    // Verify the initial values of all the other general regs.
    zx_thread_state_general_regs_t expected_regs{};

    // We don't know what these are, but they're non-zero.
    // The rest are generally zero.
#if defined(__x86_64__)
    expected_regs.rip = regs.rip;
    expected_regs.rsp = regs.rsp;
    expected_regs.rdi = regs.rdi;
    expected_regs.rsi = regs.rsi;
#elif defined(__aarch64__)
    expected_regs.pc = regs.pc;
    expected_regs.sp = regs.sp;
    expected_regs.r[0] = regs.r[0];
    expected_regs.r[1] = regs.r[1];
#endif

    // These values we know with certainty.
    // See arch_setup_uspace_iframe().
#if defined(__x86_64__)

#define X86_FLAGS_IF (1 << 9)
#define X86_FLAGS_IOPL_SHIFT (12)
    expected_regs.rflags = (0 << X86_FLAGS_IOPL_SHIFT) | X86_FLAGS_IF;

#elif defined(__aarch64__)

#define ARM64_CPSR_MASK_SERROR (1UL << 8) 
    // TODO(dje): See TODO in arch_setup_uspace_iframe.
    // cpsr is read as 0x0 but it's set as 0x100;
    expected_regs.cpsr = regs.cpsr & ARM64_CPSR_MASK_SERROR;

#endif

    EXPECT_EQ(memcmp(&regs, &expected_regs, sizeof(regs)), 0);

    if (utest_verbosity_level >= 2) {
        printf("Got:\n");
        hexdump8_ex(&regs, sizeof(regs), 0);
        printf("Expected:\n");
        hexdump8_ex(&expected_regs, sizeof(expected_regs), 0);
    }

    // If this is one of the extra threads, redirect its entry point and
    // set additional registers for the thread to pick up.
    if (num_threads > 1) {
        EXPECT_NE(test_state->inferior_exec_load_addr, 0);
        zx_vaddr_t our_exec_load_addr = get_exec_load_addr();
        zx_vaddr_t raw_thread_func_addr =
            reinterpret_cast<zx_vaddr_t>(&raw_capture_regs_thread_func);
        raw_thread_func_addr -= our_exec_load_addr;
        raw_thread_func_addr += test_state->inferior_exec_load_addr;
#if defined(__x86_64__)
        regs.rdx = regs.rip;
        regs.rip = raw_thread_func_addr;
        regs.rcx = kMagicRegisterValue;
#elif defined(__aarch64__)
        regs.r[2] = regs.pc;
        regs.pc = raw_thread_func_addr;
        regs.r[3] = kMagicRegisterValue;
#endif
    }

    write_inferior_gregs(thread.get(), &regs);

    END_HELPER;
}

// N.B. This runs on the wait-inferior thread.

bool thread_start_test_exception_handler_worker(zx_handle_t inferior, zx_handle_t port,
                                                const zx_port_packet_t* packet,
                                                void* handler_arg) {
    BEGIN_HELPER;

    auto test_state = reinterpret_cast<reg_access_test_state_t*>(handler_arg);

    zx_koid_t pid = tu_get_koid(inferior);

    if (ZX_PKT_IS_SIGNAL_ONE(packet->type)) {
        ASSERT_TRUE(packet->key != pid);
        // Must be a signal on one of the threads.
        // Here we're only expecting TERMINATED.
        ASSERT_TRUE(packet->signal.observed & ZX_THREAD_TERMINATED);
    } else {
        ASSERT_TRUE(ZX_PKT_IS_EXCEPTION(packet->type));

        zx_koid_t tid = packet->exception.tid;

        switch (packet->type) {
        case ZX_EXCP_THREAD_STARTING:
            unittest_printf("wait-inf: thread %lu started\n", tid);
            EXPECT_TRUE(test_thread_start_register_access(test_state, inferior, tid));
            if (!resume_inferior(inferior, port, tid))
                return false;
            break;

        case ZX_EXCP_THREAD_EXITING:
            EXPECT_TRUE(handle_thread_exiting(inferior, port, packet));
            break;

        default: {
            char msg[128];
            snprintf(msg, sizeof(msg), "unexpected packet type: 0x%x", packet->type);
            ASSERT_TRUE(false, msg);
            __UNREACHABLE;
        }
        }
    }

    END_HELPER;
}

// N.B. This runs on the wait-inferior thread.

bool thread_start_test_exception_handler(zx_handle_t inferior,
                                         zx_handle_t port,
                                         const zx_port_packet_t* packet,
                                         void* handler_arg) {
    bool pass = thread_start_test_exception_handler_worker(inferior, port,
                                                           packet, handler_arg);

    // If a test failed detach now so that a thread isn't left waiting in
    // ZX_EXCP_THREAD_STARTING for a response.
    if (!pass) {
        unbind_inferior(inferior);
    }

    return pass;
}

} // namespace

int capture_regs_thread_func(void* arg) {
    auto thread_count_ptr = reinterpret_cast<std::atomic<int>*>(arg);
    atomic_fetch_add(thread_count_ptr, 1);
    unittest_printf("Extra thread started.\n");
    return 0;
}

bool StoppedInThreadStartingRegAccessTest() {
    BEGIN_TEST;

    launchpad_t* lp;
    zx_handle_t inferior, channel;
    if (!setup_inferior(kTestInferiorChildName, &lp, &inferior, &channel))
        return false;

    // Attach to the inferior now because we want to see thread starting
    // exceptions.
    zx_handle_t eport = tu_io_port_create();
    size_t max_threads = 10;
    inferior_data_t* inferior_data = attach_inferior(inferior, eport, max_threads);

    // State we need to maintain across the handling of the various exceptions.
    reg_access_test_state_t test_state{};

    thrd_t wait_inf_thread =
        start_wait_inf_thread(inferior_data, thread_start_test_exception_handler, &test_state);
    EXPECT_NE(eport, ZX_HANDLE_INVALID);

    if (!start_inferior(lp))
        return false;

    // The first test happens here as the main thread starts.
    // This testing is done in |thread_start_test_exception_handler()|.

    // Make sure the program successfully started.
    if (!verify_inferior_running(channel))
        return false;

    EXPECT_TRUE(get_inferior_load_addrs(channel,
                                        &test_state.inferior_libc_load_addr,
                                        &test_state.inferior_exec_load_addr), "");

    // Now that we have the inferior's libc load address we can verify the
    // executable's initial PC value (which is libc's entry point).
    // The inferior executable is us, so we can compute its entry point by
    // adding the offset of the entry point from our load address to the
    // inferior's load address.
    zx_vaddr_t expected_entry_point =
        test_state.inferior_libc_load_addr + get_libc_entry_point();
    EXPECT_EQ(test_state.inferior_libc_entry_point, expected_entry_point, "");

    send_simple_request(channel, RQST_START_LOOPING_THREADS);
    EXPECT_TRUE(recv_simple_response(channel, RESP_THREADS_STARTED), "");

    // The remaining testing happens at this point as threads start.
    // This testing is done in |thread_start_test_exception_handler()|.

    if (!shutdown_inferior(channel, inferior))
        return false;

    // Stop the waiter thread before closing the eport that it's waiting on.
    join_wait_inf_thread(wait_inf_thread);

    detach_inferior(inferior_data, true);

    tu_handle_close(eport);
    tu_handle_close(channel);
    tu_handle_close(inferior);

    END_TEST;
}

BEGIN_TEST_CASE(thread_start_tests)
RUN_TEST(StoppedInThreadStartingRegAccessTest)
END_TEST_CASE(thread_start_tests)
