// Copyright 2016 The Fuchsia Authors
// Copyright (c) 2008-2014 Travis Geiselbrecht
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

/**
 * @defgroup debug  Debug
 * @{
 */

/**
 * @file
 * @brief  Debug console functions.
 */

#include <debug.h>
#include <err.h>
#include <inttypes.h>
#include <kernel/mp.h>
#include <kernel/percpu.h>
#include <kernel/thread.h>
#include <kernel/thread_lock.h>
#include <kernel/timer.h>
#include <platform.h>
#include <stdio.h>
#include <string.h>
#include <vm/vm.h>
#include <zircon/time.h>
#include <zircon/types.h>

#include <lib/console.h>

static int cmd_thread(int argc, const cmd_args* argv, uint32_t flags);
static int cmd_threadstats(int argc, const cmd_args* argv, uint32_t flags);
static int cmd_threadload(int argc, const cmd_args* argv, uint32_t flags);
static int cmd_threadq(int argc, const cmd_args* argv, uint32_t flags);

STATIC_COMMAND_START
#if LK_DEBUGLEVEL > 1
STATIC_COMMAND_MASKED("thread", "manipulate kernel threads", &cmd_thread, CMD_AVAIL_ALWAYS)
#endif
STATIC_COMMAND("threadstats", "thread level statistics", &cmd_threadstats)
STATIC_COMMAND("threadload", "toggle thread load display", &cmd_threadload)
STATIC_COMMAND("threadq", "toggle thread queue display", &cmd_threadq)
STATIC_COMMAND_END(kernel);

#if LK_DEBUGLEVEL > 1
static int cmd_thread(int argc, const cmd_args* argv, uint32_t flags) {

    if (argc < 2) {
    notenoughargs:
        printf("not enough arguments\n");
    usage:
        printf("%s bt <thread pointer or id>\n", argv[0].str);
        printf("%s dump <thread pointer or id>\n", argv[0].str);
        printf("%s list\n", argv[0].str);
        printf("%s list_full\n", argv[0].str);
        return -1;
    }

    if (!strcmp(argv[1].str, "bt")) {
        if (argc < 3) {
            goto notenoughargs;
        }

        thread_t* t = NULL;
        if (is_kernel_address(argv[2].u)) {
            t = (thread_t*)argv[2].u;
        } else {
            t = thread_id_to_thread_slow(argv[2].u);
        }
        if (t) {
            thread_print_backtrace(t);
        }
    } else if (!strcmp(argv[1].str, "dump")) {
        if (argc < 3) {
            goto notenoughargs;
        }

        thread_t* t = NULL;
        if (is_kernel_address(argv[2].u)) {
            t = (thread_t*)argv[2].u;
            dump_thread(t, true);
        } else {
            if (flags & CMD_FLAG_PANIC) {
                dump_thread_user_tid_during_panic(argv[2].u, true);
            } else {
                dump_thread_user_tid(argv[2].u, true);
            }
        }
    } else if (!strcmp(argv[1].str, "list")) {
        printf("thread list:\n");
        if (flags & CMD_FLAG_PANIC) {
            dump_all_threads_during_panic(false);
        } else {
            dump_all_threads(false);
        }
    } else if (!strcmp(argv[1].str, "list_full")) {
        printf("thread list:\n");
        if (flags & CMD_FLAG_PANIC) {
            dump_all_threads_during_panic(true);
        } else {
            dump_all_threads(true);
        }
    } else {
        printf("invalid args\n");
        goto usage;
    }

    // reschedule to let debuglog potentially run
    if (!(flags & CMD_FLAG_PANIC)) {
        thread_reschedule();
    }

    return 0;
}
#endif

static int cmd_threadstats(int argc, const cmd_args* argv, uint32_t flags) {
    for (uint i = 0; i < SMP_MAX_CPUS; i++) {
        if (!mp_is_cpu_active(i)) {
            continue;
        }

        printf("thread stats (cpu %u):\n", i);
        printf("\ttotal idle time: %" PRIi64 "\n", percpu[i].stats.idle_time);
        printf("\ttotal busy time: %" PRIi64 "\n",
               zx_time_sub_duration(current_time(), percpu[i].stats.idle_time));
        printf("\treschedules: %lu\n", percpu[i].stats.reschedules);
        printf("\treschedule_ipis: %lu\n", percpu[i].stats.reschedule_ipis);
        printf("\tcontext_switches: %lu\n", percpu[i].stats.context_switches);
        printf("\tpreempts: %lu\n", percpu[i].stats.preempts);
        printf("\tyields: %lu\n", percpu[i].stats.yields);
        printf("\ttimer interrupts: %lu\n", percpu[i].stats.timer_ints);
        printf("\ttimers: %lu\n", percpu[i].stats.timers);
    }

    return 0;
}

namespace {

class RecurringCallback {
public:
    typedef void (*CallbackFunc)();

    RecurringCallback(CallbackFunc callback)
        : func_(callback) {}

    void Toggle();

private:
    DISALLOW_COPY_ASSIGN_AND_MOVE(RecurringCallback);

    static void CallbackWrapper(timer_t* t, zx_time_t now, void* arg);

    DECLARE_SPINLOCK(SpinLock) lock_;
    timer_t timer_ = TIMER_INITIAL_VALUE(timer_t);
    bool started_ = false;
    CallbackFunc func_ = nullptr;
};

static constexpr TimerSlack kSlack{ZX_MSEC(10), TIMER_SLACK_CENTER};

void RecurringCallback::CallbackWrapper(timer_t* t, zx_time_t now, void* arg) {
    auto cb = static_cast<RecurringCallback*>(arg);
    cb->func_();

    {
        Guard<SpinLock, IrqSave> guard{&cb->lock_};

        if (cb->started_) {
            const Deadline deadline(zx_time_add_duration(now, ZX_SEC(1)), kSlack);
            timer_set(t, deadline, CallbackWrapper, arg);
        }
    }

    // reschedule to give the debuglog a chance to run
    thread_preempt_set_pending();
}

void RecurringCallback::Toggle() {
    Guard<SpinLock, IrqSave> guard{&lock_};

    if (!started_) {
        const Deadline deadline(zx_time_add_duration(current_time(), ZX_SEC(1)), kSlack);
        // start the timer
        timer_set(&timer_, deadline, CallbackWrapper, static_cast<void*>(this));
        started_ = true;
    } else {
        timer_cancel(&timer_);
        started_ = false;
    }
}
}

static int cmd_threadload(int argc, const cmd_args* argv, uint32_t flags) {
    static RecurringCallback cb([]() {
        static struct cpu_stats old_stats[SMP_MAX_CPUS];
        static zx_duration_t last_idle_time[SMP_MAX_CPUS];

        printf("cpu    load"
               " sched (cs ylds pmpts irq_pmpts)"
               "  sysc"
               " ints (hw  tmr tmr_cb)"
               " ipi (rs  gen)\n");
        for (uint i = 0; i < SMP_MAX_CPUS; i++) {
            Guard<spin_lock_t, NoIrqSave> thread_lock_guard{ThreadLock::Get()};

            // dont display time for inactive cpus
            if (!mp_is_cpu_active(i)) {
                continue;
            }

            zx_duration_t idle_time = percpu[i].stats.idle_time;

            // if the cpu is currently idle, add the time since it went idle up until now to the idle counter
            bool is_idle = !!mp_is_cpu_idle(i);
            if (is_idle) {
                zx_duration_t recent_idle_time =
                    zx_time_sub_time(current_time(), percpu[i].idle_thread.last_started_running);
                idle_time = zx_duration_add_duration(idle_time, recent_idle_time);
            }

            zx_duration_t delta_time = zx_duration_sub_duration(idle_time, last_idle_time[i]);
            zx_duration_t busy_time;
            if (ZX_SEC(1) > delta_time) {
                busy_time = zx_duration_sub_duration(ZX_SEC(1), delta_time);
            } else {
                busy_time = 0;
            }
            zx_duration_t busypercent = zx_duration_mul_int64(busy_time, 10000) / ZX_SEC(1);

            printf("%3u"
                   " %3u.%02u%%"
                   " %9lu %4lu %5lu %9lu"
                   " %5lu"
                   " %8lu %4lu %6lu"
                   " %8lu %4lu"
                   "\n",
                   i,
                   static_cast<uint>(busypercent / 100), static_cast<uint>(busypercent % 100),
                   percpu[i].stats.context_switches - old_stats[i].context_switches,
                   percpu[i].stats.yields - old_stats[i].yields,
                   percpu[i].stats.preempts - old_stats[i].preempts,
                   percpu[i].stats.irq_preempts - old_stats[i].irq_preempts,
                   percpu[i].stats.syscalls - old_stats[i].syscalls,
                   percpu[i].stats.interrupts - old_stats[i].interrupts,
                   percpu[i].stats.timer_ints - old_stats[i].timer_ints,
                   percpu[i].stats.timers - old_stats[i].timers,
                   percpu[i].stats.reschedule_ipis - old_stats[i].reschedule_ipis,
                   percpu[i].stats.generic_ipis - old_stats[i].generic_ipis);

            old_stats[i] = percpu[i].stats;
            last_idle_time[i] = idle_time;
        }
    });

    cb.Toggle();

    return 0;
}

static int cmd_threadq(int argc, const cmd_args* argv, uint32_t flags) {
    static RecurringCallback cb([]() {
        for (uint i = 0; i < SMP_MAX_CPUS; i++) {
            Guard<spin_lock_t, NoIrqSave> thread_lock_guard{ThreadLock::Get()};

            // dont display time for inactive cpus
            if (!mp_is_cpu_active(i)) {
                continue;
            }

            const struct percpu* cpu = &percpu[i];

            printf("cpu %2u:", i);
            for (uint p = 0; p < NUM_PRIORITIES; p++) {
                printf(" %2zu", list_length(&cpu->run_queue[p]));
            }
            printf("\n");
        }
    });

    cb.Toggle();

    return 0;
}
